VB Controls(index) 控件集合 index取值规则?

shanjiapeipei 2011-12-14 06:00:43
VB Controls(index) 控件集合 index取值规则?
比如说,在一个窗体上添加了很多种控件,那么每个控件都应该分配一个index值,比如controls(1)代表Command1,controls(2)代表textbox1 ,control(3)代表Command2等等,那么vb是按照什么规则给这些控件分配index值的呢?
我自己试了一下,大概和控件的添加顺序、控件的类型有关,但具体是什么规则不太清楚。
有知道的高手,给解答一下。
...全文
566 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2011-12-15
  • 打赏
  • 举报
回复
集合成员的次序通常就是假如集合的次序,你可以用记事本打开 Form1.frm 文件,参考一下 Begin VB.Form Form1 到 End 之间的定义次序。

不过这不是你需要关心的,Controls(index) 只不过是提供了一种按序号遍历集合的方法,不要预期哪个 Index 和哪个控件关联。
chinaboyzyq 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 MSDN:]
Controls集合

一个集合,其元素代表部件中的控件。 Controls集合的Count属性用于表明集合中的控件数量,而其Item方法则返回集合中的一个成员。

语法

object.Controls.Count

object.Controls(index)

Controls 集合的语法包括下述部分:

部分 描述
Object 一个对象表达式,其值为“应用于”列表中的对象。
Index 一个整数,范围从0到Controls.Count – 1。


注意 如果部件是一个Visual Basic模块,如Form或UserControl,则在模块中编写代码时不必使用该对象表达式。然而,如果容器是一个编译后的ActiveX控件,如ToolBar控件,则必须使用该对象表达式。

说明

Controls集合枚举部件中装入的控件,可用于对这些控件的遍历。例如,可以用来改变一个Form中所有Label控件的BackColor属性。

Controls集合标识了一个内在的名为Controls的窗体级变量。如果省略了可选的object 占位符,则必须包括Controls关键字。不过,如果包括了object,则可以省略Controls关键字。例如,下面两行代码具有相同的作用:

MyForm.Controls(6).Top = MyForm.Controls(5).Top + increment
MyForm(6).Top = MyForm(5).Top + increment

可以将Controls(index)传递给一个参数指定为Controls类的函数。也可以使用它们的名称来访问成员。例如:

Controls("Command1").Top

可以在If语句中使用 TypeOf关键字,或使用TypeName函数来确定Controls集合中控件的类型。

注意 Controls 集合不是Visual Basic Collection类的成员。其属性和方法的集合要小于Collection对象的属性和方法的集合,而且用户不能创建该集合的实例。

[/Quote]
zfl2k 2011-12-15
  • 打赏
  • 举报
回复
vb手动添加的时候是相同名称的从0开始连续,可以随便修改,只要同名称的不重复即可
自己程序生成的,只要名称+index不重复即可
worldy 2011-12-14
  • 打赏
  • 举报
回复
只要名称不一样,index可以重复

也就是每个名称index都可以是从0开始的连续数
但index本身允许不连续

