急!关于VB,简单的程序设计

作者&投稿:山谦 (若有异议请与网页底部的电邮联系)
急:一道简单的VB编程(高中的信息题目)~

Private Sub Command2_Click()
Dim I As Long, J As Long
For I = 0 To 9
If (I * 10 + 3) * 6528 = (30 + I) * 8256 Then Exit For
Next
If I < 10 Then
MsgBox I * 10 + 3 & " * 6528 = " & 30 + I & " * 8356", vbInformation Or vbOKOnly
Else
MsgBox "未找到相应的数据!", vbExclamation Or vbOKOnly
End If
End Sub

以前整的,可能对你有用,看看吧
VERSION 5.00
Begin VB.Form ExpressionForm
Caption = "Expression"
ClientHeight = 2310
ClientLeft = 1380
ClientTop = 2100
ClientWidth = 6615
LinkTopic = "Form1"
PaletteMode = 1 'UseZOrder
ScaleHeight = 2310
ScaleWidth = 6615
Begin VB.TextBox ExprText
Height = 285
Left = 0
TabIndex = 0
Top = 360
Width = 3615
End
Begin VB.CommandButton CmdEvaluate
Appearance = 0 'Flat
BackColor = &H80000005&
Caption = "Evaluate"
Default = -1 'True
Height = 495
Left = 1200
TabIndex = 11
Top = 960
Width = 1215
End
Begin VB.Frame Frame1
Appearance = 0 'Flat
Caption = "Primitives"
ForeColor = &H80000008&
Height = 2295
Left = 3720
TabIndex = 12
Top = 0
Width = 2895
Begin VB.TextBox NameText
Height = 285
Index = 0
Left = 240
TabIndex = 1
Top = 480
Width = 1215
End
Begin VB.TextBox ValueText
Height = 285
Index = 0
Left = 1560
TabIndex = 2
Top = 480
Width = 1215
End
Begin VB.TextBox NameText
Height = 285
Index = 1
Left = 240
TabIndex = 3
Top = 840
Width = 1215
End
Begin VB.TextBox ValueText
Height = 285
Index = 1
Left = 1560
TabIndex = 4
Top = 840
Width = 1215
End
Begin VB.TextBox NameText
Height = 285
Index = 2
Left = 240
TabIndex = 5
Top = 1200
Width = 1215
End
Begin VB.TextBox ValueText
Height = 285
Index = 2
Left = 1560
TabIndex = 6
Top = 1200
Width = 1215
End
Begin VB.TextBox NameText
Height = 285
Index = 3
Left = 240
TabIndex = 7
Top = 1560
Width = 1215
End
Begin VB.TextBox ValueText
Height = 285
Index = 3
Left = 1560
TabIndex = 8
Top = 1560
Width = 1215
End
Begin VB.TextBox NameText
Height = 285
Index = 4
Left = 240
TabIndex = 9
Top = 1920
Width = 1215
End
Begin VB.TextBox ValueText
Height = 285
Index = 4
Left = 1560
TabIndex = 10
Top = 1920
Width = 1215
End
Begin VB.Label Label1
Appearance = 0 'Flat
Caption = "Name"
ForeColor = &H80000008&
Height = 255
Index = 0
Left = 240
TabIndex = 14
Top = 240
Width = 615
End
Begin VB.Label Label1
Appearance = 0 'Flat
Caption = "Value"
ForeColor = &H80000008&
Height = 255
Index = 1
Left = 1560
TabIndex = 13
Top = 240
Width = 615
End
End
Begin VB.Label Label2
Appearance = 0 'Flat
Caption = "Expression"
ForeColor = &H80000008&
Height = 255
Left = 0
TabIndex = 17
Top = 0
Width = 975
End
Begin VB.Label Label3
Appearance = 0 'Flat
Caption = "Result"
ForeColor = &H80000008&
Height = 255
Left = 480
TabIndex = 16
Top = 1800
Width = 615
End
Begin VB.Label ResultLabel
BorderStyle = 1 'Fixed Single
Height = 255
Left = 1200
TabIndex = 15
Top = 1800
Width = 1215
End
End
Attribute VB_Name = "ExpressionForm"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Dim Primitives As Collection

' ************************************************
' Evaluate the expression.
' ************************************************
Private Function EvaluateExpr(ByVal expr As String) As Single
Const PREC_NONE = 11
Const PREC_UNARY = 10 ' Not actually used.
Const PREC_POWER = 9
Const PREC_TIMES = 8
Const PREC_DIV = 7
Const PREC_INT_DIV = 6
Const PREC_MOD = 5
Const PREC_PLUS = 4

Dim is_unary As Boolean
Dim next_unary As Boolean
Dim parens As Integer
Dim pos As Integer
Dim expr_len As Integer
Dim ch As String
Dim lexpr As String
Dim rexpr As String
Dim value As String
Dim status As Long
Dim best_pos As Integer
Dim best_prec As Integer

' Remove leading and trailing blanks.
expr = Trim$(expr)
expr_len = Len(expr)
If expr_len = 0 Then Exit Function

' If we find + or - now, it is a unary operator.
is_unary = True

' So far we have nothing.
best_prec = PREC_NONE

' Find the operator with the lowest precedence.
' Look for places where there are no open
' parentheses.
For pos = 1 To expr_len
' Examine the next character.
ch = Mid$(expr, pos, 1)

' Assume we will not find an operator. In
' that case the next operator will not
' be unary.
next_unary = False

If ch = " " Then
' Just skip spaces.
next_unary = is_unary
ElseIf ch = "(" Then
' Increase the open parentheses count.
parens = parens + 1

' An operator after "(" is unary.
next_unary = True
ElseIf ch = ")" Then
' Decrease the open parentheses count.
parens = parens - 1

' An operator after ")" is unary.
next_unary = True

' If parens < 0, too many ')'s.
If parens < 0 Then
Err.Raise vbObjectError + 1001, _
"EvaluateExpr", _
"Too many )s in '" & _
expr & "'"
End If
ElseIf parens = 0 Then
' See if this is an operator.
If ch = "^" Or ch = "*" Or _
ch = "/" Or ch = "\" Or _
ch = "%" Or ch = "+" Or _
ch = "-" _
Then
' An operator after an operator
' is unary.
next_unary = True

Select Case ch
Case "^"
If best_prec >= PREC_POWER Then
best_prec = PREC_POWER
best_pos = pos
End If

Case "*", "/"
If best_prec >= PREC_TIMES Then
best_prec = PREC_TIMES
best_pos = pos
End If

Case "\"
If best_prec >= PREC_INT_DIV Then
best_prec = PREC_INT_DIV
best_pos = pos
End If

Case "%"
If best_prec >= PREC_MOD Then
best_prec = PREC_MOD
best_pos = pos
End If

Case "+", "-"
' Ignore unary operators
' for now.
If (Not is_unary) And _
best_prec >= PREC_PLUS _
Then
best_prec = PREC_PLUS
best_pos = pos
End If
End Select
End If
End If
is_unary = next_unary
Next pos

' If the parentheses count is not zero,
' there's a ')' missing.
If parens 0 Then
Err.Raise vbObjectError + 1002, _
"EvaluateExpr", "Missing ) in '" & _
expr & "'"
End If

' Hopefully we have the operator.
If best_prec < PREC_NONE Then
lexpr = Left$(expr, best_pos - 1)
rexpr = Right$(expr, expr_len - best_pos)
Select Case Mid$(expr, best_pos, 1)
Case "^"
EvaluateExpr = _
EvaluateExpr(lexpr) ^ _
EvaluateExpr(rexpr)
Case "*"
EvaluateExpr = _
EvaluateExpr(lexpr) * _
EvaluateExpr(rexpr)
Case "/"
EvaluateExpr = _
EvaluateExpr(lexpr) / _
EvaluateExpr(rexpr)
Case "\"
EvaluateExpr = _
EvaluateExpr(lexpr) \ _
EvaluateExpr(rexpr)
Case "%"
EvaluateExpr = _
EvaluateExpr(lexpr) Mod _
EvaluateExpr(rexpr)
Case "+"
EvaluateExpr = _
EvaluateExpr(lexpr) + _
EvaluateExpr(rexpr)
Case "-"
EvaluateExpr = _
EvaluateExpr(lexpr) - _
EvaluateExpr(rexpr)
End Select
Exit Function
End If

' If we do not yet have an operator, there
' are several possibilities:
'
' 1. expr is (expr2) for some expr2.
' 2. expr is -expr2 or +expr2 for some expr2.
' 3. expr is Fun(expr2) for a function Fun.
' 4. expr is a primitive.
' 5. It's a literal like "3.14159".

' Look for (expr2).
If Left$(expr, 1) = "(" And Right$(expr, 1) = ")" Then
' Remove the parentheses.
EvaluateExpr = EvaluateExpr(Mid$(expr, 2, expr_len - 2))
Exit Function
End If

' Look for -expr2.
If Left$(expr, 1) = "-" Then
EvaluateExpr = -EvaluateExpr( _
Right$(expr, expr_len - 1))
Exit Function
End If

' Look for +expr2.
If Left$(expr, 1) = "+" Then
EvaluateExpr = EvaluateExpr( _
Right$(expr, expr_len - 1))
Exit Function
End If

' Look for Fun(expr2).
If expr_len > 5 And Right$(expr, 1) = ")" Then
lexpr = LCase$(Left$(expr, 4))
rexpr = Mid$(expr, 5, expr_len - 5)
Select Case lexpr
Case "sin("
EvaluateExpr = Sin(EvaluateExpr(rexpr))
Exit Function
Case "cos("
EvaluateExpr = Cos(EvaluateExpr(rexpr))
Exit Function
Case "tan("
EvaluateExpr = Tan(EvaluateExpr(rexpr))
Exit Function
Case "sqr("
EvaluateExpr = Sqr(EvaluateExpr(rexpr))
Exit Function
End Select
End If

' See if it's a primitive.
On Error Resume Next
value = Primitives.Item(expr)
status = Err.Number
On Error GoTo 0
If status = 0 Then
EvaluateExpr = CSng(value)
Exit Function
End If

