我一次能生成这样的button 5个 10个 甚至100个,难道为每个button都写吗?能不能用类?或者其他方法?

解决方案 »

  1.   

    对,就是控件数组,里面有index表示每个button的
      

  2.   

    这样,你不就可以.....:
    Private Sub Command1_MouseDown(Index As Integer, Button, x ...(后面的我就不说了)
      If Button = 2 Then UnLoad Command1(Index)
    End Sub
      

  3.   

    大家说让我用控件数组,这种方法行不通!!!!现在才到最关键的部分!我在程序运行过程中能随意创建控件,但是却不能创建控件数组下面是msdn的原话,我也做过验证,控件数组无法创建。****************************************************
    为何使用控件数组
    在设计时,使用控件数组添加控件所消耗的资源比直接向窗体添加多个相同类型的控件消耗的资源要少。当希望若干控件共享代码时,控件数组也很有用。例如,如果创建了一个包含三个选项按钮的控件数组,则无论单击哪个按钮时都将执行相同的代码。若要在运行时创建一个控件的新实例,则新控件必须是控件数组的成员。使用控件数组时,每个新成员继承数组的公共事件过程。使用控件数组机制是不可能在运行时创建新控件的,因为每个新控件都继承为数组编写好的事件过程。例如,如果窗体上有若干文本框,而且每个文本框都接受一个日期数值,则可创建一个控件数组,使所有文本框共享同一个合法性检查代码。
    *************************************************如果我通过cmdObject.index=i-1
    将会出现错误 只读属性无法更改!我建议大家动手试一试,此问题对于实现动态程序结构很有用处!该程序完成后,无论是结构还是界面都跟数据库提供的数据相关!这还不够有用吗?有人建议通过类的继承和实例来完成,我对于这些实在不拿手!希望大家共同讨论!
      

  4.   

    解决的办法之一是,你需要在设计时创建一个按钮,并把该按钮的index设置为0。然后在运行时,用Load cmdButton(index)  index从1开始。
    因为在设计时有了这个控件,所以可以创建该控件的事件过程。你可以用楼上的说法写代码了。别的办法,以后再说。(其实动态创建过程也是可以的)
      

  5.   

    如果你不想在设计时创建控件数组,你还有一个不需要api的办法。只是有点“笨”:
    就按照你上面的程序来说吧。实际上,你这段程序,如果你在cmdObject_Click事件过程中写代码的话,你只能在按cmdOne5的时候,能引发这个过程。因为在你创建的循环中,最后一个set语句,把cmdObject指向了这个按钮,因此只有你按了这个按钮才能引发这个事件过程。看到这里你应该能明白我说的笨办法了:
    你只需要声明5个(你的例子中产生了5个)类似cmdObject的对象,然后为每一个cmdObject编写cmdObject_Click事件过程。
      

  6.   

    这是一个测试过的例子。Option Explicit
    Private WithEvents cmdObject As CommandButton
    Private WithEvents cmdObject2 As CommandButton
    Private WithEvents cmdObject3 As CommandButton
    Private WithEvents cmdObject4 As CommandButton
    Private WithEvents cmdObject5 As CommandButtonPrivate Sub cmdObject_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) common_click Button, 1
    End SubPrivate Sub cmdObject2_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) common_click Button, 2
    End SubPrivate Sub cmdObject3_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) common_click Button, 3
    End SubPrivate Sub cmdObject4_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) common_click Button, 4
    End SubPrivate Sub cmdObject5_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) common_click Button, 5
    End SubPrivate Sub common_click(ByVal btn As Integer, ByVal index As Integer)
      If btn = vbRightButton Then
        Form1.Controls.Remove "cmdOne" & index
      End IfEnd Sub
    Private Sub form_load()
    Dim i As Integer
    For i = 1 To 5
    Set cmdObject = Form1.Controls.Add("vb.commandbutton", "cmdOne" & i)
    cmdObject.Top = i * 500
    cmdObject.Visible = True
    cmdObject.Caption = cmdObject.Name
    Next i
    Set cmdObject = Form1.Controls("cmdOne1")
    Set cmdObject2 = Form1.Controls("cmdOne2")
    Set cmdObject3 = Form1.Controls("cmdOne3")
    Set cmdObject4 = Form1.Controls("cmdOne4")
    Set cmdObject5 = Form1.Controls("cmdOne5")
    End Sub
      

  7.   

    最简单的办法还是在设计时创建一个按钮,并把index属性设置为0。当然你可以让这个按钮不显示,直到你需要的时候再显示出来。这样你可以在设计时编写这个控件数组的事件过程代码。所有在这个数组中的控件共享这段代码。如果你不愿意这样(其实没什么道理不这样),你就只好用API。不过,API实现起来还是比较麻烦的。今天先说这么多。