Vb中控制元件的自動排列 (轉)

worldblog發表於2007-12-05
Vb中控制元件的自動排列 (轉)[@more@]

  Vb作為一種流行的視覺化語言,其強大的介面設計功能為設計者省了不少時間。不過在面對大量相同的整齊排列時,雖可在設計時排列好,但難免在中不小心移動,或後來又增減一些。於是有人用語句在程式中調節,其艱辛是可想而知的(筆者深有體會),即使位置排好了,由於控制元件新增的先後問題,其屬性(.TabIndex)往往一片混亂.能不能讓控制元件的位置、索引屬性的排序實現自動化呢?經過一番思索,筆者終於找到了很好的解決辦法,併成功應用於自己開發的登錄檔修改器中。
例子:新建工程,放入一個Frame控制元件Frame1,再在Frame1 中放入4個核取方塊checkbox1、checkbox2、checkbox3、checkbox4
在form_load()子過程中加入一句:ArrangeChildren frame1 執行結果為4個核取方塊等間距整齊地排列在其容器frame1 中。在設計視窗中,你可以任意調整它們的上下位置,執行後將按它們設計時的上下順序整齊排列,並且它們的索引順序按由下到大排列。(索引順序的作用大家知道吧——讓你的程式支援鍵盤操作)。更妙的是,你可在容器中任意增加、減少控制元件數量(型別要一樣),執行後它們都能整齊排列,從而一勞永逸。
以下是具體的子過程程式碼
Public Sub ArrangeChildren(her 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、.0中除錯透過。讀者可以用到自己的程式中,今後再也不用為調整位置和索引順序而作一些簡單重複勞動了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988618/,如需轉載,請註明出處,否則將追究法律責任。

相關文章