?? 26.txt
字號:
保存復選框選項
選項
在一些情況下,應用程序會用復選框來讓用戶對某些屬性進行設置,并將這些設置保存到磁盤上以供下次使用。下面的程序能讓減少處理用戶設置所需的代碼量。
一個復選框有兩種狀態,被選中(Checked)或是未被選中(UnChecked)。復選框的二進制的本質使我們能輕松地表示該控件的這兩種狀態。由于所有的復選框對這兩種狀態的回應都是一樣的,因此把這些復選做為一個控件數組來處理會大大減少編寫代碼的工作量。
CBO_Click過程
CBO_Click過程通過控件數組的Click事件調用。它有兩個常數,來決定復選框應做出怎樣的反應。當設置LikeOptions時,一次只能選中一個復選框。當設置AllowNone時,允許用戶不選中任何復選框。這兩個開關能使復選框數組如同一組選擇按鈕一樣。如果想讓這些復選框操作起來象標準的復選框一樣,就將LikeOptions設置為False或0,并將AllowNone設置為True或1. 如果想讓這些復選框操作起來象一組選項按鈕,就將LikeOptions設置為True或1,并將AllowNone設置為False或0。
CBO_Set過程
CBO_Set過程被用來調協復選框的狀態。它通過CBO_Click過程調用,來強制一組復選框按照上面兩個開關的設置來作出反應。同時它也可被程序員用來將一組復選框設為他所希望的狀態。
過程參數
上面的兩個過程都要求將對復選框數組的引用及當前正在使用的復選框的索引值作為參數傳遞給過程。將復選框的引用作為參數傳遞給過程,可以使這兩個過程處理多個復選框數組。數組中所有復選框的當前狀態用一個32位的數字來表示,該數字被儲存在數組中第一個復選框的Tag屬性中。在這里你可以訪問些將被存盤以供下一個進程使用的數字。
第二個參數在兩個過程中的使用情況和有不同。BO_Click過程需要VB提供復選框的Index值并傳遞給Click事件。但是CBO_Set過程卻使用一個32位的數字。為把二者分開,用Index來保存VB提供的Index參數;CBOIndex用來保存32位的數字。在下面將分析這兩個參數是如何使用的。
示例
為了說明這兩個過程的功能,在窗體上放置一組復選框和一個文本框。為產生復選框數組,可以先在窗體上放置一個復選框,將其Index屬性設為零,然后用拷貝、粘貼的方法產生一個復選框數組。然后輸入下面的代碼。
Dim CBOBusy As Boolean
Private Sub Check1_Click(Index As Integer)
CBO_Click Check1, Index
Text1 = Check1(0).Tag
End Sub
按F5運行程序,注意在點擊復選框時文本框中的變化。我們可以看到對于不同的選擇組合,都有一個唯一的值與之對應。這個值就是我們用來存放到磁盤上的,并將其作為CBOIndex參數傳遞給CBO_Set過程的。
語法
CBO_Click CBOArray, Index
CBO_Set CBOArray, CBOIndex
參數 說明
--------------------------------------------------------------------------------
CBOArray 數組名
Index 必需. 由VB提供的索引值
CBOIndex 必需。32位復合值
--------------------------------------------------------------------------------
代碼
Dim CBOBusy As Boolean
Public Sub CBO_Click(CBOArray, Index)
Dim CBOState&, CBOIndex&
'開關
Const LikeOptions = 0
Const AllowNone = 1
If Index 30 Then Err.Raise 6
If CBOBusy Then Exit Sub
CBOBusy = True
'取得當前索引及狀態
CBOIndex = 2 ^ Index
CBOState = Val(CBOArray(0).Tag)
'按照開關調整復選框
If CBOState = CBOIndex Then
If AllowNone Then
CBO_Set CBOArray, 0
Else
CBO_Set CBOArray, CBOIndex
End If
ElseIf LikeOptions Then
CBO_Set CBOArray, CBOIndex
End If
'設置新的狀態并分配給 Tag
CBOState = Val(CBOArray(0).Tag) Or CBOIndex
If CBOArray(Index).Value = 0 Then CBOState = CBOState - CBOIndex
CBOArray(0).Tag = CBOState
CBOBusy = False
End Sub
Public Sub CBO_Set(CBOArray, CBOIndex&)
Const Log2 = 0.693147180559945
Dim Bit&
If CBOIndex &H7FFFFFFF Then Err.Raise 6
CBOBusy = True
CBOArray(0).Tag = CBOIndex
Bit = 1
On Error GoTo CBOError
Do
CBOArray(Log(Bit) / Log2).Value = Abs((CBOIndex And Bit)>0 )
Bit = Bit + Bit
Loop
CBOError:
CBOBusy = False
End Sub
分析
復選框數組必須使用基于零的連續的索引值以便同32位的數字關聯。數組的索引值由VB通過Index參數傳遞給Click事件,Index與CBOIndex的關系如下:
CBOIndex = 2 ^ Index
Index = Log(CBOIndex) / Log(2)
如果使用了大于30的索引,則會產生致命的錯誤,因此程序首先檢查索引的合法性。如果超過30,就產生一個溢出錯誤。
設置復選框
在Form_Load事件中初始化復選框。將0賦值給CBOIndex來使所有的復選框處于未被選中的狀態。或用其他可接受的數值設置
一個或多個復選框的狀態。這個數字可從注冊表中讀入或從INI文件中讀入。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -