4.7 单选按钮与复选框

如图4.8所示,喜欢在网上冲浪的读者应该很熟悉类似的界面。其中,用来选择性别的控件叫做单选按钮,选择爱好的控件叫做复选框。单选按钮与复选框的主要区别是:单选按钮只能在一组选项里选择一个,如性别;复选框可以在一组选项里选择多个,也可以一个都不选,如图中的爱好。

图4.8 单选按钮与复选框应用举例

4.7.1 单选按钮

单选按钮的常用属性有Caption、Value、Alignment和Style,常用事件有Click事件。

1. Caption属性

Caption属性用于设置单选按钮的标题。如图4.7中的“男”、“女”等就是改变了单选按钮控件的Caption属性。

2. Value属性

该属性用来表示单选按钮的状态。对于单选按钮有两种操作,即选择和取消选择。选择的方法是用鼠标左键单击该单选按钮;取消选择的方法是单击其他单选按钮。因此,单选按钮也有两种状态,即被选择状态(内部有黑色圆点)和不被选择状态(内部没有黑色圆点)。当单选按钮在选择状态时其Value属性为True,而在不被选择状态时其Value属性为False。例如,图4.7中的第一个单选按钮(标题为“男”)的Value属性为True,第二个单选按钮的Value为False。该属性也可以通过程序设置。例如:

        Option2.Value = True

其含义为将单选按钮Option2的状态改为被选择状态,即Option2内会出现黑色圆点。

3. Alignment属性

该属性用来设置单选按钮标题的对齐方式,其取值范围为0和1,具体值的含义如表4.8所示。

表4.8 Alignment属性取值

4. Style属性

该属性用来设置单选按钮的显示方式,以改善视觉效果。其取值范围也是0和1。具体值的含义如表4.9所示。

表4.9 Style属性取值

5. Click事件

单击单选按钮时会触发该事件或者将单选按钮的Value属性设置为True时该事件同样会被触发。

【实例4.6】如图4.9所示,在文本框中输入文字后,可以通过单击下面的单选按钮改变文本框中文字的对齐方式。

图4.9 实例4.6界面

程序中各对象的属性设置如表4.10所示。

表4.10 实例4.6对象的属性设置

因为单击单选按钮时才会发生文本对齐的动作,所以应当在单选按钮的Click事件内写入代码。具体代码如下。

        01   Private Sub optCenter_Click()
        02         txtShowWord.Alignment = 2
        03   End Sub
        04
        05   Private Sub optLeft_Click()
        06         txtShowWord.Alignment = 0
        07   End Sub
        08
        09   Private Sub optRight_Click()
        10         txtShowWord.Alignment = 1
        11   End Sub

【代码分析】文本框的对齐方式由Alignment属性控制。通过代码改变对齐方式的语句应该写成:

        txtShowWord.Alignment = 0 或1 或2

让文本左对齐时赋值0给Alignment属性,居中时赋值2,右对齐时赋值1。如代码第06、02和10行所示。

4.7.2 复选框

复选框的常用属性和事件与单选按钮的基本上一样。只是其Value属性与单选按钮的Value属性有较大的区别。复选框的Value属性的取值范围为0、1或2。其中:

❑0—表示没有选择该控件。

❑1—表示选中了该控件。

❑2—表示该控件被禁止使用(以灰色显示)。

【实例4.7】分析下面的程序。界面如图4.10所示。

图4.10 实例4.7运行界面

【运行效果】

❑假设选择了足球和乒乓球并单击“确定”按钮后会跳出一个消息框如图4.11所示。

❑假设没有选择任何爱好直接单击“确定”按钮,在跳出的消息框内显示“您没有选择爱好!”。

各对象的属性设置如表4.11所示。

图4.11 消息框

表4.11 实例4.7对象的属性设置

本实例代码如下。

        01   Private Sub cmdOk_Click()
        02         Dim msg As String                        '声明了一个字符串变量
        03         msg = "您选择的体育爱好是:"               '给变量赋值
        04         If chk1.Value = 1 Then msg = msg & "足球 "  '如果选择了chk1,则在原来的字符串上连接"足球"
        05         If chk2.Value = 1 Then msg = msg & "羽毛球 "'如果选择了chk2,则在原来的字符串上连接"羽毛球"
        06         If chk3.Value = 1 Then msg = msg & "篮球  "'如果选择了chk3,则在原来的字符串上连接"篮球"
        07         If chk4.Value = 1 Then msg = msg & "乒乓球 "'如果选择了chk3,则在原来的字符串上连接"乒乓球"
        08         '如果没有选择任何复选框,则给msg变量赋"您没有选择爱好!"
        09         If chk1.Value = 0 And chk2.Value = 0 And chk3.Value = 0 And chk4.Value = 0
                  Then msg = "您没有选择
        10                爱好!"
        11         MsgBox msg
        12   End Sub

【代码说明】代码第04~07行通过chk.Value属性来判断是否选择了这个复选框。代码第09~10行看起来有些复杂,其实是判断这4个复选框是否都没有被选中。

4.7.3 框架

