一.运行中设置数组控件的属性
设窗体上有若干个以 Command1 命名的命令按钮,现要求:点击其中一个按钮后,该按钮不可用,而其它的按钮均可用。以下几行代码可以实现这个要求,比一个一个的设置高效得多。
[html] view plaincopy
1. <strong><span style="font-size:18px;">Private Sub Command1_Click(Index As Integer)
2.
3. Dim i As Integer '计数器
4. Dim comNum As Integer '按钮的索引号
5. comNum = 0
6. For i = 0 To Command1.Count - 1
7. comNum = comNum + 1
8. If comNum > Command1.Count - 1 Then comNum = 0
9. Command1(comNum).Enabled = True '让所有按钮可用
10. Next
11. Command1(Index).Enabled = False '让被单击按钮不可用
12.
13. End Sub</span></strong>
二、运行中添加和卸载数组控件
窗体上已有一个文本框Text1,程序需要在运行时动态地创建若干文本框,可这样实现:
1.首先,设计时给Text1的Index属性设置为"0",这一步很重要:有了索引号才能创建数组控件;
2.编写代码:[之前请给工程添加两个命令按钮,Name属性取缺省值,Caption属性分别为:添加、卸载]
[html] view plaincopy
1. <strong><span style="font-size:18px;">Private Sub Command1_Click()
2.
3. Dim txtNum As Integer 'Text1的Index号
4. Dim Num As Integer '赋给各TextBox的值
5.
6. txtNum = 0 '初值
7. Num = 1 '初值
8.
9. Text1(0).Text = "Text" & Num '第一个Text1的值
10.
11. Dim i As Integer '计数器
12. For i = 0 To 4 '添加五个TextBox
13. txtNum = txtNum + 1
14. Num = Num + 1
15. Load Text1(txtNum) '加载文本框
16. Text1(txtNum).Top = Text1(txtNum - 1).Top + 450 '设置位置
17. Text1(txtNum).Text = "Text" & Num '加载内容
18. Text1(txtNum).Visible = True '令其可见:不能漏
19. Next
20.
21. Command1.Enabled = False
22. Command2.Enabled = True
23.
24. End Sub
25.
26. Private Sub Command2_Click()
27.
28. Dim i As Integer, N As Integer
29. N = 0
30. For i = 1 To Text1.Count - 1
31. N = N + 1
32. Unload Text1(N)
33. Next
34.
35. Command1.Enabled = True
36. Command2.Enabled = False
37.
38. End Sub
39. </span></strong>
三、给运行中添加的数组控件命名并编写事件
其实例二已经给数组控件命了名,只是简单了些。本例将文件夹"F:\Txt"下的所有.txt的文件名作为菜单的Caption添加到菜单项里[请事先建立此文件夹并拷贝一些.txt文件,或者更改代码],当点击这些菜单,程序将调出Windows的记事本打开相应的文件。
键入以下代码前请启动VB的菜单编辑器,建立一个父菜单项[Naem和Caption属性任意],然后在此父菜单下建立一个子菜单,Name属性为"mnuFiles",Caption属性为"没有文件"。
[html] view plaincopy
1. <strong><span style="font-size:18px;">Dim MyPath As String '路径名变量
2.
3. '添加并命名菜单过程
4. Private Sub AddMenu()
5.
6. Dim MenuNum As Integer '菜单索引号变量
7. Dim MyFiles As String '文件名变量
8.
9. MenuNum = 0 '初值
10.
11. MyFiles = Dir(MyPath + "*.txt") '仅查找文本文档
12. If MyFiles = "" Then Exit Sub '为空则退出过程
13.
14. mnuFiles(0).Caption = MyFiles '给第一个菜单命名
15.
16. Do Until MyFiles = ""
17. MyFiles = Dir()
18. If MenuNum = 0 Then MenuNum = 1
19. MenuNum = MenuNum + 1
20. Load mnuFiles(MenuNum) '加载菜单
21. mnuFiles(MenuNum).Visible = True '设置为可见:不能漏
22. mnuFiles(MenuNum).Caption = MyFiles
23. If mnuFiles(MenuNum).Caption = "" Then Unload mnuFiles(MenuNum)
24. '若菜单名为空则卸载掉
25. Loop
26.
27. End Sub
28.
29. Private Sub Form_Load()
30.
31. MyPath = "F:\Txt\" '规定路径
32. Call AddMenu '执行添加菜单过程
33.
34. End Sub
35.
36. Private Sub mnuFiles_Click(Index As Integer)
37.
38. Dim ret As String
39. '用Windows的记事本打开文件:注意中间的空格不能少
40. ret = "Notepad.exe" & " " & MyPath & mnuFiles(Index).Caption
41. Shell ret, vbNormalFocus
42.
43. End Sub
44. </span></strong>
四、控件在窗体上的排列问题
当然添加的数组控件多了,排列确实是个问题。下面的例子给窗体添加499个Label控件,加上事先绘制好的Index号定义为0的控件,总共有500个,能在窗体上从左到右、从上到下整齐地排列。程序运行时要花些许时间。
[html] view plaincopy
1. <strong><span style="font-size:18px;">Option Explicit
2.
3. Private Sub Form_Load()
4.
5. Me.Width = 6800
6. Me.Height = 6000
7. Me.Caption = "添加标签演示"
8. With Label1(0)
9. .Top = 0
10. .Left = 120
11. .Height = 200
12. .Width = 300
13. .Caption = ""
14. End With
15.
16. AddLabels
17.
18. End Sub
19.
20. Private Sub AddLabels()
21.
22. Dim i As Integer '计数器
23. Dim Num As Integer 'Label的Index号
24. Dim k As Integer '判断是否满行
25. Dim n As Integer '行数计数器
26.
27. Num = 0
28. k = 0
29. n = 0
30.
31. Label1(0).Caption = Num + 1
32.
33. For i = 1 To 499
34. Num = Num + 1
35. Load Label1(Num) '加载Label控件
36.
37. Select Case k
38. Case 0
39. Label1(Num).Left = Label1(Num - 1).Left + Label1(0).Width + 20
40. If Num = 20 Then n = n + 1: k = n
41.
42. Case n
43. Label1(n * 20).Left = 120
44. Label1(n * 20).Top = Label1(0).Height * n
45. Label1(Num).Top = Label1(0).Height * n
46. Label1(Num).Left = Label1(Num - 1).Left + Label1(0).Width + 20
47. If Num = (n + 1) * 20 Then n = n + 1: k = n
48. End Select
49.
50. Label1(Num).Caption = Num + 1
51. Label1(Num).Visible = True
52. Next
53.
54. End Sub