你可以command1(0)而下一个是command1(100)
石头剪刀布的源代码我也是新手,随便做个玩玩。把RadioButton0,1,2放一个容器里! Public Class Form1 Dim win1 As Integer = 0 Dim win2 As Integer = 0 Dim i As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim str As Integer Dim rand As New Random() str =rand.Next(3)'随机数 If str = 0 Then RadioButton0.Checked = True ElseIf str = 1 Then RadioButton1.Checked = True ElseIf str = 2 Then RadioButton2.Checked = True End If If RadioButton3.Checked = True Then i = 0 ElseIf RadioButton4.Checked = True Then i = 1 ElseIf RadioButton5.Checked = True Then i = 2 Else MsgBox("请选择要出的拳法!") End If If (str = 0 And i = 1) Or (str = 1 And i = 2) Or (str = 2 And i = 0) Then win1 += 1 TextBox1.Text = "玩家胜利" ElseIf (str = 0 And i = 2) Or (str = 1 And i = 0) Or (str = 2 And i = 1) Then win2 += 1 TextBox1.Text = "电脑胜利" Else TextBox1.Text = "平手" End If'判断胜利者 TextBox2.Text = win1 TextBox3.Text = win2 If win1 = 5 Then MsgBox("最终胜利者是玩家!恭喜!") win1 = 0 win2 = 0 For i = 0 To Me.Controls.Count - 1 If TypeOf (Me.Controls(i)) Is TextBox Then Me.Controls(i).Text = "" End If'清空过时信息 Next ElseIf win2 = 5 Then MsgBox("最终胜利者是电脑!") win1 = 0 win2 = 0 For i = 0 To Me.Controls.Count - 1 If TypeOf (Me.Controls(i)) Is TextBox Then Me.Controls(i).Text = "" End If'清空过时信息 Next End If End Sub End Class
'这个代码用在工控I/O接点检测 判定某个接点为 0(关闭状态) 或 1(打开状态) '十进制与二进制的转换 '添加 Text1 Command1 Command2 Command3 Label1 Shape1(0) '128,64,32,16,8,4,2,1 (从右边往左算是1-128 连乘2 合计 255) '可以理解为2的7次方 7次方 6次方 5次方。。。。。0次方 Option Explicit Private WithEvents Timer1 As Timer Dim i&, j&, aa$ '变量定义与型态声明 Private Sub Form_Load() Command1.Caption = "10转2" Command2.Caption = "2转10" Command3.Caption = "随机灯号" Command1.Enabled = True Command2.Enabled = False Text1.Text = "151" '比方说I/O板卡返回 151 转为二进制得到 10010111 '****************************** For i = 1 To 7 '循环线上添加 7个 Shape数组 形状控件 与原先的1个 共有8个 Load Shape1(i) '装载控件 索引编号为i Shape1(i).Visible = True '线上添加的控件默认为不可见 我们得将它设为 可见 Shape1(i).Left = Shape1(i - 1).Left + Shape1(0).Width + 70 '定位新添加的控件,在前一个控件的位置加上宽度再加上间距70 Next i '******************************* Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 '窗体定位于屏幕中心 Command1_Click '自动点击按钮1 将十进制的151转为二进制 Set Timer1 = Controls.Add("vb.Timer", "Timer1") '线上添加 Timer1 定时器控件 Timer1.Interval = 3000: Timer1.Enabled = False '定时器Timer1的激发间隔设为3000毫秒 暂时禁用 Me.Caption = "工控第一课 研华PCI-1761接点检测" Label1.Caption = "151" End Sub Private Sub Command1_Click() '十进制转二进制 If Command3.Caption = "停止演示" Then Command3_Click '如果随机演示正在进行中 我们先自动点击按钮3 让它停止演示 'Text1.Text是文字形态 我们必须先使用Val函数将它转为数值 '调用 Ten2Two 副程序将Text1.Text转换过的数值 转换为文字型态的二进制 再赋值给 Text1.Text Text1.Text = Format(Ten2Two(Val(Text1.Text)), "00000000") For i = 1 To Len(Text1.Text) '从1开始循环到Text1长度 '如果Shape1数组i-1的值为0 Shape1的颜色显示绿色 否则显示红色 Shape1(i - 1).FillColor = IIf(Mid(Text1.Text, i, 1) = 0, QBColor(10), QBColor(12)) Next i Command1.Enabled = Not Command1.Enabled 'Not的使用技术原理是反向 假变成真 真变成假 Command2.Enabled = Not Command2.Enabled '让两个按钮反向为 可用或不可用 End Sub Private Sub Command2_Click() '二进制转十进制 If Command3.Caption = "停止演示" Then Command3_Click '如果随机演示正在进行中 我们先自动点击按钮3 让它停止演示 '调用副程序Two2Ten 将Text1文本框内的二进制内容转换返回数值 '再使用 Cstr函数将此数值转换为文字型态 再用 Trim函数将此文字型内容左右两边可能的空白字符去掉 Text1.Text = Trim(CStr(Two2Ten(Text1.Text))) Command1.Enabled = Not Command1.Enabled '让两个按钮反向为 可用或不可用 Command2.Enabled = Not Command2.Enabled End Sub Private Sub Command3_Click() '随机演示数值转换并显示相应的灯号 Command3.Caption = IIf(Command3.Caption = "随机灯号", "停止演示", "随机灯号") Timer1.Enabled = Not Timer1.Enabled '定时器反向 开始或停止演示 End Sub Function Ten2Two(ByVal Tvalue As Long) As String '十进制转二进制 If Tvalue = 0 Then Ten2Two = "00000000": Exit Function aa = "" Do Until Tvalue 0, TmpVal + 2 ^ (i - 1), TmpVal) Next i Two2Ten = TmpVal '将数值变量TmpVal返回 End Function Private Sub Timer1_Timer() '定时器的事件 Dim RndVal& '变量定义 Timer1.Enabled = False '换算过程前暂时先让定时器停止运行 Randomize '随机数种子初始化 RndVal = Int(Rnd * 256) '0-255共256个数 随机取值 '将取到的随机数调用副程序Ten2Two 将十进制接收值转换为0与1的二进制后 赋值给文字型变量aa aa = Format(Trim(CStr(Ten2Two(RndVal))), "00000000") Label1.Caption = CStr(RndVal) '让标签显示接收到(随机数)的十进制值 Text1.Text = aa '文本框Text1显示变量aa的内容 For i = 1 To Len(aa) '从第一个字符开始循环到变量aa包含几个字符 '如果Shape1数组i-1的值为0 Shape1的颜色显示绿色 否则显示红色 Shape1(i - 1).FillColor = IIf(Mid(aa, i, 1) = "0", QBColor(10), QBColor(12)) Next i Timer1.Enabled = True '换算完成后再让定时器继续运行 End Sub

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