VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 保存复选框选项
发表评论(0)作者:, 平台:, 阅读:16447, 日期:2000-03-12
保存复选框选项



选项


在一些情况下,应用程序会用复选框来让用户对某些属性进行设置,并将这些设置

保存到磁盘上以供下次使用。下面的程序能让减少处理用户设置所需的代码量。


一个复选框有两种状态,被选中(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文件中读入。