VB控件数组的操作技巧(混合文本)

2011-3-22 9:31:00

 

VB控件数组的操作技巧
━━━━━━━━━━━━━━━━━━━━━━━━━━

    控件数组有在设计时设置好的,也有在运行中创建的。控件数组一方面使得程序简洁、令代码易于维护,另一方面能使程序具有灵活性。可见,科学地利用控件数组可使编程工作的效率更高。本文是从笔者回答网友的问题中整理出来的,与原来的回答相比略有改动。希望这些"技巧"对大家有些帮助。如有不妥之处,敬请指教。

一、运行中设置数组控件的属性

    设窗体上有若干个以 Command1 命名的命令按钮,现要求:点击其中一个按钮后,该按钮不可用,而其它的按钮均可用。以下几行代码可以实现这个要求,比一个一个的设置高效得多。

Private Sub Command1_Click(Index As Integer)
    
Dim As Integer '计数器
    
Dim comNum As Integer '按钮的索引号
    
comNum 0
    For To Command1.Count 1
        comNum comNum 1
        If comNum Command1.Count Then comNum 0
        Command1(comNum).Enabled True '让所有按钮可用
    
Next
    
Command1(Index).Enabled False '让被单击按钮不可用
End Sub

二、运行中添加和卸载数组控件

    窗体上已有一个文本框Text1,程序需要在运行时动态地创建若干文本框,可这样实现:
1.首先,设计时给Text1的Index属性设置为"0",这一步很重要:有了索引号才能创建数组控件;
2.编写代码:[之前请给工程添加两个命令按钮,Name属性取缺省值,Caption属性分别为:添加、卸载]

Private Sub Command1_Click()
    
Dim txtNum As Integer 'Text1的Index号
    
Dim Num As Integer '赋给各TextBox的值
    
txtNum '初值
    
Num '初值
    
Text1(0).Text "TextNum '第一个Text1的值
    
Dim As Integer '计数器
    
For To '添加五个TextBox
        
txtNum txtNum 1
        Num Num 1
        Load Text1(txtNum'加载文本框
        
Text1(txtNum).Top Text1(txtNum 1).Top 450 '设置位置
        
Text1(txtNum).Text "TextNum '加载内容
        
Text1(txtNum).Visible True '令其可见:不能漏
    
Next
    
Command1.Enabled False
    
Command2.Enabled True
End Sub

Private Sub 
Command2_Click()
    
Dim As Integer, As Integer
    
0
    For To Text1.Count 1
        N 1
        Unload Text1(N)
    
Next
    
Command1.Enabled True
    
Command2.Enabled False
End Sub

三、给运行中添加的数组控件命名并编写事件

    其实例二已经给数组控件命了名,只是简单了些。本例将文件夹"F:\Txt"下的所有.txt的文件名作为菜单的Caption添加到菜单项里[请事先建立此文件夹并拷贝一些.txt文件,或者更改代码],当点击这些菜单,程序将调出Windows的记事本打开相应的文件。
    键入以下代码前请启动VB的菜单编辑器,建立一个父菜单项[Naem和Caption属性任意],然后在此父菜单下建立一个子菜单,Name属性为"mnuFiles",Caption属性为"没有文件"。

Dim MyPath As String '路径名变量
'添加并命名菜单过程
Private Sub AddMenu()
    
Dim MenuNum As Integer '菜单索引号变量
    
Dim MyFiles As String '文件名变量
    
MenuNum '初值
    
MyFiles Dir(MyPath "*.txt"'仅查找文本文档
    
If MyFiles "" Then Exit Sub '为空则退出过程
    
mnuFiles(0).Caption MyFiles '给第一个菜单命名
    
Do Until MyFiles ""
        MyFiles Dir()
        
If MenuNum Then MenuNum 1
        MenuNum MenuNum 1
        Load mnuFiles(MenuNum'加载菜单
        
mnuFiles(MenuNum).Visible True '设置为可见:不能漏
        
mnuFiles(MenuNum).Caption MyFiles
        If mnuFiles(MenuNum).Caption "" Then Unload mnuFiles(MenuNum)
        
'若菜单名为空则卸载掉
    
Loop
End Sub

Private Sub 
Form_Load()
    
MyPath "F:\Txt\'规定路径
    
Call AddMenu '执行添加菜单过程
End Sub
Private Sub 
mnuFiles_Click(Index As Integer)
    
Dim ret As String
    
'用Windows的记事本打开文件:注意中间的空格不能少
    
ret "Notepad.exe" MyPath mnuFiles(Index).Caption
    Shell ret, vbNormalFocus
End Sub

四、控件在窗体上的排列问题

    曾有一位网友两次问土人怎样才能在窗体上添加100万个文本框。呵呵,这要多大的显示器才能显示出来呀!不过,添加的数组控件多了,排列确实是个问题。下面的例子给窗体添加499个Label控件,连同事先绘制好的Index号定义为0的控件,总共有500个,能在窗体上从左到右、从上到下整齐地排列。程序运行时要花些许时间。

Option Explicit
Private Sub 
Form_Load()
    
Me.Width 6800
    Me.Height 6000
    Me.Caption "添加标签演示"
    With Label1(0)
        .
Top 0
        .Left 120
        .Height 200
        .Width 300
        .Caption ""
    End With
    
AddLabels
End Sub
Private Sub 
AddLabels()
    
Dim As Integer '计数器
    
Dim Num As Integer 'Label的Index号
    
Dim As Integer '判断是否满行
    
Dim As Integer '行数计数器
    
Num 0
    k 0
    n 0
    Label1(0).Caption Num 1
    For To 499
        Num Num 1
        Load Label1(Num'加载Label控件
        
Select Case k
            Case 0
                Label1(Num).Left Label1(Num 1).Left Label1(0).Width 20
                If Num 20 Then 1: k n
            Case n
                Label1(20).Left 120
                Label1(20).Top Label1(0).Height n
                Label1(Num).Top Label1(0).Height n
                Label1(Num).Left Label1(Num 1).Left Label1(0).Width 20
                If Num = (1) * 20 Then 1: k n
        End Select
        
Label1(Num).Caption Num 1
        Label1(Num).Visible True
    Next
End Sub


一个问题的实例

回答人的补充

后面那代码,是告诉你什么情况用Select Case。
那就不能这样做了,2个的index是不同的,改为:

Private Sub Command1_Click()
    
Dim i, r, s As Integer
    Dim 
As Long
    For 
To 2
        If Option1(i).Value Then
            Select Case 
i
                Case 0: s 100
                Case 1: s 120
                Case 2: s 160
            End Select
        End If
    Next
    For 
To 3
        If Option2(i).Value Then
            Select Case 
i
                Case 0: r 3000
                Case 1: r 3000 1.1
                Case 2: r 3000 1.2
                Case 2: r 3000 1.3
            End Select
        End If
    Next
    
s
    Label1.Caption "根据所选房价应为:¥p
End Sub

1.将多个控件取相同的名称
具体操作步骤是:

1)绘制或选择要作为一个控件数组的所有控件,必须保证它们为同一类型的控件。
2)决定哪一个控件作为数组中的第一个元素,选定该控件并将其Name属性值设置成数组名(或使用其原有的Name属性值)。
3)将其他控件的Name属性值改成同一个名称。这时,Visual Basic会显示一个对话框,要求确认是否要创建控件数组,选择“是”则将控件添加到控件数组中。
例如,若原有三个文本框Text1、Text2、Text3,要将它们设置成控件数组,数组名称为TT,则选择第一个文本框Text1,将其Name属性修改成TT,然后再选择Text2,再将其Name属性改成TT,这时会出现下图所示的对话框,单击“是(Y)” 按钮将Text2添加到控件数组中。在属性窗口中可以看出原Text1和Text2文本框的名称都变成了TT。同样将Text3的名称也改成TT,这时不再出现提示对话框,而直接将Text3的名称改成TT。观察各控件的属性窗口中的Index属性,其值分别变成了0、1、2(即控件数组元素的索引)。

图 通过修改控件名称建立控件数组
用这种方法建立的控件数组元素仅仅具有相同的Name属性和控件类型,其他属性与最初绘制控件时的值相同。

2.复制现有的控件,并将其粘贴到所在容器中
具体操作步骤是:
1)在容器(如窗体)中绘制或选择要作为控件数组的第一个控件。
2)选择“编辑”菜单中的“复制”命令(或单击标准工具栏的“复制”按钮),然后选中容器,再在“编辑”菜单中选择“粘贴”命令(或单击标准工具栏的“粘贴”按钮)。Visual Basic同样会显示与上图类似的对话框,单击“是(Y)”按钮,确定要创建一个控件数组。
这时,绘制的第一个控件具有索引值0,而新粘贴的控件的索引值为1。以后可以继续使用粘贴的方法向现有的数组中添加控件,只是不再出现提示对话框,直接将新粘贴的控件作为控件数组的下一个元素。每个新数组元素的索引值与其添加到控件数组中的次序相同。用这种方法添加控件时,大多数可视属性,例如高度、宽度和颜色,将从数组中第一个控件复制到新控件中。

