常见问题分类解析

教师信箱:

 

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”和数字1”形式几乎相同、O的小写字母“o”与数字0”也难以区别,这在输入代码时要十分注意,避免单独作为变量名使用。

4

Q

在运行程序时,显示要求对象的信息?

 

A

一般是控件对象名称(Name)属性写错。在窗体上创建的每个控件都有默认的名称,用于在程序中唯一地标识该控件对象。系统为每个创建的对象提供了默认的对象名,例如,Text1Text2Command1Label1等。用户也可以将属性窗口的(名称)属性改为你所指定的可读性好的名称,如txtInputtxtOutputcmdOk等。对初学者,由于程序较简单、控件对象使用较少,还是用默认的控件名较方便。

当程序中的对象名写错时,系统显示要求对象的信息,并对出错的语句以黄色背景显示。用户可以在代码窗口的对象列表框检查该窗体所使用的对象。

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方法中定位函数TabSpc的区别?

 

A

定位通过TabSpc函数和最后的逗号、分号和无符号来控制。VB中通过Print方法中各参数的综合使用达到所需的结果,但初学者往往难以掌握。

(1) Tab(n)Spc(n)的区别

Tab(n)从最左第1列开始算起定位于第n列,若当前打印位置已超过n列,则定位于下一行的第n列,这是常常定位不好出现的问题。在格式定位中,Tab用得最多。

Spc(n)从前一打印位置起空n空格。例如,下面程序段显示了TabSpc的区别,效果如图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赋得的值为0yz变量的值为默认值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块语句中,书写要求严格,即关键字ThenElse后面的语句语句块必须换行书写;单行式的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,mark3语句行出现编辑错误;同时Case (mark1 + mark2 + mark3) / 3 >= 95书写也错误。

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~1003的倍数和,结果放入Sum变量中,如下程序段,输出结果如何?

Private Sub Form_Click()

For i = 3 To 100 Step 3