如何在VB6.0里动态使用具有事件的对象(再来一篇)
作者:admin 日期:2009-09-26
其实这是第三次写相同的效果的实现方式了......但这次这个是最简单的.....
前两次见: article.asp?id=207
这次的方法,其实是以前在CSDN经人提醒一下,才恍然大悟的--------直接在VB里定义好不就行了么?还搞那么复杂.
具体如下:
点击Commnad2是注册组件(DLL需要放在系统目录或当前目录),然后就可以使用了.
工程打包下载:
点击下载此文件
前两次见: article.asp?id=207
这次的方法,其实是以前在CSDN经人提醒一下,才恍然大悟的--------直接在VB里定义好不就行了么?还搞那么复杂.
具体如下:
复制内容到剪贴板
程序代码

'DLL内cTest内代码
Option Explicit
'动态使用具有事件的对象
'
'BY 嗷嗷叫的老马
'http://www.m5home.com
Public Event KK()
Public Function getEvent()
RaiseEvent KK
End Function
Option Explicit
'动态使用具有事件的对象
'
'BY 嗷嗷叫的老马
'http://www.m5home.com
Public Event KK()
Public Function getEvent()
RaiseEvent KK
End Function
复制内容到剪贴板
程序代码

'EXE内代码.需要两个CommandButton.
Option Explicit
'动态使用具有事件的对象
'
'BY 嗷嗷叫的老马
'http://www.m5home.com
Private Declare Sub Sleep Lib "kernel32.dll" ( _
ByVal dwMilliseconds As Long)
Dim WithEvents A As cTest
Private Sub Form_Load()
On Error Resume Next
Set A = CreateObject("pTest.cTest")
If A Is Nothing Then
MsgBox "对象初始化失败!", vbOKOnly or vbInformation
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set A = Nothing
End Sub
Private Sub Command1_Click()
Call A.getEvent
End Sub
Private Sub Command2_Click()
Shell "regsvr32 pTest.dll"
Sleep 1000
Call Form_Load
End Sub
Private Sub A_KK()
MsgBox "事件触发测试!", vbOKOnly or vbInformation
End Sub
Option Explicit
'动态使用具有事件的对象
'
'BY 嗷嗷叫的老马
'http://www.m5home.com
Private Declare Sub Sleep Lib "kernel32.dll" ( _
ByVal dwMilliseconds As Long)
Dim WithEvents A As cTest
Private Sub Form_Load()
On Error Resume Next
Set A = CreateObject("pTest.cTest")
If A Is Nothing Then
MsgBox "对象初始化失败!", vbOKOnly or vbInformation
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set A = Nothing
End Sub
Private Sub Command1_Click()
Call A.getEvent
End Sub
Private Sub Command2_Click()
Shell "regsvr32 pTest.dll"
Sleep 1000
Call Form_Load
End Sub
Private Sub A_KK()
MsgBox "事件触发测试!", vbOKOnly or vbInformation
End Sub
点击Commnad2是注册组件(DLL需要放在系统目录或当前目录),然后就可以使用了.
工程打包下载:
点击下载此文件
评论: 7 | 引用: 0 | 查看次数: 1382



现在的问题是,不能引用pTest.cTest,那要如何触发cTest中的事件呢
为什么不能引用?
接口在目标组件内的实现代码完成前就可以完成的啊.
如果实在是不想引用,那就使用TLB来声明接口-----------------还是需要一个接口的!
具体文章见我提到的前两篇.


现在的问题是,不能引用pTest.cTest,那要如何触发cTest中的事件呢



不行吧,A是支持事件的对象,而CreateObject("pTest.cTest") 不是支持事件的对象,二者不能绑定啊。而且事件不能继承
A的定义必须是在引用了pTest.cTest之后完成的.
然后在最终客户机器上运行时,CreateObject("pTest.cTest")用于从已注册的组件中创建同样类型的对象并赋值.
如果这两个对象不相同,肯定是不行的.


不行吧,A是支持事件的对象,而CreateObject("pTest.cTest") 不是支持事件的对象,二者不能绑定啊。而且事件不能继承


不引用不行.
不过引用了也没啥问题啊.
编译后接口已经被编译了,只要还未使用对象,则即使对象所在的组件并不存在,也不会出错.
所以我代码里利用这一点来判断组件是否正常.
不过引用了也没啥问题啊.
编译后接口已经被编译了,只要还未使用对象,则即使对象所在的组件并不存在,也不会出错.
所以我代码里利用这一点来判断组件是否正常.


如果不引用pTest呢?就这能这样定义Dim WithEvents A As cTest
如果用"动态引用"createObject,如果像博主那样需要使用到事件,恐怕就不行了吧(没试过,不知道声明为withEvents后,再动态引用,同时写上相应的事件处理代码,会不会触发事件)
Dim WithEvents objExt As VBControlExtender ' 使用 WithEvents 声明 VBControlExtender 变量
Private Sub LoadControl()
Licenses.Add "Project1.Control1", "ewrinvcmcoe"
Set objExt = Controls.Add("Project1.Control1", "myCtl")
objExt.Visible = True ' 该控件在缺省情况下为不可见的。
End Sub
Private Sub extObj_ObjectEvent(Info As EventInfo)
' 使用 Select Case 语句编写控件的事件处理程序。
Select Case Info.Name
Case "Click"
' 在此处处理 Click 事件。
' 在这里处理其他情况
Case Else ' 未知事件
' 在此处理各种未知的事件。
End Select
End Sub
//
以上是MSDN中的示例,之前一直不知道.....
你可以用用.