3.给控件设置一个Index属性值
具体操作步骤是:
1)绘制或选择要作为控件数组的第一个控件。
2)在属性窗口中直接指定一个Index属性值(如设置为0)。
3)使用以上两种方法之一添加数组中的其他控件,这时不再出现提示对话框询问是否要创建控件数组。
建立了控件数组之后,可以通过修改Index属性值修改相应控件在数组中的位置。当然,必须保证同一个控件数组中的各元素的Index属性值是惟一的。
Visual Basic控件数组的使用示例 - - - 同时移动一组图形
【例】创建图形控件数组S1,包含6个圆,当按下“移动”按钮时,所有圆全部向下移动100缇,当移动到窗体底部时,返回窗体顶部。界面如下图所示。

图 同时移动一组图形
分析:移动操作在单击“移动”按钮(设名称为Command1)时进行,因此,代码应写在“移动”按钮的Click事件过程中。这里要特别注意的是,“移动”按钮不是控件数组元素,因此,其事件过程不会返回Index参数值,也就是在其事件过程中不可以使用Index参数,这里可以用循环变量控制控件数组的索引,通过循环逐个移动图形。
“移动”按钮的Click事件过程如下:

Private Sub Command1_Click()
    
For To 5
        If S1(I).Top S1(I).Height Form1.ScaleHeight Then
            
' 当图形底部超过窗体底部时,将图形移回窗体顶部
            
S1(I).Top 0
        Else
            
' 当图形底部未超过窗体底部时,将图形向下移动100缇
            
S1(I).Top S1(I).Top 100
        End If
    Next 
I
End Sub

对于不关心处理次序的控件数组,也可以使用For Each...Next循环进行处理,例如,上例移动图形无先后次序问题,程序可以改写成:

Private Sub Command1_Click()
    
For Each In S1
        If X.Top X.Height Form1.ScaleHeight Then
            
X.Top 0
        Else
            
X.Top X.Top 100
        End If
    Next 
X
End Sub

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值