' It must be a literal like "2.71828".
On Error Resume Next
EvaluateExpr = CSng(expr)
status = Err.Number
On Error GoTo 0
If status 0 Then
Err.Raise status, _
"EvaluateExpr", _
"Error evaluating '" & expr & _
"' as a constant."
End If
End Function


' ************************************************
' Evaluate the expression entered by the user.
' ************************************************
Private Sub CmdEvaluate_Click()
Dim i As Integer
Dim name As String
Dim value As String
Dim expr As String
Dim rslt As Single
Dim pos As Integer

' Store the primitives.
Set Primitives = New Collection
For i = 0 To 4
name = Trim$(NameText(i).Text)
value = Trim$(ValueText(i).Text)
If name "" And value "" Then
Primitives.Add value, name
End If
Next i

' Get the expression.
expr = ExprText.Text

' Evaluate the expression.
ResultLabel.Caption = ""
On Error GoTo EvaluateError
rslt = EvaluateExpr(expr)
ResultLabel.Caption = Format$(rslt)
Exit Sub

EvaluateError:
Beep
MsgBox Err.Description
End Sub

分类:电脑IT
四、数组中常见错误和注意事项

1.静态数组声明下标出现变量

n = InputBox("输入数组的上界")

Dim a(1 To n) As Integer

2.数组下标越界

引用的下标比数组声明时的下标范围大或小。

Dim a(1 To 30) As Long, I as integer

a(1) = 1: a(2) = 1

For i = 3 To 30

a(i) = a(i - 2) + a(i - 1)

Next I

3.数组维数错

数组声明时的维数与引用数组元素时的维数不一致。

Dim a(3, 5) As Long

a(I)=10

4.Aarry函数使用问题

只能对Variant 的变量或动态数组赋值。

5.获得数组的上界、下界

UBound 、Lbound函数

1.Dim数组声明

有时用户为了程序的通用性,声明数组的上界用变量来表示,如下程序段:

n=InputBox("输入数组的上界")

Dim a(1 To n)As Integer

程序运行时将在Dim语句处显示"要求常数表达式"的出错信息。即Dim语句中声明的数组上、下界必须是常数,不能是变量。

解决程序通用的问题,一是将数组声明的很大,这样浪费一些存储空间;二是利用动态数组,将上例改变如下:

Dim a()As Integer

n=InputBox ("输入数组的上界")

ReDim a(1 To n) As Integer

2.数组下标越界

引用了不存在的数组元素,即下标比数组声明时的下标范围大或小。例如,要形成有如下30项的斐波那契数列:

1,1,2,3,5,8,13,21,34,…,317811,514229,832040

正确的程序段如下:

Dim a(1 To 30) As Long, i%

若将For i=3 To 30改为For i=1 To 30,程序运行时会显示"下标越界"的出错信息,因为开始循环时i=l,执行到循环体语句a(i)=a(i-2)+a(i-1),数组下标i-2、i-1均小于下界1。

同样若将上例:a(i)=a(i-2)+a(i-1)语句改为:a(i+2)=a(i)+a(i+1)。

程序运行时也会显示"下标越界"的出错信息,这时是数组下标大于上界30。

3.数组维数错

数组声明时的维数与引用数组元素时的维数不一致。例如,下程序段为形成和显示3×5的矩阵:

Dim a(3,5) As Long

For i=1 To 3

For j=1 To 5

a(i)=i*j

Print a(i);"";

Next j

Print

Next i

程序运行到a(i)=i*j语句时出现"维数错误"的信息,因为在Dim声明时是二维数组,引用时的一个下标。

4.Array函数使用问题

Array函数可方便地对数组整体赋值,但此时只能声明Variant的变量或仅由括号括起的动态数组。赋值后的数组大小由赋值的个数决定。

例如,要将1,2,3,4,5,6,7这些值赋值给数组a,表2.5.1列出了三种错误及相应正确的赋值方法。

表2.5.1 Array函数表示方法

错误的Array函数赋值
改正的Aarry函数赋值

Dim a(1 To 8)

a=Array(1,2,3,4,5,6,7,8)
Dim a( ) a=Array(1,2,3,4,5,6,7)

Dim a As Integer a=Array(1,2,3,4,5,6,7)
Dim a a=Array(1,2,3,4,5,6,7)

Dim a

a()=Array(1,2,3,4,5,6,7)
Dim a a=Array(1,2,3,4,5,6,7)

5.如何获得数组的上界、下界

Array函数可方便地对数组整体赋值,但在程序中如何获得数组的-上界、下界,以保证访问的数组元素在合法的范围内,可使用UBound和LBound函数来决定数组访问。

在上例中,若要打印a数组的各个值,可通过下面程序段实现:

For i=Lbound(A) To Ubound(A)

Print a(i)

Next i

6.给数组赋值

VB6.0提供了可对数组整体赋值的新功能,方便了数组对数组的赋值操作。但真正使用不那么方便,有不少限制。数组赋值形式如下:

数组名2=数组名1

我们就此形式作讨论:这里的数组名2,实际上在前面的数组声明时,只能声明为Variant的变量,赋值后的数组2的大小、维数、类型同数组名1;否则,若声明成动态或静态的数组,例如:

Dim数组名2()或Dim数组名2 (下标)

程序在运行到上述赋值语句时显示"不能给数组赋值"的出错信息。

