资源描述
用户界面设计
1. VB控件
VB控件可以分为3类:标准控件、ActiveX控件和可插入对象。
2. 单选按钮和复选框
单选按钮和复选框的常用属性是Value,它的主要作用是用来检查单选按钮或复选框是否被选定。单选按钮Value属性值是逻辑型,而复选框Value属性值是数值型。
单选按钮和复选框都能响应Click事件,但通常不需要编写事件过程。
3. 框架
框架的主要作用是将其他控件组合在一起,对一个窗体中的各种功能进行分类,以便于用户识别。
4. 滚动条
滚动条的主要属性有Max、Min、Value、SmallChange和LargeChange,主要事件有Change和Scroll。
拖动滑块时发生Scroll事件,单击两端的箭头或空白处不会产生Scroll事件。
滚动条的Change事件是当Value属性值改变时产生的事件。拖动滑块过程Value属性值不会改变,不会产生Change事件。但是,拖动滑块结束时Value属性值会改变,应产生Change事件。
5.定时器
定时器特有的常用属性是Interval,它的值以0.001秒为单位。
当定时器的Enabled属性为True时,Timer事件以Interval属性值的毫秒间隔发生。如果将定时器的Enabled属性设为False或Interval属性设为0时计时器停止运行,则Timer事件不会发生。
Timer是定时器的唯一事件。
6. 图形框和图像框
图形框(PictureBox)和图像框(Image)都可以用来显示图形。图形框还有一个特殊功能是作为容器放置其他控件。
图形框和图像框共有的一个主要属性是Picture,其值是显示的图片。在程序设计时,可以直接设置;在程序运行时,可以通过LoadPicture函数设置,或者赋值另外一个图形框或图像框中的图形。
图形框还有一个主要属性是Autosize,用于控制图形框的大小。
图像框还有一个主要属性是Stretch,用于决定调整图像框大小以适应图形,还是调整图形大小以适应图像框。
7. 对话框
在VB应用程序中,对话框有三种:预定义的对话框、通用对话框和用户自定义对话框。
预定义对话框是系统定义的对话框,可以调用如InputBox、MsgBox等函数直接显示。
通用对话框向用户提供了打开、另存为、颜色、字体、打印和帮助六种类型的对话框。使用它们可以减少设计程序的工作量。
自定义对话框是具有特殊的属性设置的窗体。作为对话框的窗体的BorderStyle、ControlBox、MaxButton和MinButton应分别为1、False、False和False。
对话框分成模式的和无模式的。
8. 菜单
菜单有两种类型:下拉式菜单和弹出式菜单。
每一个菜单项都是一个控件,有Click事件。在程序运行期间,如果用户单击菜单项,则运行该菜单项的Click事件过程。
不管是下拉式菜单还是弹出式菜单,都是在菜单编辑器中设置的。弹出式菜单需要在程序中使用PopupMenu方法显示,而下拉式菜单在程序开始时会自动显示。
9. 窗体
(1)窗体的常用方法和语句有:Load、Unload、Show和Hide。
(2)窗体之间的相互访问共有三种形式:
l 一个窗体可以在直接访问另一个窗体上控件的属性:另一个窗体名.控件名.属性
l 一个窗体直接访问在另一个窗体中定义的全局变量:另一个窗体名.全局变量名
l 在模块中定义公共变量实现相互访问,这是最常用的方法。
在使用“工程|添加窗体”命令添加一个现存窗体时经常会发生加载错误,绝大多是因为窗体名称冲突的缘故。例如,假定当前打开了一个含有名称为Form1的工程,如果想把属于另一个工程的Form1窗体装入时,则肯定会出错。
在一个工程中,绝对不能同时出现两个窗体名称相同的窗体。对于多窗体程序的加载必须通过.vbp文件,它把属于该工程的所有文件装入内存。如果直接打开多窗体程序中的某一个窗体文件,只能加载该窗体文件,其他文件不能自动装入内存,程序运行时将出现对象不存在错误,
此外,对于多窗体程序,当窗体增加或删除后,必须重新保存工程文件,否则,工程文件不能反应这一变化。
当用Show方法调用其他窗体时,被调用的窗体必须是窗体对象名,而不应是窗体文件名。否则,会产生实时错误424,要求对象
Load语句将窗体装入内存并设置窗体的Visible属性为False(无论在设计时如何设置Visible属性),即窗体用Load语句加载到内存后并不立即显示,需要用Show方法或将窗体的Visible属性设置为True才可显示。
列表框控件
列表框(ListBox)控件是一个显示多个项目的列表,便于用户选择一个或多个列表项目,但不能直接修改其中的内容。列表框控件实质就是一维字符数组,以可视化形式直观显示其项目列表。
1.主要属性
表1 列表框的主要属性
属性
类型
说明
List
字符数组
存放列表项目值。第1个元素下标为0。
ListIndex
整型
程序运行时被选定的项目的序号,未选中则该值为-1
ListCount
整型
列表框中项目的总数,项目下标0~ListCount-1
Sorted
逻辑型
决定在程序运行期间列表框中的项目是否进行排序
Text
字符型
被选定项目的文本内容
注意:List1.List(List1.ListIndex)等于List1.Text。
2. 列表框主要的方法
(1) AddItem方法 把一个项目加入列表框。
形式:
列表框对象.AddItem 项目字符串 [,索引值]
其中:
项目字符串:是将要加入列表框的项目。
索引值:决定新增选项在列表框中的位置,原位置的项目依次后移;如果省略,则新增项目添加在最后。对于第一个项目,索引值为0。
(2) RemoveItem方法 从列表框删除由索引值指定的项目
形式:
列表框对象.RemoveItem 索引值
(3) Clear方法 清除列表框的所有项目内容
形式:
对象.Clear
3. 事件
列表框能够响应Click和DblClick事件。
3列表框和组合框应用
1.列表框应用
例1 设计一个如图1所示的程序。它对列表框具有随机产生、删除、添加、统计数据的功能。统计结果显示在如图2所示的窗体中。
图1 主窗体 图2 统计结果显示窗体
分析:列表框中的10个数据由Int(Rnd() * 100)随机产生。
【程序】
' “随机产生10个数据”事件过程
Sub Random_Click()
List1.Clear
Dim i, k As Integer
For i = 0 To 9
k = Int(Rnd() * 100) ' 产生10个随机数
List1.AddItem k ' 添加到列表框
Next
End Sub
' “删除最小值”事件过程,“删除最大值”、“添加数据”事件过程略
Sub DeleteMin_Click()
Dim i, m As Integer
m = 0
For i = 0 To List1.ListCount - 1
If List1.List(i) < List1.List(m) Then
m = i
End If
Next
List1.RemoveItem (m) ' 删除最小值选项
End Sub
“统计”事件过程
Sub Statistics_Click()
Dim i, m, n As Integer
Dim sum As Double
m = 0: n = 0
For i = 0 To List1.ListCount - 1 ' 求最小值、最大值及累加
If List1.List(i) < List1.List(m) Then
m = i
End If
If List1.List(i) > List1.List(n) Then
n = i
End If
sum = sum + List1.List(i)
Next
Form2.Show
Form2.Text1.Text = List1.List(m)
Form2.Text2.Text = List1.List(n)
Form2.Text3.Text = sum / (List1.ListCount - 1)
End Sub
数据文件
1.顺序文件及操作
顺序文件涉及的语句和函数见表1。
表1 顺序文件的有关函数和过程
打开
Open
Open 文件名 For 模式 As [#]文件号
文件名可以字符串常量,也可以是字符串变量
写文件
Print #
Print(文件号, [输出列表])
按标准输出格式输出数据
Write #
Write #文件号, [输出列表])
按紧凑格式输出数据,即数据项之间插入“,”,并给字符串加上双引号。
读文件
Input
Input(文件号, 变量)
变量可以是任何类型,读一个数据
Line Input
变量=LineInput(文件号)
变量为字符串类型,读一行
关闭
Close
FileClose([文件号])
若缺省文件号,则关闭所有的文件
其他
LOF
LOF(文件号)
返回文件的字节数
EOF
EOF(文件号)
到达文件末尾时EOF为True,否则False
例1 设计一个如图1所示的文件加密程序。左边的文本框显示打开的文件内容,右边的文本框显示经加密的内容。
窗体上除了图中所见的控件之外,还有通用文件对话框CommonDialog1。
' “打开文件”按钮事件过程。
Sub Command1_Click()
Dim InputData As String * 1
CommonDialog1.ShowOpen
Fname = CommonDialog1.FileName
Open Fname For Input As #1
Text1.Text = ""
With ProgressBar1
.Min = 0
.Max = LOF(1)
.Visible = True
.Value = 0
End With
Do While Not EOF(1)
InputData = Input(1, #1)
Text1.Text = Text1.Text + InputData
ProgressBar1.Value = ProgressBar1.Value + 1
Loop
ProgressBar1.Value = 1000
Close #1
End Sub
' “保存文件”按钮事件过程
Sub Command3_Click()
CommonDialog1.ShowSave
Open CommonDialog1.FileName For Output As #1
Print #1, Text1.Text
Close #1
End Sub
例2 设计一个如图2所示的应用程序。要求:
(1)选择“打开文件”弹出一个通用对话框,选择文件后显示在文本框中
(2)选择“保存文件”后弹出通用对话框,确定文件名后保存;
(3)选择“查找下一个”就在文本文件中查找单词“VB”,找到后以高亮度显示。若再选择“查找下一个”,则继续查找。
图2 文本文件的处理
分析:该题主要难度是在文本框中找特定的子串,并以高亮度显示。这通过InStr函数实现查找,SelStart、SelLength属性实现高亮度显示。InStr函数的另一种使用形式为:
InStr(开始位置, 字符串1, 字符串2)
说明:InStr函数的功能是在字符串1中从开始位置后查找字符串2的出现位置。
【程序】
' “查找下一个”按钮事件过程
Sub Command1_Click()
Static j% ' 静态变量,保值,保留前一次查找到的位置
Text1.SetFocus
j = InStr(j + 1, Text1, "VB") ' 从原来找到的"VB"下一个字符起继续查找
If j > 0 Then
Text1.SelStart = j - 1 ' 以高亮度显示从第j个字符起的内容
Text1.SelLength = 2
j = j + 1
Else
MsgBox "找不到"
End If
End Sub
基本算法
1.数列求和,最值,均值(见列表框中的例4)
2.素数判定
3.回文数判定
4.数据排序
5.函数与子过程调用
例1编写一个程序,判断输入的一个数是否为素数(或称质数),是素数的在图片框显示。
素数就是除1和本身以外,不能被其他任何整数整除的数。根据此定义,要判别某数m是否为素数最简单的方法就是依次用i=2~ m-1去除,只要有一个数能整除m,m就不是素数;否则m是素数。
程序运行如图1所示,程序如下:
Private Sub Command1_Click()
Dim i%, m%
m = Val(Text1)
For i = 2 To m - 1
If (m Mod i) = 0 Then GoTo NotM ‘ m能被i整除,转向标号NotM
Next i
Picture1.Print m & " 是素数" ‘ m不能被i=2~m-1整除,显示m是素数,
NotM:
End Sub
图1 运行结果
程序中用到GoTo语句,当m能被某i的值整除,m就不是素数,利用GoTo语句退出循环。这虽然效率高,但不符合结构化程序设计的规定:少用或不用GoTo语句。改进的方法,增加一个逻辑型状态变量Tag,用以判断是否被整除过,改进的程序如下:
Private Sub Command1_Click()
Dim i%, m%, Tag As Boolean
m = Val(Text1)
Tag = True ‘ Tag为真,假定是素数
For i = 2 To m - 1
If (m Mod i) = 0 Then Tag = False ‘m能被i整除,该m不是素数,Tag为假
Next i
If Tag Then Picture1.Print m & " 是素数" ‘ Tag 为真,即m没有被2~m-1整除过,m是素数
End Sub
注意:把循环终值改为m/2或Sqr(m)可以提高效率。
例2 编一个程序,显示有n个数的非波那契数序列,且每行显示5个数。
分析:所谓非波那契数序列: 除序列中第1和第2两个元素均为1 外,序列中某个元素的值是其前两个元素的和,编写程序输入序号n,显示前n个非波那契数序列。
Private Sub Command1_Click()
Dim x() As Integer
图2 非波那契数序列
Dim n%, i%
n = Val(InputBox("输入序列数"))
ReDim x(n - 1)
x(0) = 1
x(1) = 1
For i = 2 To n - 1
x(i) = x(i - 1) + x(i - 2)
Next i
For i = 0 To n - 1
Print x(i),
If (i + 1) Mod 5 = 0 Then Print
Next
End Sub
程序运行后,当输入n的值为16时,显示结果如图2所示。
例3分类统计是将一批数据中按分类的条件统计每一类中包含的个数。这类问题一般要掌握分类的条件表达式的构成和为每一类设置计数器(变量),进行相应的计数。
现要求输入一串字符,统计各字母出现的次数(大小写字母不区分),并对出现的字母显示其出现的个数,效果如图3所示。
图3 统计各字母出现的次数
分析:
① 统计26个字母出现的个数,必须声明一个具有26个元素的数组,每个元素的下标表示对应的字母,元素的值表示对应字母出现的次数。
② 从输入的字符串中逐一取出字符,转换成大写字符(使得大小写不区分),进行判断。
程序如下:
Private Sub Command1_Click()
Dim a(1 To 26) As Integer, c As String * 1
le = Len(Text1) ‘求字符串的长度
For I = 1 To le
c = UCase(Mid(Text1, I, 1)) ‘取一个字符,转换成大写
If c >= "A" And c <= "Z" Then
j = Asc(c) - 65 + 1 ‘将A~Z大写字母转换成1~26的下标
a(j) = a(j) + 1 ‘对应数组元素加1
End If
Next I
For j = 1 To 26 ‘输出字母及其出现的次数
If a(j) > 0 Then Picture1.Print " "; Chr$(j + 64); "="; a(j);
Next j
End Sub
例4编一函数过程IsH(n),对于已知正整数n,判断该数是否是回文数,函数的返回值类型为布尔型。主程序调用IsH函数过程求解1000以内回文数,并显示在文本框或列表框内。
提示
① 所谓回文数是指顺读与倒读数字相同,即指最高位与最低位相同,次高位与次低位相同,依次类推。当只有一位数时,也认为是回文数。
② 回文数的求法,只要对输入的数(按字符串类型处理),利用MID函数从两边往中间比较,若不相同,就不是回文数。
例5 验证歌德巴赫猜想:任意一个大于2的偶数都可以表示成两个素数之和。编程,将6-100之间的全部偶数表示为两个素数之和,结果在列表框显示,最后Label1显示共有多少对素数之和,效果如图4所示。
图4 运行界面
分析:
本题在函数过程是对形参m判断是否是素数,若m是素数,函数的返回值为True,否则False。
主调程序要将一个偶数分解成两个素数分别调用函数。
程序
Private Sub Command1_Click()
Dim Even%, Odd1%, Odd2%
For Even = 6 To 100 Step 2
For Odd1 = 3 To Even / 2
If prime(Odd1) Then
Odd2 = Even - Odd1
If prime(Odd2) Then
List1.AddItem Even & "=" & Odd1 & "+" & Odd2
n = n + 1
End If
End If
Next Odd1
Next Even
Label1 = "6和100之间有" & n & "对素数和"
End Sub
Function prime(m%) As Boolean ‘ 求素数函数
prime = True
For i = 2 To Sqr(m)
If m Mod i = 0 Then
prime = False
Exit Function
End If
Next i
End Function
例6 数组排序:选择法排序,冒泡法排序
(1)选择法按升(降)序排序:每一轮找到的最小(大)数的下标位置,与欲排序序列中的第i 个位置上的数交换。
程序如下:
Private Sub Command1_Click()
Dim a(), iMin%, n%, i%, j%, t%
a = Array(8, 6, 9, 3, 2, 7)
n = UBound(a) ‘ 获得数组的下标上界
For i = 0 To n - 1 ‘ 进行n轮比较
iMin = i ‘ 对第i轮比较时,初始假定第i个元素最小
For j = i + 1 To n ‘ 在数组 i+1~n个元素中选最小元素的下标
If a(j) < a(iMin) Then iMin = j
Next j
t = a(i) ‘ i+1~n个元素中选出的最小元素与第i个元素交换
a(i) = a(iMin)
a(iMin) = t
Next i
For i = LBound(a) To UBound(a) ‘ 输出排序的结果
Print a(i);
Next
End Sub
(2)冒泡法排序
若有N+1个数的数组a(N),按小到大用冒泡法排序。
冒泡法排序:
对两两相邻的元素比较,即a(j)与a(j+1)比较,若为逆序,则交换。
Private Sub Command1_Click()
Dim a(), iMin%, n%, i%, j%, t%
a = Array(8, 6, 9, 3, 2, 7)
n = UBound(a) ‘ 获得数组的下标上界,数组共有n+1个数
For i = 0 To n - 1 ‘ 有n+1个数,进行n趟比较
For j = 0 To n - 1 - i ‘ 在每一趟比较对0~n-1-i的元素两两相邻比较,大数沉底
If a(j) > a(j + 1) Then
t = a(j): a(j) = a(j + 1): a(j + 1) = t ‘次序不对交换
End If
Next j
Next i
For i = 0 To n: Print a(i);: Next i
End Sub
例7随机产生10个2位数,按大到小递减的次序排列,并将排序结果显示。
展开阅读全文