Ask Learn
Preview
Please sign in to use this experience.
Sign inThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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.
Use a timer control to poll the readyState
property. When the value of the readyState
property indicates that the data is ready, turn the timer off.
Use a DomDocument
object to load the XML and handle the state using the WithEvents
keyword.
Note
If you are using the IXMLHTTPRequest
and IServerXMLHTTPRequest
components to first post your XML data to a Web server, this option will not work for you.
Create a wrapper class, and create a procedure to handle the event within the class module. Set the procedure to the default, and bind the class to the 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.
Open Microsoft® Visual Basic® 6.0. In the New Project dialog box, double-click Standard EXE.
On the Project menu, click References.
In the Available References list, select Microsoft XML,v6.0, and then click OK.
Add four command buttons to Form1 and set the caption of each button as follows:
Control | Caption |
---|---|
Command1 | Fail |
Command2 | Polling using Timer |
Command3 | Using Class Wrapper |
Command4 | Using DOMDocument |
Add a timer control to Form1.
Copy and paste the following code into Form1.
Option Explicit
Public XMLHttpRequest As MSXML2.XMLHTTP60
Public WithEvents XMLDom As MSXML2.DOMDocument30
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.XMLHTTP60
' Assign the wrapper class object to onreadystatechange.
XMLHttpRequest.OnReadyStateChange = FunctionReadyStateChange
' Get some stuff asynchronously.
XMLHttpRequest.open "GET", "https://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.XMLHTTP60
' Get some stuff asynchronously.
XMLHttpRequest.open "GET", "https://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.XMLHTTP60
' 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", "https://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.DOMDocument30
XMLDom.async = True
XMLDom.Load "https://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
From the Project menu, click Add Class Module.
Change the name of the new class module from "Class1" to "MyReadyStateHandler"
Paste the following code into the class module:
Option Explicit
Sub OnReadyStateChange()
Debug.Print Form1.XMLHttpRequest.readyState
If Form1.XMLHttpRequest.readyState = 4 Then
MsgBox "Done"
End If
End Sub
In the sample code added in the previous step, highlight the procedure name "OnReadyStateChange" by selecting it in the Code window.
From the Tools menu, click Procedure Attributes.
In the Procedure Attributes dialog, the Name combo box should show "OnReadyStateChange."
Click Advanced.
In Procedure ID, select "(Default)" from the available options.
Click OK.
Save the class module (MyReadyStateHandler.cls) to file.
Open Notepad and paste the following XML into it
<?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>
Save the file as test.xml to your IIS localhost directory. For example, this folder might be C:\Inetpub\wwwroot for a typical default installation of IIS with Windows 2000.
In Visual Basic, from the Run menu, click Start to run the application.
Try the following command options to observe the different approaches to using the onreadystatechange
event within Visual Basic.
To force a ready state failure, click Fail.
To view the polling resolution, click Polling using Timer.
To view the wrapper class solution, click Using Class Wrapper.
To view the DOMDocument
approach, click Using DomDocument.
For each of the code paths in the previous step, you can place brake-points at various places to step through the code.
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.
Please sign in to use this experience.
Sign in