所以,为了程序的安全、可靠,建议读者还是忍痛割爱,少用VB6.0的这一新功能,使用传统的循环结构来给数组赋值。基于此原因,我们也就在教程中不作展开。

五、过程中常见错误和注意事项

1.程序设计算法问题

该章程序编写难度较大,主要是算法的构思有困难,这也是程序设计中最难学习的阶段。经验告诉每一位程序设计的初学者,没有捷径可走,多看、多练、知难而进。上机前一定要先编写好程序,仔细分析、检查,才能提高上机调试的效率。每当一个程序通过艰苦的努力调试通过时,那苦尽甘来的喜悦令你一言难尽。

2.确定自定义的过程是子过程还是函数过程

实际上过程是一个具有某种功能的独立程序单位,供多次调用。子过程与函数过程的区别是前者子过程名无值,后者函数过程名有值。若过程有一个返回值,则习惯使用函数过程;若过程无返回值,则使用子过程,若过程返回多个值,一般使用子过程,通过实参与形参的结合带回结果,当然也可通过函数过程名带回一个,其余结果通过实参与形参的结合带回。

3.过程中形参的个数和传递方式的确定

对初学者,在定义过程时不能确定形参的个数和传递方式。

过程中参数的作用是实现过程与调用者的数据通信。一方面,调用者为子过程或函数过程提供初值,这是通过实参传递给形参实现的,另一方面,子过程或函数过程将结果传递给调用者,这是通过地址传递方式实现的,因此,决定形参的个数就是由上述两方面决定的。对初学者,往往喜欢把过程体中用到的所有变量作为形参,这样就增加了调用者的负担和出错概率,也有的初学者全部省略了形参,则无法实现数据的传递,既不能从调用者得到初值,也无法将计算结果传递给调用者。

VB中形参与实参的结合有传值和传地址两种方式。区别如下:

(1)在定义形式上前者在形参前加即ByVal关键字。

(2)在作用上值传递只能从外界向过程传入初值,但不能将结果传出,而地址传递既可传入又可传出。

(3)如果实参是数组、自定义类型、对象变量等,形参只能是地址传递。

4.实参与形参类型对应问题

在地址传递方式时,调用过程实参与形参类型要一致。例如:

函数过程定义如下:

Public Function f!(x!)

f=x+x

End Function

主调程序如下:

Privme Sub Commandl_Click()

Dim y%

y=3

Print f(y)

End Sub

上例形参x是单精度型、实参y是整型,程序运行时会显示"ByRef参数类型不符"的编译出错信息。

在值传递时,若是数值型,则实参按形参的类型将值传递给形参。例如:

函数过程定义如下:

Public Function f!(ByVal x%)

f=x+x

End Function

主调程序如下:

Priva~SubCommandI_Click()

Dim y!

Y=3.4

Print f(y)

End Sub

程序运行后显示的结果是6。

5.变量的作用域问题

局部变量,在对该过程调用时,分配该变量的存储空间,当过程调用结束,回收分配的存储空间,也就是调用一次,初始化一次,变量不保值,窗体级变量,当窗体装入,分配该变量的存储空间,直到该窗体从内存卸掉,才回收该变量分配的存储空间。

例如,要通过文本框输入若干个值,每输入一个按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的控件上时才发生。

例如,假定有如图2.7.2所示的程序。当焦点企图从Textl移到Text2时,Textl的Validate事件发生,同样当焦点企图从Text2移到Textl时,Text2的Validate事件发生。当焦点企图从Textl移到Text3时,TextI的Validate事件暂时没有发生,因为Text3的CausesValidate为False,然后如果焦点企图继续移动到Text2时,Textl的Validate事件才发生。

图2.7.2 CausesValidate属性和Validate事件

CausesValidate属性和Validate事件的这一特性常常应用在如图2.7.3所示的程序中。当在文本框中输入了无效数据时而又不知道如何输入有效数据时,用户往往选择Help命令寻求帮助或选择Cancel命令结束数据输入,此时不希望执行验证程序。因为如果执行验证程序且发现了无效数据,则无法选择Help或Cancel了,用户就这样被套住了。现在只要将文本框的CausesValidate属性设为True,命令按钮的CausesValidate属性为False,验证程序放在 Validate过程中,问题就解决了。在默认情况下,所有控件的CausesValidation属性都为Tree。

图2.7.3 命令按钮的CausesValidate属性和Validate事件

并不是所有的控件都有Validate事件。只有那些能用于输入数据的控件(如文本框、复选框、滚动条等)才有这个事件。Validate事件过程如下:

Privme Sub object_Validate(Cancel As Boolean)



EndSub

其中,当参数Cancel被设为Tree后,焦点将不会离开对象。

如果要将实验七第1题改用Validate事件和CausesValidation属性实现数据验证,则应有如下的程序。

Sub txtMath_Validate(Cancel As Boolean)

If Val(txtMath.Text)<0 Or _

Val(txtMath.Text)>100 Then

Cancel=True

End If

End Sub

1.窗体顶部菜单栏中的菜单项与子菜单中的菜单项的区别

窗体顶部菜单栏中的菜单项与子菜单中的菜单项都是在菜单编辑器中定义的,但是它们是有区别的。

