Vb中控件的自动排列

      Vb作为一种流行的可视化编程语言,其强大的界面设计功能为程序设计者省了不少时间。不过在面对大量相同控件的整齐排列时,虽可在设计时排列好,但难免在调试中不小心移动,或后来又增减一些。于是有人用语句在程序中调节,其艰辛是可想而知的(笔者深有体会),即使位置排好了,由于控件添加的先后问题,其索引属性(.TabIndex)往往一片混乱.能不能让控件的位置、索引属性的排序实现自动化呢?经过一番思索,笔者终于找到了很好的解决办法,并成功应用于自己开发的注册表修改器中。
例子:新建工程,放入一个Frame控件Frame1,再在Frame1 中放入4个复选框checkbox1、checkbox2、checkbox3、checkbox4
在form_load()子过程中加入一句:ArrangeChildren frame1 运行结果为4个复选框等间距整齐地排列在其容器frame1 中。在设计窗口中,你可以任意调整它们的上下位置,运行后将按它们设计时的上下顺序整齐排列,并且它们的索引顺序按由下到大排列。(索引顺序的作用大家知道吧——让你的程序支持键盘操作)。更妙的是,你可在容器中任意增加、减少控件数量(类型要一样),运行后它们都能整齐排列,从而一劳永逸。
以下是具体的子过程代码
Public Sub ArrangeChildren(Father As Control)   'Father为容器控件
    '功能:(1)对容器控件内的子控件的TabIndex值进行排序
                '排序依据是:由上到下(.Top值由小到大),TabIndex小到大
          '(2)对容器控件内的子控件等间距整齐排列
    Dim Child As Control    '窗体中的任一控件
    Dim Children() As Control   '属于容器中的控件数组
    Dim Tags() As Integer   '元素的值记录了控件的TabIndex值
    Dim TempChild As Control  '临时控件
    Dim i As Integer, j As Integer
    Dim x As Integer, Y As Integer
    Dim wChild As Integer, hChild As Integer
    Dim num As Integer
    Dim strTemp As String
    Const  ADJUST as integer=150  ’微调(可适当增减)
num = 0
    For Each Child In Father.Parent.Controls ‘搜索容器所在窗体中的每一个控件
        If TypeOf Child Is CheckBox Then  ‘这个判断是为了提高效率,可不要
            If Child.Container Is Father Then
                ReDim Preserve Children(num)
                ReDim Preserve Tags(num)
                Set Children(num) = Child
                Children(num).Tag = num
                Tags(num) = Children(num).TabIndex
                num = num + 1
            End If
        End If
    Next
   
    If num < 1 Then Exit Sub ‘当容器中一个子控件也没有时,退出
    num = UBound(Children)

    SortProc Tags  ‘将数组Tags()按由小到大顺序排序
    ArrayTagProc Children ‘越在屏幕上面的控件,其<.top>值越小,故让其<.tag>值也小
    For i = 0 To num
        Children(i).TabIndex = Tags(Children(i).Tag)
Next i  ‘越在屏幕上面的控件,其索引值小(实现索引值的排序)
    ArrayTabIndexProc Children  '
    x = 200    ‘控件在其容器中的起始位置
    wChild = 4000  ‘控件宽度
    hChild = 255  ‘控件高度
    Y = (Father.Height - ADJUST - (num + 1) * hChild) / (num + 2)
    For j = 0 To num
         Children(j).Move x, (j + 1) * Y + j * hChild + ADJUST, wChild, hChild
    Next j
End Sub

Public Sub SortProc(ArrInt() As Integer) '对整数数组进行排序
    Dim i As Integer, j As Integer
    Dim temp As Integer
    Dim num As Integer  '数组大小
    num = UBound(ArrInt)
     For i = 0 To num
        For j = i + 1 To UBound(ArrInt)
            If ArrInt(i) > ArrInt(j) Then
                temp = ArrInt(i)
                ArrInt(i) = ArrInt(j)
                ArrInt(j) = temp
            End If
        Next j
     Next i
End Sub

