|
教师信箱:
VB_TJCU@Yahoo.com.cn
|
|
|
一、Visual Basic环境和程序设计初步 |
|||||||||||||||||||
|
1 |
Q |
在VB集成环境中没有显示“工具箱”等窗口? |
|||||||||||||||||
|
|
A |
只要选择“视图|工具箱”命令就可;同样选择“视图”菜单的有关命令可显示对应的窗口。 |
|||||||||||||||||
|
2 |
Q |
在编辑源程序时,显示“无效字符”? |
|||||||||||||||||
|
|
A |
在VB中只允许使用西文标点,任何中文标点符号在程序编译时产生“无效字符”错误,系统在该行以红色字显示。用户在进入VB后不要使用中文标点符号。中、西文状态下标点符号对照见表1.4所示。 表1.4 中、西文状态下标点符号对照
|
|||||||||||||||||
|
3 |
Q |
字母和数字混淆? |
|||||||||||||||||
|
|
A |
L的小写字母“l”和数字“ |
|||||||||||||||||
|
4 |
Q |
在运行程序时,显示“要求对象”的信息? |
|||||||||||||||||
|
|
A |
一般是控件对象名称(Name)属性写错。在窗体上创建的每个控件都有默认的名称,用于在程序中唯一地标识该控件对象。系统为每个创建的对象提供了默认的对象名,例如,Text1、Text2、Command1、Label1等。用户也可以将属性窗口的(名称)属性改为你所指定的可读性好的名称,如txtInput、txtOutput、cmdOk等。对初学者,由于程序较简单、控件对象使用较少,还是用默认的控件名较方便。 当程序中的对象名写错时,系统显示“要求对象”的信息,并对出错的语句以黄色背景显示。用户可以在代码窗口的“对象列表”框检查该窗体所使用的对象。 |
|||||||||||||||||
|
5 |
Q |
Name属性和Caption区别是什么? |
|||||||||||||||||
|
|
A |
Name属性的值用于在程序中唯一地标识该控件对象,在窗体上不可见;而Caption属性的值是在窗体上显示的内容。 |
|||||||||||||||||
|
6 |
Q |
在编写代码时,对象的属性名、方法名写错,为出现什么信息?如何防止? |
|||||||||||||||||
|
|
A |
当程序中对象的属性名、方法名写错时,VB系统会显示“方法或数据成员未找到”的信息。 在编写程序代码时,尽量使用自动列出成员功能,即当用户在输入控件对象名和句点后,系统自动列出该控件对象在运行模式下可用的属性和方法,用户按空格键或双击鼠标即可,这样既可减少输入也可防止此类错误出现。 |
|||||||||||||||||
|
7 |
Q |
变量名写错,为引起什么错误?如何防止? |
|||||||||||||||||
|
|
A |
用Dim声明的变量名,在后面的使用中表示同一变量而写错了变量名,VB编译时就认为是两个不同的变量。例如,下面程序段求1~100的和,结果放在Sum变量中: Dim sum As Integer, i As Integer Sum=0 For i =1 to 100 Sum=Sun+i Next i Print Sum 显示的结果为100。原因是累加和表达式Sum=Sun+i中的右边的变量名Sum写成Sun。 VB对变量声明有两种方式,可以用变量声明语句显式声明,也可以用隐式声明,即不声明直接使用。上述变量名的写错,系统为两个不同的变量各自分配内存单元,造成计算结果不正确。因此,为防止此类错误产生,必须对变量声明采用限制其为显式声明方式,也就是在通用声明段加Option Explicit语句。 |
|||||||||||||||||
|
8 |
Q |
语句书写位置有何规定?会出现何错误? |
|||||||||||||||||
|
|
A |
在VB中,除了在“通用声明”段利用Dim等对变量声明语句外,其他任何语句都应在事件过程中。 若写错位置,若在“通用声明”写了对变量赋制值等可执行语句,运行时会显示“无效外部过程”的信息。若要对模块级变量进行初始化工作,则一般放在Form_Load()事件过程中。 |
|||||||||||||||||
|
9 |
Q |
要重复建立多个同类的控件,用“复制”、“粘贴”的方法为何不行? |
|||||||||||||||||
|
|
A |
若要在窗体上创建多个命令按钮,有些读者会先创建一个命令按钮控件,然后利用对该控件进行复制、粘贴,这时系统显示: 已经有一个控件为“Command1”。创建一个控件数组吗? 的信息,若单击“是”按钮,则系统创建了名称为Command1的控件数组。若要对该控件的Click事件过程编程,系统显示的框架是: Private Sub Command1_Click (Index As Integer)
End Sub Index表示控件数组的下标。 若非控件数组,Click事件过程的框架是: Private Sub Command1_Click( )
End Sub 请读者注意直到学习第四章数组前,一律不使用控件数组。 |
|||||||||||||||||
|
10 |
Q |
Print方法中定位函数Tab、Spc的区别? |
|||||||||||||||||
|
|
A |
定位通过Tab、Spc函数和最后的逗号、分号和无符号来控制。VB中通过Print方法中各参数的综合使用达到所需的结果,但初学者往往难以掌握。 (1) Tab(n)与Spc(n)的区别 Tab(n)从最左第1列开始算起定位于第n列,若当前打印位置已超过n列,则定位于下一行的第n列,这是常常定位不好出现的问题。在格式定位中,Tab用得最多。 Spc(n)从前一打印位置起空n个空格。例如,下面程序段显示了Tab与Spc的区别,效果如图1.5所示。 Private Sub Command1_Click() Print "1234567890" Print Tab(1); " ** "; Tab(2); " %%% " ; Spc(2) ; "$$$$" End Sub
图1.5 运行效果例一 图1.6 运行效果例二 (2) 紧凑格式“;”分号的使用 紧凑格式“;”,即输出项之间无间隔。但对于数值型,输出项之间系统自动空一列,而由于数值系统自动加符号位,因此,大于零的数值,实际空两列。对于字符型之间无空格。 例如,下面程序段,效果如图1.6所示。 Private Sub Command1_Click() Print 1; -2; 3 Print "1234";"5678" Print "A"; "B"; "C"; "D"; "E"; "F"; "G"; "H" End Sub 从该例读者应区分数值和字符在紧凑格式输出的差异。 |
|||||||||||||||||
|
11 |
Q |
为什么打开工程时找不到对应的文件? |
|||||||||||||||||
|
|
A |
一般,一个再简单的应用程序也应由一个工程.vbp文件和一个窗体.frm文件组成。工程文件记录该工程内的所有文件(窗体.frm文件、标准模块.bas文件、类模块.cls文件等)的名称和所存放在磁盘上的路径。 若读者在上机结束后,把文件复制到软盘上保存,但又少复制了某个文件,下次打开工程时就会显示“文件未找到”。也有读者在VB环境外,利用Windows资源管理器或DOS命令将窗体文件等改名,而工程文件内记录的还是原来的文件名,这样也会造成打开工程时显示“文件未找到”。 解决此问题的方法:一是修改.vbp工程文件中的有关文件名;二是通过“工程”菜单的“添加窗体”中的“现存”选项,将改名后的窗体加入工程。 |
|||||||||||||||||
|
|
|
|
|
||||||||||||||||
|
二、VB语言基础和顺序结构 |
|||
|
1 |
Q |
同时给多个变量赋值,例要同时给x,y,z三个整型变量赋初值,书写x=y=z=1,在VB没有造成语法错而形成逻辑错? |
|
|
|
A |
在C语言中,上述语句是可以实现同时对多个变量赋值,而在VB中规定一句赋值语句内只能给一个变量赋值,但上述语句并没有产生语法错,运行后x,y,z中的结果均为0。 原因是VB将上述3个“=”表示不同的含义,最左的一个表示赋值号,其余表示为关系运算符等号;因此将y=z=1作为一个关系表达式,再将表达式的结果赋值给x。在VB中默认数值型变量的初值为0,根据上面错误1的分析类推,因此表达式y=z=1的结果为0,所以x赋得的值为0,y、z变量的值为默认值0。 |
|
|
2 |
Q |
在程序运行时,显示“子程序或函数未定义”信息,是何原因? |
|
|
|
A |
当出现该错误信息时,一般是标准函数名写错而引起。VB提供了很多标准函数,如IsNumeric()、Date()、Left()等。当函数名写错时,如将IsNumeric写成IsNummeric,系统显示“子程序或函数未定义”,并将该写错的函数名选中提醒用户修改。 如何判断函数名、控件名、属性、方法等是否写错,最方便的方法是当该语句写完后,按Enter键,系统把被识别的上述名称自动转换成规定的首字母大写形式,否则为错误的名称。 |
|
|
3 |
Q |
如何终止死循环? |
|
|
|
A |
当编写程序时考虑不周到,产生死循环(尤其使用第四章介绍的循环结构)时,只要同时按Ctrl+Break键就可终止死循环,找出死循环的原因,修改程序。 |
|
|
4 |
Q |
怎样声明局部变量和窗体级变量,使用它们的区别? |
|
|
|
A |
在VB程序中,除了大量的控件对象外,还要使用一些变量,暂时存放一些中间结果。这些变量的声明可以放在过程外的“通用声明”段(称为窗体级变量),也可以放在过程中(称为局部变量),怎样安置这些变量,初学者觉得有点头疼。 两者区别:窗体级变量在本窗体的所有过程中均可使用;而局部变量仅在变量所在的过程中可使用,也即随着本过程的执行而分配存储空间,当执行到EndSub语句,分配的内存空间回收,变量的值也丢失。 |
|
|
5 |
Q |
在Form_Load事件中,要想将焦点定位在某控件上,使用SetFocus方法为什么不起作用? |
|
|
|
A |
因为系统在窗体装入内存时无法同步地用SetFocus方法定位控件的焦点。解决的方法在属性窗口对要定位焦点的控件将其TabIndex值设置为0就可。 |
|
|
6 |
Q |
程序运行时对多个文本框间焦点移动的问题? |
|
|
|
A |
方法一:按“Tab”键。这时可不必编程,直接利用系统提供的功能方便地在各控件之间移动。若要确定离开或进入了哪个控件,则利用“控件_LostFocus”或“控件_GotFocus”事件进行判断。 方法二:按“回车“键。这时必须通过KeyPress事件编程来实现,有关程序段如下: Private Sub 某文本框_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then 另一控件.SetFocus End If … End Sub |
|
|
|
|
|
|
|
|
|
|
|
|
三、选 择 结 构 |
|||
|
1 |
Q |
If语句有书写问题? |
|
|
|
A |
在多行式的If块语句中,书写要求严格,即关键字Then、Else后面的语句语句块必须换行书写;单行式的If语句中,必须在一行上书写,若要分行,要用续行符。 对多行式的If块语句中,应有配对的End If语句结束。否则,在运行时系统会显示“块If没有End If”的编译错误。 |
|
|
3 |
Q |
Select Case语句的使用? |
|
|
|
A |
(1) “表达式列表i”中不能使用“变量或表达式”中出现的变量。例如,上述多边选择的例子改为Select Case语句实现,方法一Case子句中出现变量mark,运行时不管mark的值多少,始终执行Case Else子句,运行结果不正确;方法二、方法三正确。 方法一: 方法二: 方法三: Select Case mark Select Case mark Select Case mark Case mark >= 90 Case Is >= 90 Case Is >= 90 Print "优" Print "优" Print "优" Case mark >= 80 Case Is >= 80 Case 80 To 89 Print "良" Print "良" Print "良" Case mark >= 70 Case Is >= 70 Case 70 To 79 Print "中" Print "中" Print "中" Case mark >= 60 Case Is >= 60 Case 60 To 69 Print "及格" Print "及格" Print "及格" Case Else Case Else Case Else Print "不及格" Print "不及格" Print "不及格" End Select End Select End Select (2) 在“变量或表达式”中不能出现多个变量。实验三第3题对三门课程奖学金的判断,只能用If语句的多边选择,而不能用Select Case语句实现。例如,有些读者用如下语句表示: Select Case mark1, mark2, mark3 Case (mark1 + mark2 + mark3) / 3 >= 95 Print "一等奖" … End Select 这样就会在“Select Case mark1,mark2,mark (3)同样对Select Case语句也应有与其相对应的End Select语句。 |
|
|
四、循 环 结 构 |
|||
|
1 |
Q |
如何防止循环结构中出现不循环或死循环的问题? |
|
|
|
A |
主要是循环条件、循环初值、循环终值、循环步长的设置有问题。 例如,以下循环语句不执行循环体: For i= 10 To 20 Step –1 ' 步长为负,初值必须大于等于终值,才能循环 For i= 20 To 10 ' 步长为正,初值必须小于等于终值,才能循环 Do While False ' 循环条件永远不满足,不循环 例如,以下循环语句为死循环: For i= 10 To 20 Step 0 ' 步长为零,死循环 Do While 1 ' 循环条件永远满足,死循环 |
|
|
2 |
Q |
循环结构中缺少配对的结束语句? |
|
|
|
A |
For…Next语句没有配对的Next语句;Do语句没有一个终结的Loop语句等。 |
|
|
3 |
Q |
“无效的Next控制变量引用”错误是如何产生的? |
|
|
|
A |
(1)循环嵌套时,内外循环交叉,例如: For i =1 to 4 For j=1 to 5 … Next i Next j 上述循环的交叉,运行时显示“无效的Next控制变量引用”。外循环必须完全包含内循环,不得交叉。 (2). 循环结构与If块结构交叉 For i =1 to 4 If 表达式 Then … Next i End If 错误同上,正确的应该为If结构完全包含循环结构;或者循环结构完全包含If结构。 |
|
|
4 |
Q |
累加、连乘时,存放累加、连乘结果的变量赋初值问题? |
|
|
|
A |
(1) 一重循环 在一重循环中,存放累加、连乘结果的变量初值设置应在循环语句前。 例如,求1~100的3的倍数和,结果放入Sum变量中,如下程序段,输出结果如何? Private Sub Form_Click() For i = 3 To 100 Step 3 | |