(1)窗体顶部菜单栏中的菜单项不能定义快捷键,而子菜单中的菜单项可以有快捷键。

(2)当有热键字母(菜单标题中"&"后的字母)时,按Alt+热键字母选择窗体顶部菜单栏中的菜单项,按热键字母选择子菜单中的菜单项(当子菜单打开时)。子菜单没有打开时,按热键字母无法选择其中的菜单项。

(3)尽管所有的菜单项都能响应Click事件,但是窗体顶部菜单栏中的菜单项不需要编写事件过程。

2.在程序中对通用对话框的属性设置不起作用

在程序中对通用对话框的属性设置不起作用,多数情况是因为在弹出对话框后才进行属性设置。例如,下面的程序代码就存在这样的问题,改正方法是将弹出对话框语句放到最后,即把CommonDialogl.Action=l放在所有属性设置语句的后面。

CommonDialog1.Action=1

ConmaonDialog1.FileName="*.Bmp"

CommonDialogl.InitDir="C:\Windows"

CommonDialog1.Filter="Pictures(*.Bmp)|*.Bmp|All Files(*.*)|*.*"

CommonDialog1.FilterIndex=1

3.在工程中添加现有窗体时发生加载错误

在使用"工程"菜单中的"添加窗体"命令添加一个现存的窗体时经常发生加载错误,绝大多数是因为窗体名称冲突的缘故。例如,假定当前打开了一个含有名称为Forml的工程,如果想把属于另一个工程的Forml窗体装入则肯定会出错。

[注意]

窗体名与窗体文件名的区别。在一个工程中,可以有两个窗体文件名相同的窗体(分布在不同的文件夹中),但是绝对不能同时出现两个窗体名相同的窗体。

4.实时菜单的创建

实时菜单是由应用程序根据需要动态创建的。在VB中,常见的实时菜单是"文件"菜单,该菜单显示了最近所使用的工程。

创建实时菜单必须结合控件数组,用Load语句创建菜单项,用UnLoad清除菜单项。

创建实时菜单的步骤:

(1)在菜单编辑器中建立样本菜单项

样本菜单项的属性设置见表2.8.4所示。设置Index为0,表明样本菜单项是控件数组的一个元素,其下标为0。样本菜单项的Name属性是必须的,它将作为控件数组的名称。在下面假定数组名为NameArray。Visible可以设为True,设为False表示初始时该菜单项不可见。

表2.8.4 实时菜单样本菜单项

属性 Name Caption Index Visible

设置值 必需的 可以没有 0 False

(2)在程序中用Load语句创建菜单项

