# OptionButton 控件应用方案

## 知识讲解

#### 1．功能

OptionButton 控件又称为单选按钮控件，通常用于显示一个可以打开或者关闭的选项。

#### 2．属性

OptionButton 控件的常用属性介绍如表 1 所示。

表 1 OptionButton 控件的常用属性

编号 | 属性 | 说明
1 | DisabledPicture | 返回或设置一个对图片的引用，该图片在控件无效时显示在控件中
2 | DownPicture | 返回或设置一个对图片的引用，该图片在控件被单击并处于按下状态时显示在控件中
3 | MaskColor | 返回或设置一个在按钮的图片中作为“掩码”（即透明状态时）的颜色
4 | Picture | 返回或设置控件中要显示的图片
5 | Style | 返回或设置一个值，该值用来指示控件的显示类型和行为。该属性在运行时为只读
6 | UseMaskColor | 返回或设置一个值，该值决定了赋值给 MaskColor 属性的颜色是否被用作“掩码”
7 | Value | 返回或设置控件的状态

下面对比较重要的属性进行详细介绍。

（1）MaskColor 属性

返回或设置一个在按钮的图片中作为“掩码”的颜色。

语法：

object.MaskColor[= color]

object：对象表达式。

color：一个决定作为掩码的颜色的值或常数。

（2）Style 属性

返回或设置一个值，该值用来指示控件的显示类型。该属性在运行时只读。

语法：

object.Style

object：对象表达式。

Style：该值用于指定控件的样式。当设置值为 0 时，控件显示为在其旁边有一个标签的选项按钮；当设置值为 1 时，控件以图形的样式显示，此时 OptionButton 控件显示为类似 CommandButton 控件的样式。

将 OptionButton 控件的 Style 属性设置为不同值时的效果，如图 1 所示。

图 1 Style 属性值从左到右分别是 0，1

（3）Value 属性

返回或设置控件的状态。

语法：

object.Value[= value]

object：对象表达式。

value：该值指定控件的状态，当设置值为 True 时，表示已经选择了该控件；当设置值为 False 时，表示没有选择该控件。

示例：

下例中，在窗体启动时将 Option1 控件的 Value 属性设置为 False，将 Option2 控件的 Value 属性设置为 True，则运行时 Option2 控件将处于被选中的状态，如图 2 所示。

图 2 Value 属性应用示例

程序完整代码如下：

'窗体启动时设置单选按钮控件状态

Private Sub Form_Load()

Option1.Value = False

Option2.Value = True

End Sub

## 应用一：启动时设置 Option 控件非选状态

窗体启动时，如果 OptionButton 控件组中所有 OptionButton 控件均为非选状态，系统会自动设置其中一个 OptionButton 控件为选中状态。如果想让窗体启动时所有 OptionButton 控件均处于非选状态。

最终效果如图 3 所示。

图 3 启动时设置 Option 控件非选状态

程序代码如下：

★★★★★ Form1 ★★★★★★

'窗体启动时设置 Option 控件非选状态

Private Sub Form_Activate()

Dim mycontrol As Control '声明 Control 类型变量

For Each mycontrol In Me.Controls '遍历 Controls 集合

'如果对象类型为 OptionButton 就将该对象的 Value 属性设置为 False

If TypeOf mycontrol Is OptionButton Then mycontrol.Value = False

Next

End Sub

## 应用二：如何实现两组 Option 控件互不关联

OptionButton 控件显示一个可以打开或者关闭的选项。在选项组中用 OptionButton 显示选项，用户只能选择其中的一项。为实现两组 Option 控件互不关联，可以将两组 Option 控件分别放在不同容器中，如 Frame 控件、PictureBox 控件，同一容器中的 OptionButton 控件为一个组。

最终效果如图 4 所示。

图 4 实现两组 Option 控件

## 应用三：利用 OptionButton 控件设计赛跑比赛

本例中利用 Value 属性实现赛跑的小游戏。在程序运行时，选择你认为跑得最快的选手，然后单击【开始】按钮，开始比赛，其实现界面如图 5 所示。

图 5 赛跑进行中界面

完整程序代码

Dim start, finish, money As Integer

'利用 OptionButton 控件设计赛跑比赛

Private Sub Command1_Click()

