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 theIXMLHTTPRequest
andIServerXMLHTTPRequest
components 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.