例如,Load NameArray(1)创建一个新的菜单项(在控件数组中的下标为1,然后将其 Visible属性设置True,同时设置Caption属性。

动态创建的菜单项继承了除了Index之外的绝大部分属性,所以要对Caption和Visible属性进行设置。另外,样本菜单项在菜单系统中的位置决定了新菜单项出现的位置。

(3)为实时菜单项编写代码

每个实时菜单项都是控件数组的一个成员,具有相同的名称,并且共享事件过程。

下面是一个实时菜单项代码示例:

SubNameArray_Click(Index As Integer)

Select Case Index

Case 0

MsgBox("NameArmy(0)(样本菜单项) is clicked!")

Case 1

MsgBox("NameArray(1)(第一个实购菜单项) is clicked!")

Case 2

MsgBox("NameArray(2)(第二个实时菜单项) is clicked!")

End Select

End Sub

(4)删除实时菜单项

尽管把Visible设为False,程序运行时实时菜单项不会显示,然而有时还是需要把实时菜单项从内存中销毁。删除实时菜单使用UnLoad语句。例如,LoadNameArray(1)。

有关建立实时菜单的详细内容请参阅教程第4.3节。

5.通用对话框的CancelError属性和Err对象

当通用对话框的CancelError属性为True时,无论何时选择"取消"按钮,均产生 32755(cdlCancel)号错误,即将Err的Number属性设置为32755。

Err是VB的一个系统对象,它记录了程序运行期间所发生的错误。

Err对象的重要属性有Number(默认属性)和Description。当错误发生后,错误的生成者把错误号和有关错误的说明分别存放在Number和Description属性中。例如,当在 CancelError属性为True的通用对话框中选择"取消"按钮时,产生一个错误,Err对象的Number和Description属性将被设置为32755和"选择'取消'"。

在程序运行期间,经常会发生各种各样的错误。有关错误处理的详细内容请参阅教程第 9.6节。

下面是当程序产生cdlCancel错误时结束程序的运行。

SubForm_ClickO

CommonDialogl.CancelError=True

On Error GoTo ErrorHandler

CommonDialogl.Action=l

' 处理文件的语句

ErrorHandler:

If Err.Number=cdlCancel Then

End

Endlf

End Sub

6.与窗体有关的事件

在首次用Load语句将窗体(假定该窗体在内存中还没有创建)调入内存之时依次发生 Initialize和Load事件。再用UnLoad将窗体从内存中卸载时依次发生QueryUnLoad和Unload事件,再使用Set窗体名=Nothing语句解除初始化时发生Terminate事件。

Initialize是在窗体创建时发生的事件。在窗体的整个生命周期中,Initialize事件只触发一次。用户可以将一个窗体装入内存或从内存中删除很多次,但窗体的建立只有一次。也就是说,在用Load语句将窗体装入内存时会触发Load事件,但并不一定触发Initialize事件。

在用UnLoad语句卸载窗体后,如果没有使用Set窗体名=Nothing解除初始化,则在下次使用Load语句时不会触发Initialize事件,否则会引起Initialize事件。

假定有Forml和Form2两个窗体,并且有下列事件过程:

' Forml窗体事件过程

Sub Form_Click()

Debug.Print"窗体首次装入内存时发生的事件:"

Load Form2

Debug.Print"用Unload卸载窗体时发生的事件:"

UnloadForm2

Debug.Print "窗体第二次装入内存时发生的事件:"

Load Form2

Debug.Print "用Unload卸载窗体时发生的事件:"

Unload Form2

Debug.Print "用Set窗体名=Nothing语句解除初始化时发生的事件:"

Set Form2=Nothing

Debug.Print "窗体第三次(解除初始化后)装入内存时发生的事件:"

Load Form2

End Sub

'Form2窗体事件过程

Sub Form_Initialize()

Debug.Print"Initialize事件"

End Sub

Sub Form_Lond()

Debug.Pnnt"Load事件"

End Sub

Sub Form_QueryUnload(Cancel As hteger, UnloadMode As Integer)

Debug.Print"QueryUnload"

End Sub

Sub Form_Unlond(Cancel As Integer)

Debug.Print"Unload"

End Sub

Sub Form_Terminate()

Debug.Print"Terminate"

End Sub

当用户在Form1上单击时,在Debug窗口显示下列信息:

窗体首次转入内存时发生的事件:

Initialize事件

Load事件

用Unload卸载窗体时发生的事件:

Query Unload

Unload

窗体第二次装入内存时发生的事件:

Load事件

用Unload卸载窗体时发生的事件:

QueryUnload

Unload

用Set窗体名=Nothing语句解除初始化时发生的事件:

Terminate

窗体第三次(解除初始化后)装入内存时发生的事件:

Initialize事件

Load事件

7.MouseDown、MOUSeUp和C1ick事件发生的次序

当用户在窗体或控件上按下鼠标按钮时MouseDown事件被触发,MouseDown事件肯定发生在MouseUp和C1ick事件之前。但是,MouseUp和Click事件发生的次序与单击的对象有关。

当用户在标签、文本框或窗体上作单击时,其顺序为:

(1)MouseDown

(2)MouseUp

(3)Click

当用户在命令按钮上作单击时,其顺序为:

(1)MouseDown

(2)Click

(3)MouseUp

当用户在标签或文本框上作双击时,其顺序为:

(1)MouseDown

(2)MOuseUp

(3)Click

(4)DblCUck

(5)MouseUp

七、文件常见错误和难点分析

1.文件系统的三个控件不能产生关联

也就是当驱动器改变时,目录列表框不能跟着相应改变;或者当目录列表框改变时,文件列表框不能跟着相应改变。要三个控件产生关联,使用下面两个事件过程:

Private Sub Drivel_Change()

Dirl.Path=Drivel.Drive

End Sub

Private Sub Dirl_Change()

Filel.Path=Dirl.Path

End Sub

2.如何在目录列表框表示当前选定的目录

在程序运行时双击目录列表框的某目录项,则将该目录项改变为当前目录,其Diirl. Path的值作相应的改变。而当单击选定该目录项时,Diirl. Path的值并没有改变。有时为了对选定的目录项进行有关的操作,与ListBox控件中某列表项的选定相对应,表示如下:

Dirl.List(Dirl.Listlndex)

3.当使用文件系统控件对文件进行打开操作时,显示"文件未找到"出错信息。

例如,如下语句:

Open Filel.Path+Filel.File Name For Input As#1

当选定的目录是根目录,上述语句执行正确,而当选定的目录为子目录,上述语句执行时显示"文件末找到"出错信息。

其中:Filel.Path表示当前选定的路径,Filel.File Name表示当前选定的文件,合起来表示文件的标识符。

当选定的文件在根目录下(假定驱动器为C),Filel.Path的值为"C:\1",假定选定的文件名为"t1.txt",则Filel.Path+Filel.FileName的值为"C:\t1.txt"为合法的文件标识符。

当选定的文件在子目录下(假定驱动器为C,子目录为my),Filel.Path的值为"C:\my" Filel.Path+Filel.FileName的值为"C:\my tl.txt",子目录与文件名之间少了一个"\"分隔符。

为了保证程序正常运行,

Open Filel.Path+Filel.FileNameForlnput As #1改为:

Dun F$

If Right(Filel.Path,1)"\" Then ' 表示选定的足根目录

F=Filel.Path+Filel.FileName

Else ' 表示选定的是子目录,子目录与文件名之间加"\"

F=Filel.Path+"\"+Filel.FileName

End If

Open F For Input As # 1

4.Open语句中欲打开的名是常量也可以是字符串变量,但使用者概念不清,导致出现"文件未找到"出错信息

如在从盘上读入文件名为"C:\my\t1.txt",

正确的常量书写如下:

Open "C:\my\t1.txt"For Input As#1 ' 错误的书写常量两边少双引号

或正确的变量书写如下:

Dim F$

F="C:\my\t1.txt"

Open F For Input As #1 ' 错误的书写变量F两边多了双引号

5.文件没有关闭又被打开,显示"文件已打开"的出错信息

如下语句:

Open"C:\my\t1.txt" For Input As #1

Print F

Open "C:\my\t1.txt" For Input As #1

Print "2";F

执行到第二句Open语句时显示"文件已打开"的出错信息。

6.如何读出随机文件中的所有记录,但又不知道记录号。

不知道记录号而又要全部读出记录,则只要同顺序文件的读取相似,采用循环结构加无记录号的Get语句即可,程序段如下:

Do While Not EOF(1)

Get #1, , j

Print j;

Loop

随机文件读写时可不写记录号,表示读时自动读下一条记录,写时插入到当前记录后。

原发布者:dorise婷
一个简单VB程序设计过程程序设计——编程人员使用程序设计语言设计一个计算机程序。【引例】简单VB程序设计实例。功能要求:单击←、→、↑、↓中的任何一个命令按钮,红色小球就会向相应方向移动一定距离。1.3.1程序设计准备1、分析问题根据程序的功能要求,可见程序必须具有以下具体功能。(1)程序必须能够接收程序用户输入的小球移动方向,即原始数据输入。本例使用4个“命令按钮”向程序用户提供给方向数据输入平台。(2)当程序用户输入一个方向数据后,程序必须能够立即自动计算小球新的位臵,即数据处理。本例对于4个不同的移动方向分别计算新的位臵数据。(3)程序必须能够向程序用户展示小球的移动效果,即输出结果数据。本例使用一个红色小球图形向程序用户实时展示移动效果。1.3.1程序设计准备2、建立一个VB应用程序工程启动VB6.0IDE后会弹出“新建工程”对话框,在“新建”选项卡中选择“标准.EXE”图标,单击“打开”命令按钮,或双击“标准.EXE”图标,即可新建一个默认名为“工程1”的应用程序设计工程项目。☺【问1-3-3】什么是工程?【答1-3-3】用来建造VB应用程序的设计文件集合。在新建一个工程时后,VB6.0IDE会根据设计内容自动建立一系列设计文件。第一个设计文件就是VB6.0IDE自动新建一个默认名为“Form1”的窗体对象,这个窗体对象就是程序界面的设计平台。1.3.2设计程序界面在命令行操作系统下运行应用

问题问得不明不白,设计这些函数?是画图像呢还是解析这些函数呢?
===============================================================
程序源代码已写好,给个邮箱地址,我发给你。

什么啊,画图像吗??还是求值?

y=a*x^2+b*x+c
y=a*x+b
y=a^x
y=x^a
y=log(x)

不是这样吗?还有,对数可以用换低公式。

没学过数学吗?
先补补数学课程


帮忙写个简单的VB代码,谢谢啦
Private Sub Form_Click()Dim x As Integer, y As Integer, z As Integer, 水仙花数 As Integer For x = 1 To 9 For y = 0 To 9 For z = 0 To 9 水仙花数 = x * 100 + y * 10 + z If 水仙花数 = x ^ 3 + y ^ 3 + z ^ 3 Then Print 水仙花数 End If Next Next...

简单的VB编程
第一个:Option Explicit Dim n, a As Integer Dim sum As Long Private Sub Command1_Click()End End Sub Private Sub Form_Activate()a = InputBox("输入连加最后值!", "连加程序", 10)sum = 1 For n = 1 To a sum = sum + n Next n Print Print Tab(3); "结果为"; sum ...

有关VB的简单问题
把窗体的BorderStyle属性改一下就可以了 Form 对象的 BorderStyle 属性设置值如下:常数 设置值 描述 vbBSNone 0 无 (没有边框或与边框相关的元素)。vbFixedSingle 1 固定单边框。可以包含控制菜单框,标题栏,“最大化”按钮,和“最小化”按钮。只有使用最大化和最小化按钮才能...

VB 一到很简单的题
Private Sub Command1_Click()Me.List2.Clear For i = 0 To Me.List1.ListCount - 1 If Me.List1.Selected(i) = True Then Me.List2.AddItem Me.List1.List(i)End If Next End Sub Private Sub Command2_Click()For i = 0 To Me.List1.ListCount - 1 If Me.List1.Selected(i)...

一个简单的VB
", 64 + vbOKCancel + vbDefaultButton1, "提示窗口" '输出欢迎窗口Else '密码错误就报错 MsgBox "密码错误请重新输入!", 16 + vbOKCancel + vbDefaultButton1, "错误报告" Me.Text2.SetFocus '设置焦点到Text2 Me.Text2.Text = "" '清空Text2End IfEnd Sub这是窗体:

vb的优缺点
vb 优点:最突出的就是一个字“快”,面对物件方式,控制元件完善,教程较多,应用层面开发效率极高。 缺点:涉及底层系统开发、网路开发,较C和JAVA有些不足,语言简练度不高。受众面较小,对于就业有一定影响 简单讲就这些,具体细节网上一堆,随便baidu VB的优缺点? VB在底层功能和指标的支援没有VC++好 相比之下,Del...

vb 写的简单点谢谢
Private Sub Command1_Click()Dim s As String, n As Integer s = Left(Text1.Text, 1)n = Asc(s)If n >= 48 And n <= 57 Then Text2.Text = Text2.Text & "数字字符"ElseIf n >= 65 And n <= 90 Then Text2.Text = Text2.Text & "大写字母"ElseIf n >= 97 And n...

vb题目是啥 有啥简单易懂的过程
计算并打印1+2+3+……+9+10的和。更简单一点的程序:private sub form_click()dim i as integer,sum as integer for i=1 to 10 sum=sum+i next print “sum=”;sum end sub

VB的简单编程
用Log 函数 + 换底公式 Log(number):返回数值 number 的自然对数。nnumber 参数是任意大于 0 的有效数值表达式。说明 自然对数是以 e 为底的对数。常数 e 的值约为 2.718282。用 n 的自然对数除 x 的自然对数,可以得到以 n 为底的 x 的对数。如下所示:Log n(x) = Log(x) \/ Log(n...

用VB编写一个简单公式程序
界面如上图所示, 其中公式用OLE 控件绘制,将该控件绘制到窗体中,点击右键,插入对象,选择microsoft 公式3 ,即可编辑。代码如下:Private Sub Command1_Click()Dim x, n As Integer Dim p, q As Single If (Val(Text1.Text) >= 0) And (Val(Text1.Text) >= 0) Then n = Val(Text...

巨鹿县13512296429: 急急急 !VB很简单的编程?
堂侵芒果: 这里用了一个计时器,约10秒更新一次,代码如下: Option Explicit Private Sub Form_Load() Text1 = "": Text2 = "": Text3 = "" Text4 = "": Text5 = "": Text6 = ...

巨鹿县13512296429: 简单的VB程序设计 -
堂侵芒果: Private Sub Command1_Click() Dim x$ x = InputBox("请输入一个名字!", "名字输入!") MsgBox x & "!你好,新年快乐!", 64, "祝福!" End Sub

巨鹿县13512296429: 怎么用vb做一个简单的程序 -
堂侵芒果: 加入标签Label1,Caption设置为“你好,请输入你的姓名” 加入文本框Text1,用来输入姓名的 加入标签Label2,按照你的要求设置字体属性,autosize属性设成true 分别加入确定,继续,结束按钮 以下是代码: Private Sub Form_Load()Me.结...

巨鹿县13512296429: 简单VB设计,急急急急
堂侵芒果: 虽说没有分,但还是帮你一下吧~~~ Private Sub Form_Click() Dim i As Integer Dim score As Integer Dim ss As Integer Do While score <> -1 score = Val(InputBox("请输入成绩(数字),输入-1结束.", "成绩输入")) If score <> -1 Then Me.Print score & " "; ss = ss + score i = i + 1 End If Loop Me.Print "" Me.Print i & " 位同学的平均成绩为 " & (ss / i) End Sub

巨鹿县13512296429: 关于简单VB程序设计
堂侵芒果: Dim a() As Integer Private Sub Command1_Click() Dim i As Integer Dim j As Integer Dim x As Integer For i = 0 To 4 ReDim Preserve a(i) a(i) = Rnd * 100 Next i i = UBound(a) + 1 ReDim Preserve a(i) a(i) = InputBox("请输入一个数:", "输入...

巨鹿县13512296429: VB的简单程序设计.` -
堂侵芒果: s1 = 0 s2 = 0 For i = 1 To 20 a = InputBox("输入第" & i & "个", "输入20个数字") If a Mod 2 = 0 Then s1 = s1 + 1 Else s2 = s2 + 1 End If Next Print "偶数个数:" & s1 Print "奇数个数:" & s2

巨鹿县13512296429: Visual Basic 程序设计(VB)求一道简单题目的代码,急!!! -
堂侵芒果: 在窗体上g放一i个h命令按钮,程序运行单击按钮,要求输入e成绩.单击确定输出等级.代码如下l: Private Sub Command8_Click() Dim cj As String cj = InputBox("请输入m成绩:") Do While Not IsNumeric(cj) MsgBox "请输入w数字!", ...

巨鹿县13512296429: 告诉我一些简单的vb编程代码 -
堂侵芒果: uEnd是用户定义捕捉VB输出框(MsgBox)按下按钮事件一个变量.即你的原代码 MsgBox "您确定要离开吗?", vbYesNo + vbQuestion, "离开程序"执行按vbYes或vbNo按钮的结果...

巨鹿县13512296429: 关于一个简单的VB程序的设计 -
堂侵芒果: Dim Num1 As Integer Dim i As Long Private Sub Command1_Click() Randomize Num1 = Int(100 * Rnd) End Sub Private Sub Form_Load() Command1_Click End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) Dim Valuetext As Integer If ...

巨鹿县13512296429: vb程序设计·一个简单的VB程序· -
堂侵芒果: 有三个按钮(Command1、Command2、Command3)、一个文本框(text1)和一个标题框(Label1) Private Sub Command1_Click() Text1.Visible = False Command1.Visible = False Label1.FontSize = 14 Label1.FontName = "黑体" Label...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网