'定义一个对象
Private MyCmd As ObjectPrivate Form_Load()
   Set MyCmd = Controls.Add("VB.Commandbutton", "cmdTest")
   MyCmd.Caption = "这是动态按钮"
   MyCmd.Top = 600
   MyCmd.Visible = True
end sub'上面由 MyCmd 引用其所有属性均正常,但却无法如下引用其事件:
Sub MyCmd_Click()
    MyCmd.Caption = "OK!,很好!"
End Sub'正确的方法我知道,须这样定义:
Private WithEvents cmdObject As CommandButton
'才能如此引用其事件:
Private Sub cmdObject_Click()
   MsgBox "哈,成功引用事件了!"
End Sub'我想知道这里的蹊跷!

解决方案 »

  1.   

    说说个人想法:
    不加WithEvents的话就相当于定义了一个普通对象(例如FileSystemObject),自然不会响应任何事件。加上WithEvents表明该控件可以接受键盘、鼠标事件等等
    当然,我的想法非常肤浅,还是等专家来讲课!!
      

  2.   

    不行,你的方法并不能成功地接收事件,这个问题我也看了很多的资料,但是没有一个是成功的。我的系统是VB6(en)+WinXP
      

  3.   

    你再试一试下面的代码:
    dim WithEvents MyCmd As ObjectPrivate Form_Load()
       Set MyCmd = Controls.Add("VB.Commandbutton", "cmdTest")
       MyCmd.Caption = "这是动态按钮"
       MyCmd.Top = 600
       MyCmd.Visible = True
    end sub'上面由 MyCmd 引用其所有属性均正常,但却无法如下引用其事件:
    Sub MyCmd_Click()
        MyCmd.Caption = "OK!,很好!"
    End Sub'正确的方法我知道,须这样定义:
    Private WithEvents cmdObject As CommandButton
    '才能如此引用其事件:
    Private Sub cmdObject_Click()
       MsgBox "哈,成功引用事件了!"
    End Sub
      

  4.   

    如何动态新增控制项?VB 从 6.0 版开始,已经可以允许我们使用 Controls Collection 的 Add Method 在程序执行时动态新增控制项!今天这个单元就是要告诉大家如何动态新增 VB 预设的控制项或是 ActiveX 控制项。在以下的范例中,我们会在程序执行时动态新增二个预设的控制项及一个 ActiveX 控制项,也会告诉大家如何处理动态新增控制项的事件!如果您新增的控制项,在项目的【设定使用元件】、【设定引用项目】中没有声明的话,您还必须先将这个控制项的 License Key 加到 License Collection 中!(注一)如果您要使用这个新增控制项的属性时,您必须使用物件的关键字来存取这个控制项的属性。如果您不使用物件的关键字的话,您会得到一个错误代码为 438 的错误讯息如下:"Object doesn't support this property or method." (物件不支援这个属性或方法)
    当您在声明区中使用 VBControlExtender object 及 WithEvents 来新增 ActiveX 控制项时,您必须使用 ObjectEvent method 来处理所有这个控制项的事件。如果您声明一个预设的控制项事件,您将会得到您声明的这个物件类别的所有标准事件,如何得知呢?加入以下的声明,然后在程序码视窗的控制项 Combo 中,找到您声明的这个控制项变数,然后点选事件 Combo,您就会看到了!Dim WithEvents cmdMyCommand as VB.CommandButton以下是我们的范例:1、建立一个标准的新项目,预设会产生 Form1,不必加入任何控制项。2、在 Form1 中加入以下的程序码:Option Explicit
    ' 在程序执行时要动态新增 ActiveX 控制项,而这个新增的控制项,
    ' 在项目的【设定使用元件】、【设定引用项目】中没有声明的话,
    ' 您必须将它声明成 VBControlExtender
    Dim WithEvents ctlDynamic As VBControlExtender
    Dim WithEvents ctlText As VB.TextBox
    Dim WithEvents ctlCommand As VB.CommandButtonPrivate Sub ctlCommand_Click()
    ctlText.Text = "You Clicked the Command button"
    End SubPrivate Sub ctlDynamic_ObjectEvent(Info As EventInfo)
    ' 测试 TreeView 的 Click 事件
    If Info.Name = "Click" Then
    ctlText.Text = "You clicked " & ctlDynamic.object.selecteditem.Text
    End If
    End SubPrivate Sub Form_Load()
    Dim i As Integer' 将 TreeView 的 License Key 加到 License Collection 中。
    ' 但是,如果这个 License Key 已经存在 License Collection 中,
    ' 您会得到一个编号 732 的执行期错误讯息。
    Licenses.Add "MSComctlLib.TreeCtrl"' 动态新增 TreeView 控制项到 Form 中,如果您想将这个控制项
    ' 加到 Form 以外的 Container 中,例如 Frame 或 Picture,那么,
    ' 在 Controls.Add 的第三个参数必须修改成 Container 的名称。
    Set ctlDynamic = Controls.Add("MSComctlLib.TreeCtrl", "myctl", Form1)' 设定 TreeView 控制项的位置及大小
    ctlDynamic.Move 1, 1, 2500, 3500' 新增 TreeView 控制项的 nodes
    For i = 1 To 10
    ctlDynamic.object.nodes.Add Key:="Test" & Str(i), Text:="Test" & Str(i)
    ctlDynamic.object.nodes.Add Relative:="Test" & Str(i), _
    Relationship:=4, Text:="TestChild" & Str(i)
    Next i' 设定 TreeView 控制项的 Visible 属性为 True
    ctlDynamic.Visible = True' 动态新增 TextBox 控制项
    Set ctlText = Controls.Add("VB.TextBox", "ctlText1", Form1)' 设定 TextBox 控制项的位置及大小
    ctlText.Move (ctlDynamic.Left + ctlDynamic.Width + 50), 1, 2500, 100' 设定 TextBox 控制项的 backcolor 属性
    ctlText.BackColor = vbYellow' 设定 TextBox 控制项的 Visible 属性为 True
    ctlText.Visible = True' 动态新增 CommandButton 控制项
    Set ctlCommand = Controls.Add("VB.CommandButton", "ctlCommand1", Form1)' 设定 CommandButton 控制项的位置及大小
    ctlCommand.Move (ctlDynamic.Left + ctlDynamic.Width + 50), _
    ctlText.Height + 50, 1500, 500' 设定 CommandButton 控制项的标题
    ctlCommand.Caption = "Click Me"' 设定 CommandButton 控制项的 Visible 属性为 True
    ctlCommand.Visible = True
    End Sub3、您现在可以执行看看了!按一下 CommandButton 或是 TreeView 的不同 Node,看看 TextBox 中出现什么!注一:如果您想知道多一点关于 License Collection 的资料,您可以到以下这个网址看看:http://support.microsoft.com/support/kb/articles/Q188/5/77.ASP它的主题是:HOWTO: What is the Licenses Collection Used For? (Licenses Collection 要做什么用 ?)