我把几个图标放在一个画面中一起做成一个控件,但对图标的click事件想放到前台来写,因此在该控件中写了几个事件,分别对应这些图标的click事件,好了,现在该控件完成了。前台调用时:如果直接把该控件拖到Form上调用,当然没有问题。但是,如果我用controls.Add方法来动态创建该控件的话,不知道怎么写该控件上的图标对应的click事件了,有办法吗?

解决方案 »

  1.   

    参考:http://blog.csdn.net/myhgyp/archive/2005/01/13/252309.aspx
      

  2.   

    我是想让控件的事件代码可以在创建该控件时才写,而不是在直接控件中写。
    ======================
    用ScriptControl。
      

  3.   

    从天狼的网站上找到一个类似的(动态生成控件),可惜好象有点不对劲。1: Form1的代码
    Private Sub Command1_Click()
      Unload Me
    End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
      ReleaseCapture
      SendMessage Me.hwnd, 161, 2, 0
    End SubPrivate Sub Timer1_Timer()
    'On Error Resume Next
      Dim i As Integer, l As Long
      l = -320
      For i = 1 To 10
        Form1.Controls.Add "VB.CommandButton", "cmdObj" & i
        
        With Form1.Controls("cmdobj" & i & "")
          .Visible = True
          .Width = 320
          
           .Left = l + 320
            
          .Height = 320
          .Caption = i
          l = l + 320
          .TabStop = False
        End With
      Next i
      VBControlExtender = cmdobj1
      Timer1.Enabled = False
    End SubPrivate Sub cmdobj1_click()
      VBControlExtender
      MsgBox "sdlfkj"
    End Sub2: Module1的代码
    Public Declare Function ReleaseCapture Lib "user32" () As Long
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long如果能正常让下面一段代码正常工作就达到我的要求了,可惜这一段代码怎么就执行不到呢。
    Private Sub cmdobj1_click()
      VBControlExtender
      MsgBox "sdlfkj"
    End Sub
      

  4.   

    你的代码好象不全啊,参考:
    http://blog.csdn.net/TechnoFantasy/archive/2001/04/28/2957.aspx
      

  5.   

    此控件我已经更新,你重新下载一下吧!VB资料->查询“动态生成控件”;====================
    免费的学习交流网站,欢迎大家访问!
    http://www.j2soft.cn/
      

  6.   

    cuizm(射天狼 http://www.j2soft.cn/)的代码可以了,不过不是自定义控件。
    rainstormmaster(暴风雨 v2.0) 的代码看不全,只能调出生成控件,还是不能响应事件。我的代码如下,各位高手再看看:Option Explicit
    Dim WithEvents ctlDynamic As VBControlExtender
    'Dim WithEvents ctlDynamic As VB.CommandButtonPrivate Sub Form_Load()
            Dim i As Integer
            Licenses.Add "ctrMarcoERP.cmBom"
            Set ctlDynamic = Controls.Add("ctrMarcoERP.cmBom", "myCtr", Me)
    '        Set ctlDynamic = Controls.Add("VB.CommandButton", "myCtr", Me)
            ctlDynamic.Move 1, 1, 1000, 1000
            ctlDynamic.Visible = True
    End Sub' 本来我的控件中有好几个自定义事件,这是其中之一,无法响应
    Private Sub ctlDynamic_clickBom()
        MsgBox "bom"
    End Sub
    '对VB.CommandButton可以响应此事件,但我想让它响应我的自定义事件
    Private Sub ctlDynamic_click()
        MsgBox "bom"
    End Sub
      

  7.   

    我的想法是:
      一个自定义控件,内含N个图标,对每一个图标定义一个自定义click事件,在前台分别实现这些事件。如果不用动态创建的话已经没有问题了。
    但我想万一这些图标要改得更漂亮一些时,只需重新编绎此控件,前台代码不需改动,所以想用动态创建。 当然如果能达到此效果,其它方法也可以。
      

  8.   

    在你自定义的控件代码中,使用以下格式来定义自定义控件新的事件:
    Public Event 事件名称(事件参数)
    例如:
    Public Event HookMessage(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long)然后在你自定义的控件代码中需要让该事件发生的地方写上:
    RaiseEvent 事件名称(参数值)
    例如:
    RaiseEvent HookMessage(hWnd, Msg, wParam, lParam)
      

  9.   

    用COM+的事件类,也就的在自已的类中实现事件对象,使用时就可以以“订阅”的方式调用了。具体的请参考COM+方面的书
      

  10.   

    修改如下:
    Option Explicit
    Dim WithEvents ctlDynamic As VBControlExtender
    'Dim WithEvents ctlDynamic As VB.CommandButtonPrivate Sub Form_Load()
    Dim i As Integer
    Licenses.Add "ctrMarcoERP.cmBom"
    Set ctlDynamic = Controls.Add("ctrMarcoERP.cmBom", "myCtr", Me)
    ' Set ctlDynamic = Controls.Add("VB.CommandButton", "myCtr", Me)
    ctlDynamic.Move 1, 1, 1000, 1000
    ctlDynamic.Visible = True
    End SubPrivate Sub ctlDynamic_ObjectEvent(Info As EventInfo)
        Select Case Info.Name
        Case "clickBom"
            MsgBox "clickBom"   
        End Select
            
    End Sub
      

  11.   

    成功了,感谢各位,特别感谢 rainstormmaster(暴风雨 v2.0)