单独使用框架控件没有什么意义。其主要用途是为了将窗体上的控件分组,而且通常是为了把单选按钮分成若干组。因为不管窗体上有多少个单选按钮,用户却只能选择其中的一个。但是在实际应用中有时有多组选项,希望在每组选项中各选一项,这时用框架将这些单选按钮分组就很有意义了。

注意

要将控件放入框架中时,必须将控件画到框架内部或者粘贴到框架内部,这时移动框架时控件也会随着被移动。否则如果先画到窗体上然后移动到框架内的控件是不属于该框架的,既不会起到分组的效果,移动框架时控件也不会被移动。

4.7.4 应用案例—文本编辑器

【实例4.8】编写一个简单的文本编辑器,如图4.12所示。

图4.12 实例4.8运行界面

【运行效果】当选择好了字体、字号和字形之后单击“窗口”下面的“应用”按钮时,文本框中的文本会随着设置而改变其字体、字号和字形。

各对象的属性设置如表4.12所示。

表4.12 实例4.8对象的属性设置

编写程序如下。

        01   Private Sub cmdApply_Click()
        02         Dim strfont As String
        03         Dim numsize As Integer
        04
        05         If optFont1.Value = True Then strfont = "宋体"
        06         If optFont2.Value = True Then strfont = "黑体"
        07         If optFont3.Value = True Then strfont = "楷体_GB2312"
        08
        09         If optSize1.Value = True Then numsize = 10
        10         If optSize2.Value = True Then numsize = 20
        11         If optSize3.Value = True Then numsize = 30
        12
        13         If chk1.Value = 1 Then
        14                 txtShowWord.FontBold = True
        15         Else
        16                 txtShowWord.FontBold = False
        17         End If
        18         If chk2.Value = 1 Then
        19                 txtShowWord.FontItalic = True
        20         Else
        21                 txtShowWord.FontItalic = False
        22         End If
        23         If chk3.Value = 1 Then
        24                 txtShowWord.FontUnderline = True
        25         Else
        26                       txtShowWord.FontUnderline = False
        27         End If
        28
        29         txtShowWord.FontName = strfont
        30         txtShowWord.FontSize = numsize
        31   End Sub

【代码说明】代码第05~11行用来判断窗体中所有的单选按钮是否被选择;代码第13~27行用来判断窗体中的复选框是否被选择;代码第29~30行是根据单选按钮的选择结果来设置字体和字号。

【常见错误分析】运行程序后,大部分读者不会遇到麻烦。但是,肯定会有一部分人的程序会出现错误提示,如图4.13所示。

图4.13 实例4.8错误提示

此时,可以单击错误提示窗口中的“结束”按钮,结束程序的运行,然后回到代码窗口中一条条语句的找错误。当然,这种做法是不被提倡的。通常的做法是遇到错误提示窗口时单击“调试”按钮,这时Visual Basic集成开发环境里会出现代码编辑器窗口,其中一条语句以黄色背景显示,如图4.14所示。这就是Visual Basic给使用者提供的自动找错的功能,那条有黄色背景的语句就是当前错误的根源。

说明

要从调试状态回到设计状态,可以单击工具栏上的“结束”快捷按钮。

知道了错误的根源后,一起来分析一下错误的原因吧。错误提示窗口中显示的内容是“无效属性值”,因此带有黄色背景的语句错误的原因初步判定为给txtShowWord. FontName属性赋了无效的值,即变量strfont中的值有问题。分析了给strfont赋值的3条语句后会发现:如果3个If语句都不执行,则strfont就不会被赋值,仍旧保持默认值,即空字符串。从而赋给txtShowWord.FontName属性的值为空字符串。而那3个If语句没有执行的原因是其后条件表达式都为假,即optFont1、optFont2和optFont3三个单选按钮都没有被选择。

图4.14 调试状态下的代码窗口

接下来,仔细看图4.13错误提示窗口后面的程序界面。不难发现,出错的原因就是因为没有在字体框架里选择任何单选按钮,而直接单击“应用”按钮造成的。其实,字号也会出现这样的错误,只是Visual Basic还没有检测到而已。上面的错误是一种较典型的错误,它并非是语法错误,而是因为思维不严谨所致,在编程时应当注意。并且应当学会给程序设置不同的输入数据和状态来测试程序的健壮性。解决本例错误的方法有如下两种。

❑方法1:在紧挨着变量声明的下方,给变量赋值,在程序设计中将这种赋值操作叫做初始化,如图4.15所示。

❑方法2:当窗体加载时在每一组里都指定一个默认单选按钮。为了达到此目的,应当在窗体的Form_Load()事件中加入如下语句。

        optFont1.Value = True
        optSize1.Value = True

如果采用了方法2,其执行过程是:当运行程序后,窗体被加载的一刹那,就会触发Form_Load()事件,随即执行了该事件过程内的代码,因此窗体出现在屏幕上的时候,其内的optFont1(宋体)和optSize1(10)两个单选按钮的状态为被选中状态。在编程时,经常会用方法2来设置控件的初始状态和初始值。修改完程序后,读者可以重新运行程序,并设计不同的单选按钮的选择状态测试本实例。

图4.15 错误解决方法1