Public Sub ArrayTabIndexProc(ArrControl() As Control) '对控件数组进行排序
    '控件数组 ArrControl(0),ArrControl(1),ArrControl(2),.....ArrControl(n)
    '的TabIndex值按由低到高顺序排列
    Dim i As Integer, j As Integer
    Dim temp As Control
    Dim num As Integer
   
    num = UBound(ArrControl)
     For i = 0 To num
        For j = i + 1 To UBound(ArrControl)
            If ArrControl(i).TabIndex > ArrControl(j).TabIndex Then
                Set temp = ArrControl(i)
                Set ArrControl(i) = ArrControl(j)
                Set ArrControl(j) = temp
            End If
        Next j
     Next i
End Sub

Public Sub ArrayTagProc(arr() As Control) '对控件的<.tag>属性进行排序
    '越在屏幕上面的控件,其<.top>值越小,故让其<.tag>值也小(最综的目的是让其索引值小)
    Dim i As Integer, j As Integer
    Dim temp As Variant
    Dim num As Integer
    Dim arrTop() As Integer '存储控件<.Top属性>数组
   
    num = UBound(arr)
    ReDim arrTop(num)
    For i = 0 To num
        arrTop(i) = arr(i).Top
    Next
    SortProc arrTop '按照由小到大顺序
    For i = 0 To num
        For j = 0 To num
            If arr(i).Top = arrTop(j) Then arr(i).Tag = j
        Next j
    Next i
End Sub
以上程序在Vb5.0、Vb6.0中调试通过。读者可以用到自己的程序中,今后再也不用为调整位置和索引顺序而作一些简单重复劳动了。

VB控件属性大全【珍藏版】 1.01、窗体(FORM)的常用属性 2 1.02、标签控件(Lable)的常用属性 7 1.03、文本框控件(TextBox)的常用属性 9 1.04、框架控件(Frame)的常用属性 13 1.05、命令按钮控件(CommandButton)的常用属性 15 1.06、复选框控件(CheckBox)的常用属性 17 1.07、单选钮控件(OptionButton)的常用属性 19 1.08、组合框控件(ComboBox)常用属性 22 1.09、列表框控件(ListBox)的常用属性 25 1.10、水平滚动条控件(HScrollBar)和垂直滚动条控件(VScrollBar)的常用属性 28 1.11、定时器控件的常用属性 30 1.12、文件系统控件的常用属性 30 1.13、形状控件(Shape)常用属性 33 1.14、直线控件(Ling)的常用属性 35 1.15、图像控件(Image)的常用属性 36 1.16、图片框控件(PictureBox)的常用属性 38 1.17、数据控件(Data)的常用属性 43 1.18、OLE容器控件(OLE)的常用属性 46 1.19、菜单控件的常用属性 48 2.02、电影(ActiveMovie)控件的常用属性 49 2.01、Adodc控件的常用属性 52 2.03、动画(Animation)控件的常用属性 55 2.04、公用对话框控件(CommonDialog)控件的常用属性 56 2.05、数据组合框(DataCombo)控件的常用属性 60 2.06、数据型电子表格控件(DataGrid)的常用属性 62 2.07、数据列表(DataList) 控件的常用属性 65 2.08、DTPicker控件的常用属性 67 2.09、平面滚动条控件(FlatScrollBar)的常用属性 70 2.10、图像组合框(ImageCombo)控件的常用属性 71 2.11、图像列表控件(ImageList)的常用属性 74 2.12、Inet控件的常用属性 74 2.13、列表视图控件(ListView)的常用属性 75 2.14、MAPIMessages控件的常用属性 79 2.15、MAPISession控件的常用属性 80 2.16、MaskEdBox控件的常用属性 80 2.17、多媒体(MMControl)控件的常用属性 83 2.18、月视图(MonthView)控件的常用属性 86 2.19、图表控件(MSChard)的常用属性 89 2.20、MSComm的常用属性 93 2.21、电子表格控件(MSFlexGrid)的常用属性 94 2.22、层次型电子表格控件(MSHFlexGrid)的常用属性 99 2.23、MSRDC控件的常用属性 104 2.24、PictureClip控件的常用属性 106 2.25、进度栏(ProgressBar)控件的常用属性 107
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值