vb程序设计实用教程 vb程序设计实例100( 三 )



例如,要通过文本框输入若干个值,每输入一个按Eeter键,直到输入的值为9999,输入结束,求输入的数的平均值 。

Private Sub Textl_Key Press(Key Ascii As Integer)

Dim sum!,n%

If KeyAscii=13 Then

If Val(Text1)=9999 Then

sum=sum/n

Print sum

Else

Sum=sum+Text1

n=n+1

Text1=""

End If

End If

End Sub

该过程没有语法错,运行程序可输入若干个数,但当输入9999时,程序显示"溢出"的错误 。原因sum和n是局部变量,每按一个键,局部变量初始化为0,所以会有上述错误产生 。

改进 *** :将要保值的局部变量声明为Static静态变量或声明为窗体级变量 。也可将要保值的变量在通用声明段进行声明为窗体级变量 。

6.递归调用出现"栈溢出"

如下求阶乘的递归函数过程:

Public Functionfac(n As Integer)As integer

If n=1 Then

fac=1

Else

fac=n*fac(n-1)

End If

End Function

Private Sub Commandl_Click()'调用递归函数,显示出fac(5)=120

Print "fac(5)";fac(5)

End Sub

当主调程序调用时,n的值为5时,显示120结果;当n的值为-5时,显示"溢出堆栈空间"的出错信息 。

实际上每递归调用一次,系统将当前状态信息(形参、局部变量、调用结束时的返回地址)压栈,直到到达递归结束条件 。上例当n=5时,每递归调用一次,参数n-l,直到n=l递归调用结束,然后不断从栈中弹出当前参数,直到栈空 。而当n=-5时,参数n-1为-6、压栈,再递归调用、n-1永远到不了n=l的终止条件,直到栈满,产生栈溢出的出错信息 。

所以设计递归过程时,一定要考虑过程中有终止的条件和终止时的值或某种操作,而且每递归调用一次,其中的参数要向终止方向收敛,否则就会产生栈溢出 。

六、常用控件常见错误和难点分析

1.遗漏对象名称

在VB程序设计时,初学者常犯的一个错误是遗漏对象名称,特别是在使用列表框时 。例如,如果要引用列表框(List1)中当前选定的项目,Listl.list(Listlndex)是错误的 。即使当前焦点在Listl上,VB也不是认为Listlndex是List l的属性,而是一个变量 。所以正确的引用方式是:Listl. 1ist(Listl.Listlndex) 。

2.列表框的Columns属性

列表框的Columns属性决定列表框是水平还是垂直滚动以及如何显示列中的项目 。如果水平滚动,则Columns属性决定显示多少列,如表2.7.2所示 。图2.7.1是一个水平滚动两列显示的列表框 。

在程序运行期间,该属性是只读的,也就是说,不能在运行时,将多列列表框变为单列列表框或将单列列表框变为多列列表框 。

表2.7.2列表框的Columns属性

列数属性

0(默认值)1到n项目安排在一列中,且列表框竖直滚动项目安排在多个列中,先填第一列,再填第二列……列表框水平滚动并显示指定数目的列

3.域级验证

域级验证是指输入到某独立域的数据的验证,在域级验证的过程中一般不考虑窗体一般其他域的内容 。进行域级验证的合适时间是:

(1)当往某域中输入某个键时,此时涉及键盘事件(KeyDown、KeyUp和KeyPress) 。

(2)当用户企图离开某域时,此时涉及CansesValidate属性和Validate事件 。

(3)当某域的内容发生变化时,此时涉及Change事件 。

CausesValidation属性和Validate事件通常是协同工作的 。

CausesValidate属性决定Validate事件是否发生 。如果控件的CausesValidate属性为False,该控件的Validate事件永远不会发生 。如果控件的CausesValidate属性为Tree,当焦点企图移到(还没有离开,也可以说离开之前)另一个CausesValidate属性为True的控件时,原控件的Validate事件发生:当焦点企图移到另一个CausesValidate属性为False的控件时,原控件的Validate事件暂时不发生,什么时候发生?直到焦点移到一个CausesValidate属性为True的控件上时才发生 。

推荐阅读