大家有无遇到过这样的情况在窗体中比如有多个按钮.分别是:button1
button2
button3
button4
button5现在我希望给这五个按钮赋值:button1.text=    button2.text=  等等但我不想把1、2、3、4、5写死了,我希望动态赋值比如:
        Dim id As Integer
        For id = 1 To 5
            Dim bu As String
            bu = "button" + id.ToString
            bu.text = "hihi"   '这句语句当然不行的。
        Next请问应该怎样写这段程序呢?

解决方案 »

  1.   


    CallByName()示范   CallByName函数用于执行一个对象的方法,或者设置或返回一个对象的属性。利用它可以轻松实现动画。这里举个字符动画的例子,让大家感受一下此函数的强大功能。要尝试本例,请在窗体上添加一个Label和一个Timer控件。 Option Explicit
    Dim ss As Integer, x As Integer '声明变量Private Sub Form_Load()
      ss = 0 '时间初值
      x = 0 '标签移动初值
      Label1.Left = x '标签Left属性初值(为了一致性)
      Label1.Caption="哈哈哈,Move it!"
      Timer1.Interval = 100
      Timer1.Enabled = True
    End SubPrivate Sub Timer1_Timer()
      ss = ss + 1
      x = x + 30 '标签移动值
      If ss >= 120 Then ss = 0: x = 0 '循环
      CallByName Label1, "Move", VbMethod, x '用CallByName令标签移动
    End Sub
      

  2.   

    CallByName 的用法  Dim obj As Object
      
      Set obj = CallByName(Me, "Command1", VbGet)
      Debug.Print obj.Name
      

  3.   

    老哥,你的表达能力有问题,我看了两遍才明白你的意思,老实说看你的语法你好象学过JAVA吧?要是你用过JAVA应该明白对象这个东西吧?在VB中也有对象这个类,就是Object,你可以声明一个数组类型为object,然后把button1~buttonX装到数组里面,然后你就可以把它当变量来用了。数组的index可以帮你解决这个问题了吧?另外我比较支持cangwu_lee(橙子) 的说法,何必这么麻烦?直接用控件数组不好么?自己就有index。
      

  4.   

    多给你解释一下吧,声明变量时的object类型其实就是一个变量类型的父类,意思就是什么都能装,你把变量理解为一个容器就好理解了。我给出的方法就是直接把button装到object类型的变量中去,然后随便你怎么调用。其实object类不是用在你这种地方的,我一般用它来传递一些一般类型不能传递的东西,其中就有控件。你这种地方还是用控件数组比较好。至于CallByName估计是cangwu_lee(橙子)也没明白你的意思,或许是我没明白cangwu_lee(橙子)的意思^^
      

  5.   

    控件数组和一般的变量数组用法上是差不多的,需要注意的是控件数组只能是一维的。然后就是你不能用redim来改变控件数组的元素大小要动态增加一个控件数组中的一个元素你需要用load命令。控件数组的创建非常简单,你看控件的属性窗口,其中有一个属性叫index,当你的控件不是控件数组时,这个值是none,注意是none而不是0,当这个属性的值从none改变为任何一个大于-1的正整数时他便是一个控件数组了,好那么当你表示一个text控件时你要写"text1"而当你要表示一个控件数组时你要写"text1(index)"index是控件数组的元素数。另外需要注意的是,同一个控件数组的所有元素共享一个控件的事件,也就是说没有Text1(0)_Change()、Text1(1)_Change()等事件,统一一个Text1_Change事件。你可以用index的值来判断是哪个元素触发的事件。
      

  6.   

    感谢,非常感谢luxu365() 朋友非常详细的解析。我正在努力学习