Vb中控制元件的自動排列 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VB中實現窗體自動隱藏 (轉)
- vb窗體中控制元件自動隨窗體變化大小(原始碼)控制元件原始碼
- 一勞永逸讓VB自動改變控制元件大小控制元件
- 在VB.Net中建立使用控制元件陣列 (轉)控制元件陣列
- AASubviews - 自動排列子檢視View
- VB6.0中透過MSChart控制元件呼叫資料庫 (轉)控制元件資料庫
- 在VB中實現窗體的動態效果 (轉)
- [VB.net][WinForm]Panel控制元件移動\滑鼠拖動ORM控制元件
- 利用動態建立自動化介面實現VB的函式指標呼叫 (轉)函式指標
- VB.NET中物件的克隆 (轉)物件
- 亂序排列檔案中的所有行(轉)
- VB中的Unicode 和 Ansi 格式 (轉)Unicode
- Delphi使用VB編寫的ActiveX控制元件全攻略 (轉)控制元件
- 關於vb自定義控制元件中引用mediaplayer控制元件出錯的解決方案控制元件
- VB6 dll 自動編譯工具編譯
- 取消Win7系統視窗自動排列的方法Win7
- 改良控制元件-Delphi自帶控制元件Bug的消除 (轉)控制元件
- VB動態呼叫外部函式的方法 (轉)函式
- 排列轉換
- aspx頁面中動態建立控制元件 (轉)控制元件
- VB中API的宣告特殊問題 (轉)API
- VB.net中HOOK的應用(二) (轉)Hook
- VB中檔案操作的兩種方式 (轉)
- Jquery 自動完成控制元件jQuery控制元件
- 如何關閉 Windows 7 視窗自動排列功能?Windows
- 在VB6.0中實現動態統計報表 (轉)
- VB做論壇自動發貼軟體
- VB.net chart 控制元件使用控制元件
- Win10桌面取消自動排列,重新整理仍然有圖示移動——適用於桌面排列患者Win10
- 動態移動控制元件 (轉)控制元件
- 567. 字串的排列(中)字串
- 在VB.NET中尋找App (轉)APP
- 在VB程式中,透過程式碼改變Combo控制元件只讀屬性Style值 (轉)控制元件
- vb.net 存取資料庫中的圖片 (轉)資料庫
- VB程式設計中的一些經驗 (轉)程式設計
- VUE-多元素垂直排列,有一列自動填充Vue
- js自動新增的物件屬性並非完全按照新增的順序排列JS物件
- 關於自動付款中預付款的處理-轉