If Option1(0).Value = False And Option1(1).Value = False And Option1(2).Value = False And Option1(3).Value = False Then '当所有单选框都为未选定状态时

MsgBox "请选择选手", , "信息提示" '提示对话框

Else '否则

For i = 0 To 3 '循环

If Option1(i).Value = True Then '当某单选框被选中时

Exit For '退出循环

Else '否则

If i = 3 Then '当 i 等于 3

Exit Sub '跳出过程

End If

End If

Next i

money = money – 20 '减少 20

Label2.Caption = money '显示 money 值

Command1.Enabled = False '按钮禁用

Do 'Do 循环

no = Int(Rnd * 4) '生成随 0-3 随机数

wit = Int(Rnd * 21) + 23 '生成 0 到 20 随机数

'移动 Image1 数组元素的位置

Image1(no).Move Image1(no).Left + wit, Image1(no).Top

pause (0.03) '调用 pause 过程延时 0.03 秒

Loop Until Image1(no).Left + Image1(no).Width > finish

If Option1(no).Value = True Then

MsgBox Option1(no).Caption + "赢了！"

money = money + 60

Label2.Caption = money

Else

MsgBox "你输了！"

End If

If money = 0 Then

MsgBox "你已经没赌注了！"

Else

Command1.Enabled = True

End If

For i = 0 To 3

Option1(i).Value = False

Image1(i).Left = start

Next i

End If

End Sub

'退出程序

Private Sub Command2_Click()

End

End Sub

'窗体启动并进行初始化

Private Sub Form_Load()

Randomize Timer

start = Image1(0).Left

finish = 6000

money = 100

Label2.Caption = money

End Sub

Sub pause(x)

w = Timer

Do While Timer - w <= m

wait = DoEvents

Loop

End Sub

## 应用四：单选框控件（OptionButton）在工程中的应用

OptionButton 控件显示一个可以打开或者关闭的选项。例如在人员信息录入中，可以使用 OptionButton 控件选择性别，如图 6 所示。

图 6 职工档案登记界面

Value 属性选项按钮的 Value 属性指出是否选定了此按钮。选定时，数值将变为 True。可在代码中设置选项按钮的 Value 属性来选定按钮。例如：Opt1.Value=true

可用每个 OptionButton 控件的 Value 属性判断用户选定的选项并作出相应的响应。

对于没有分组的 OptionButton 控件，可用如下方法来判别：

'选择单选框内容并将值显示在文本框 1 中

Private Sub Option1_Click()

If Option1.Value = True Then

text1.Text = Option1.Caption

End If

End Sub

当用鼠标单击 OptionButton 控件（Option1）时，表示选中 Option1 控件，处理相应过程。

OptionButton 控件也可以以选项按钮组的形式出现，只要把每一组置于一个图片框或 Frame 框架内（这两个控件起到容器的作用），如图 7 所示。

图 7 打印参数设置界面

把 OptionButton 控件放入图片框或 Frame 框架内可按如下步骤：首先把图片框或 Frame 框架放置在窗体内，然后单击 VB 工具箱中的 OptionButton 控件。选中该控件用鼠标将其移入图片框或 Frame 框架内，按住鼠标左键在图片框或 Frame 框架内画出 OptionButton 控件。

对于分组的 OptionButton 控件 Option1（Index），可用如下的 Click 事件来判别：

'分组的 OptionButton 控件 Option1（Index），用 Click 事件来判别各组的具体情况

Private Sub Option1_Click(Index As Integer)

Select Case Index

Case 0

...

Case 1

...

...

End Select

End Sub

## 应用五：文件数据自动备份

### 实例说明

数据自动备份在应用软件中显得尤为重要。运行程序，选择要读取的文本文件，单击“设置备份”按钮，在弹出的窗口中设置文件自动备份的时间，单击“确定”按钮保存设置，这样，程序就会根据用户的设置自动备份该文本文件。实例运行结果如图 8 所示。

图 8 文件数据自动备份

### 思路与技术

利用 Open 语句保存或读取文件信息，将设置备份时间的数值保存到文本文件中，通过 Timer 控件时刻检测是否应该进行文件备份操作。

Open 语句的语法格式如下：

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

参数说明：

l pathname 必要的。字符串表达式，指定文件名，该文件名可能还包括目录、文件夹及驱动器。

