This topic discusses the implementation details necessary to use onreadystatechange notification in Microsoft Visual Basic applications.
The onreadystatechange callback function was not implemented as a COM automation event in the IXMLHTTPRequest and IServerXMLHTTPRequest components. This is because these components are heavily used in scripting environments, many of which do not support COM events. The onreadystatechange callback function was intended to be easy to use when working with scripting clients such as VBScript and JScript.
Because the onreadystatechange property was not implemented through COM-based automation events, Visual Basic (and C/C++) applications need to implement this callback functionality differently.
In Visual Basic, you can use any of the following approaches to design applications that support onreadystatechange events.
readyState property. When the value of the readyState property indicates that the data is ready, turn the timer off.DomDocument object to load the XML and handle the state using the WithEvents keyword.
Note If you are using theIXMLHTTPRequestandIServerXMLHTTPRequestcomponents to first post your XML data to a Web server, this option will not work for you.
onreadystatechange event to either the IXMLHTTPRequest or IServerXMLHTTPRequest component, depending on which component you are using with your application.The following sample application demonstrates each of these three approaches.
To use OnReadyStateChange in a Visual Basic application
| Control | Caption |
|---|---|
| Command1 | Fail |
| Command2 | Polling using Timer |
| Command3 | Using Class Wrapper |
| Command4 | Using DOMDocument |
Option Explicit
Public XMLHttpRequest As MSXML2.XMLHTTP50
Public WithEvents XMLDom As MSXML2.DOMDocument50
Private Function FunctionReadyStateChange()
Debug.Print XMLHttpRequest.readyState
End Function
Private Sub Command1_Click()
FailedOnReadyState
End Sub
Private Sub Command2_Click()
TimerResolution
End Sub
Private Sub Command3_Click()
ClassResolution
End Sub
Private Sub Command4_Click()
DOMResolution
End Sub
Private Sub FailedOnReadyState()
On Error GoTo FailedState
If Not XMLHttpRequest Is Nothing Then Set XMLHttpRequest = Nothing
Set XMLHttpRequest = New MSXML2.XMLHTTP50
' Assign the wrapper class object to onreadystatechange.
XMLHttpRequest.OnReadyStateChange = FunctionReadyStateChange
' Get some stuff asynchronously.
XMLHttpRequest.open "GET", "http://localhost/test.xml", True
XMLHttpRequest.send
Exit Sub
FailedState:
MsgBox Err.Number & ": " & Err.Description
End Sub
Private Sub TimerResolution()
If Not XMLHttpRequest Is Nothing Then Set XMLHttpRequest = Nothing
Timer1.Interval = 1
Set XMLHttpRequest = New MSXML2.XMLHTTP50
' Get some stuff asynchronously.
XMLHttpRequest.open "GET", "http://localhost/test.xml", True
XMLHttpRequest.send
End Sub
Private Sub ClassResolution()
If Not XMLHttpRequest Is Nothing Then Set XMLHttpRequest = Nothing
Dim MyOnReadyStateWrapper As MyReadyStateHandler
Set XMLHttpRequest = New MSXML2.XMLHTTP50
' Create an instance of the wrapper class.
Set MyOnReadyStateWrapper = New MyReadyStateHandler
' Assign the wrapper class object to onreadystatechange.
XMLHttpRequest.OnReadyStateChange = MyOnReadyStateWrapper
' Get some stuff asynchronously.
XMLHttpRequest.open "GET", "http://localhost/test.xml", True
XMLHttpRequest.send
End Sub
Private Sub DOMResolution()
If Not XMLHttpRequest Is Nothing Then Set XMLHttpRequest = Nothing
If Not XMLDom Is Nothing Then Set XMLDom = Nothing
Set XMLDom = New MSXML2.DOMDocument50
XMLDom.async = True
XMLDom.Load "http://localhost/test.xml"
End Sub
Private Sub Timer1_Timer()
Debug.Print XMLHttpRequest.readyState
If XMLHttpRequest.readyState = 4 Then
MsgBox "Done"
Timer1.Interval = 0
End If
End Sub
Private Sub XMLDom_onreadystatechange()
Debug.Print XMLDom.readyState
If XMLDom.readyState = 4 Then
MsgBox "Done"
End If
End Sub
Option Explicit
Sub OnReadyStateChange()
Debug.Print Form1.XMLHttpRequest.readyState
If Form1.XMLHttpRequest.readyState = 4 Then
MsgBox "Done"
End If
End Sub
In the Procedure Attributes dialog, the Name combo box should show "OnReadyStateChange."
<?xml version="1.0"?> <Root> <Testing>This is to test the onreadystatechange event on the XMLHTTPRequest or DOMDocument</Testing> <Testing>This is due to the event not being declared in the type library</Testing> </Root>
onreadystatechange event within Visual Basic.
DOMDocument approach, click Using DomDocument.For step 19a, the following error message should appear indicating the failure:
424: Object required
For steps 19b, 19c and 19d, return values for onreadystatechange should appear in the Visual Basic debug window while the document loads. When the document completes loading, a message box saying "Done" should appear.