异步下载与把比萨饼送到您家的过程相似。首先打电话到比萨饼店订购。然后,当其他人做比萨饼时,您可以做自己的事情。比萨饼做好时,送货人敲门通知晚餐已到。
对于 UserDocument,与打电话相当的是 AsyncRead 方法。而 AsyncReadComplete 事件与送货人敲门是相当的。如果以更简单的方案为例:载入文本文件到TextBox 控件,可能更容易理解一些。
要异步载入 Picture 对象到 PictureBox 控件中,请按照以下步骤执行:
Private Sub UserDocument_InitProperties() Dim strPath As String '
文件路径'
如果希望的话,把路径改变到另一个文本文件。'
如果是在intranet
上,则还可以把路径'
设置到另一个计算机上,'
在该计算机上,您有访问权限。strPath = "c:\Windows\Readme.txt"
'
现在,调用AsyncRead
方法。把类型设置为' vbAsyncTypeFile
(一个文件),把属性'
的名称设置为Pizza
。UserDocument.AsyncRead strPath, _
vbAsyncTypeFile, "Pizza"
End Sub
Private Sub UserDocument AsyncReadComplete _ (AsyncProp As VB.AsyncProperty) Dim FileNum as Long '
用Select Case
语句确定发送的是哪个属性。Select Case AsyncProp.PropertyName
Case "Pizza"
'
打开文件并把内容'
写入TextBox
中FileNum = FreeFile
Open AsyncProp.Value For Input As FileNum
Text1.Text = Input(LOF(FileNum), FileNum)
Close Filenum
End Select
End Sub
将分发比萨饼的例子再向前走一步,设想有一个比萨饼必须在 30 分钟内被分发完否则它就将是免费的规定。在这种情况下比萨饼分发人的进度就会引起人们的兴趣。可以通过向 AsyncReadProgress 事件程序中加入代码来检查“pizza”的进程:
Private Sub UserDocument AsyncReadProgress _ (AsyncProp As VB.AsyncProperty) '
使用Select Case
语句来读StatusCode
Select Case AsynchProp.StatusCode
Case vbAsynchStatusCodeSendingRequest
MsgBox "Attempting to connect"
Case vbAsynchStatusCodeEndDownloadData
MsgBox "Download complete"
Case vbAsynchStatusCodeError
MsgBox "Error – aborting transfer"
CancelAsynchRead "Pizza"
End Select
End Sub
现在,当运行工程时,AsyncReadProgress 事件中的代码会显示两个消息框:首先,当有一个连接文件的尝试,并且传输已经结束后,如果在 Select Case 语句中设置一个断点并跟踪调试代码,就会发现 vbAsynchStatusEndDownloadData 状态代码会在 AsyncReadProgress 事件被触发前被返回。这是一个取消或重定向文件(与当“Pizza”到达时拒绝开门相类似)的最后的机会。
如果在传输期间有一个错误发生(例如,失去网络连接),vbAsyncStatusCodeError 状态代码就会被返回,这样可以允许调用 CancelAsyncRead 方法来取消传输或避免运行时的错误。
要想看由 AsyncReadProgress 事件返回的可能状态代码的列表,查看对象浏览器中的 AsyncStatusCodeConstants。
详细信息 关于 AsyncRead 方法和 AsyncReadComplete 和AsyncReadProgress 事件的详细信息,请参阅“建立 ActiveX 控件”中的“在控件中添加 Internet 功能”。虽然该主题包括了 UserControl 对象,但机制是一样的。