l mode 必要的。关键字，指定文件方式，有 Append、Binary、Input、Output 或 Random 方式。如果未指定方式，则以 Random 访问方式打开文件。

l access 可选的。关键字，说明打开的文件可以进行的操作，有 Read、Write 或 Read Write 操作。

l lock 可选的。关键字，说明限定于其他进程打开的文件的操作，有 Shared、Lock Read、Lock Write 和 Lock Read Write 操作。

l filenumber 必要的。一个有效的文件号，范围在 1 到 511 之间。使用 FreeFile 函数可得到下一个可用的文件号。

l reclength 可选的。小于或等于 32，767（字节）的一个数。对于用随机访问方式打开的文件，该值就是记录长度。对于顺序文件，该值就是缓冲字符数。

### 开发步骤

（1）新建一个标准工程，创建一个新窗体。

（2） 在 Form1 窗体上添加一个 Frame 控件，设置其 Caption 属性为“选择要读取的文本文件”。

（3）在 Frame1 控件中添加一个 TextBox 控件和一个 CommandButton 控件，并设置 Command1 的 Caption 属性。

（4）在 Form1 窗体上添加一个 TextBox 控件，设置其 MultiLine 属性为 Ture，ScrollBars 属性为 2-Vartical；添加 3 个 CommandButton 控件，设置其 Caption 属性分别为“编辑”、“设置备份”和“退出”。

（5）在 Form1 窗体上添加一个 Timer 控件，设置其 Interval 属性为 1000；添加一个 CommonDialog 控件，设置其“名称”属性为 Common1。

（6）选择 VB 菜单的“工程”→“添加窗体”，在工程中创建一个新窗体，默认的“名称”属性为 Form2。

（7）在 Form2 窗体上添加一个 Frame 控件，默认的“名称”属性为 Frame1。

（8）在 Frame1 控件中添加 3 个 OptionButton 控件，并分别设置其 Caption 属性。

（9）在 Form2 窗体上添加两个 CommandButton 控件，设置其 Caption 属性分别为“确定”和“取消”。

表 2 Form1 窗体中控件部分属性设置

控件名 | 属性 | 值
CommandButton | Name Caption | Command1 <<
CommandButton | Name Caption | Command2 编辑
CommandButton | Name Caption | Command3 设置备份
CommandButton | Name Caption | Command4 退出
CommonDialog | Name | Common1
Frame | Name Caption | Frame1 选择要读取的文本文件
Label | Name | Label1
Text | Name | Text1
Text | Name | Text2
Timer | Name Interval | Timer1 1000

表 3 Form2 窗体中控件部分属性设置

控件名 | 属性 | 值
CommandButton | Name Caption | Command1 确定
CommandButton | Name Caption | Command2 取消
Frame | Name | Frame1
OptionButton | Name Caption | Option1 每天备份
OptionButton | Name Caption | Option2 每月备份
OptionButton | Name Caption | Option3 每小时备份

（10）为 Form1 窗体添加如下代码。

Dim Intext As String

Dim TStr As String

Dim i As Integer

'单击按钮 1，导入文件将路径和文本内容分别显示在文本框 1 和文本框 2 中

Private Sub Command1_Click()

Common1.Filter = "ini 文件（*.ini）|*.ini"

Common1.ShowOpen

If Common1.FileName = "" Then

Exit Sub

Else

Text2.Text = ""

Text1.Text = Common1.FileName

Open (Common1.FileName) For Input As #1

Do While Not EOF(1)

Line Input #1, Intext

Text2.Text = Text2.Text & Intext

Loop

Close #1

End If

End Sub

'单击编辑按钮，Text2 可编辑并设置光标焦点在 Text2 上

Private Sub Command2_Click()

Text2.Enabled = True

Text2.SetFocus

End Sub

'单击设置备份按钮，打开窗体 2

Private Sub Command3_Click()

Form2.Show 1

End Sub

'按要求备份文件后退出程序

Private Sub Command4_Click()

If TStr = "TD" Then '每天备份

Open (App.Path & "\Setday.ini") For Input As #1

Line Input #1, Intext

Close #1

If Trim(Intext) <> Str(Date) Then

Label1.Caption = "正在备份文件..."

Open (App.Path & "\DataBackup\" & Date & ".txt") For Output As #2

Print #2, Text2.Text

Close #2

Label1.Caption = ""

Open (App.Path & "\setday.ini") For Output As #3

Print #3, Date

Close #3

End If

ElseIf TStr = "TM" Then '每月备份

Open (App.Path & "\SetMonth.ini") For Input As #1

Line Input #1, Intext

Close #1

If Trim(Intext) <> Trim(Str(DatePart("m", Date))) Then

Label1.Caption = "正在备份文件..."

Open (App.Path & "\DataBackup\" & DatePart("m", Date) & "月份数据备份.txt") For Output As #2

Print #2, Text2.Text

Close #2

Label1.Caption = ""

Open (App.Path & "\SetMonth.ini") For Output As #3

Print #3, DatePart("m", Date)

Close #3

End If

End If

End

End Sub

'窗体 1 为活动窗口设置变量 TStr 的值

Private Sub Form_Activate()

Open (App.Path & "\Set.ini") For Input As #1

Line Input #1, Intext

If Intext = 1 Then

TStr = "TD"

ElseIf Intext = 2 Then

TStr = "TM"

ElseIf Intext = 3 Then

TStr = "TH"

End If

Close #1

End Sub

'窗体启动并初始化

Private Sub Form_Load()

Timer1.Enabled = True

i = 1

End Sub

'窗体 1 卸载时先按要求备份文件

Private Sub Form_Unload(Cancel As Integer)

If TStr = "TD" Then '每天备份

Open (App.Path & "\Setday.ini") For Input As #1

Line Input #1, Intext

Close #1

If Trim(Intext) <> Str(Date) Then

Label1.Caption = "正在备份文件..."

Open (App.Path & "\DataBackup\" & Date & ".txt") For Output As #2

Print #2, Text2.Text

Close #2

Label1.Caption = ""

Open (App.Path & "\setday.ini") For Output As #3

Print #3, Date

Close #3

End If

ElseIf TStr = "TM" Then '每月备份

Open (App.Path & "\SetMonth.ini") For Input As #1

Line Input #1, Intext

Close #1

If Trim(Intext) <> Trim(Str(DatePart("m", Date))) Then

Label1.Caption = "正在备份文件..."

Open (App.Path & "\DataBackup\" & DatePart("m", Date) & "月份数据备份.txt") For Output As #2

Print #2, Text2.Text

Close #2

Label1.Caption = ""

Open (App.Path & "\SetMonth.ini") For Output As #3

Print #3, DatePart("m", Date)

Close #3

End If

End If

End Sub

Private Sub Timer1_Timer()

If TStr = "TH" Then

i = i + 1

If i > 3600 Then

Label1.Caption = "正在备份文件..."

Open (App.Path & "\DataBackup\" & Format(Time, "hh-mm-ss") & ".txt") For Output As #1

Print #1, Text2.Text

Close #1

Label1.Caption = ""

i = 1

End If

End If

End Sub

（11）为 Form2 窗体添加如下代码。

'单击确定按钮设置变量的值

Private Sub Command1_Click()

Dim TN As Integer

If Option1.Value = True Then

TN = 1 '每天备份

ElseIf Option2.Value = True Then

TN = 2 '每月备份

ElseIf Option3.Value = True Then

TN = 3 '每小时备份

End If

Open (App.Path & "\set.ini") For Output As #1

Print #1, TN

Close #1

MsgBox "设置完成!", 64, "提示信息"

End Sub

'退出程序

Private Sub Command2_Click()

Unload Me

End Sub

'窗体启动时设置单选按钮状态

Private Sub Form_Load()

Open (App.Path & "\Set.ini") For Input As #1

Line Input #1, Intext

If Intext = 1 Then

Option1.Value = True

ElseIf Intext = 2 Then

Option2.Value = True

ElseIf Intext = 3 Then

Option3.Value = True

End If

Close #1

End Sub

'关闭窗体并设置变量的值

Private Sub Form_Unload(Cancel As Integer)

Dim TN As Integer

If Option1.Value = True Then

TN = 1 '每天备份

ElseIf Option2.Value = True Then

TN = 2 '每月备份

ElseIf Option3.Value = True Then

TN = 3 '每小时备份

End If

Open (App.Path & "\set.ini") For Output As #1

Print #1, TN

Close #1

End Sub