vb程序设计实例讲解(vb程序设计,要详细解答过程)

2024-05-10 18:41:42 2

vb程序设计实例讲解(vb程序设计,要详细解答过程)

本文目录

vb程序设计,要详细解答过程

需要输出:

0空格+9个5

1空格+7个4

2空格+5个3

3空格+3个2

4空格+1个1

Private Sub Command1_Click()Text1.Text = "" ’先清空For i = 5 To 1 Step -1  ’循环5次  ’ 空格数量:5-i = 从0到4  ’ 数字数量:i*2-1 = 从9到1  Text1.Text = Text1.Text & Space(5 - i) & String(i * 2 - 1, CStr(i)) & vbCrLfNextEnd Sub

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

分类:电脑IT 四、数组中常见错误和注意事项1.静态数组声明下标出现变量 n = InputBox("输入数组的上界") Dim a(1 To n) As Integer2.数组下标越界 引用的下标比数组声明时的下标范围大或小。 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 I3.数组维数错 数组声明时的维数与引用数组元素时的维数不一致。 Dim a(3, 5) As Long a(I)=104.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 Integer2.数组下标越界引用了不存在的数组元素,即下标比数组声明时的下标范围大或小。例如,要形成有如下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 aa()=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 i6.给数组赋值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 IfEnd IfEnd Sub该过程没有语法错,运行程序可输入若干个数,但当输入9999时,程序显示"溢出"的错误。原因sum和n是局部变量,每按一个键,局部变量初始化为0,所以会有上述错误产生。改进方法:将要保值的局部变量声明为Static静态变量或声明为窗体级变量。也可将要保值的变量在通用声明段进行声明为窗体级变量。6.递归调用出现"栈溢出"如下求阶乘的递归函数过程:Public Functionfac(n As Integer)As integerIf n=1 Then fac=1Else fac=n*fac(n-1)End IfEnd FunctionPrivate Sub Commandl_Click() ’调用递归函数,显示出fac(5)=120Print "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 Sub1.窗体顶部菜单栏中的菜单项与子菜单中的菜单项的区别窗体顶部菜单栏中的菜单项与子菜单中的菜单项都是在菜单器中定义的,但是它们是有区别的。(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=13.在工程中添加现有窗体时发生加载错误在使用"工程"菜单中的"添加窗体"命令添加一个现存的窗体时经常发生加载错误,绝大多数是因为窗体名称冲突的缘故。例如,假定当前打开了一个含有名称为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 0MsgBox("NameArmy(0)(样本菜单项) is clicked!") Case 1MsgBox("NameArray(1)(第一个实购菜单项) is clicked!") Case 2MsgBox("NameArray(2)(第二个实时菜单项) is clicked!")End SelectEnd 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 EndlfEnd Sub6.与窗体有关的事件在首次用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 Form2Debug.Print"用Unload卸载窗体时发生的事件:"UnloadForm2Debug.Print "窗体第二次装入内存时发生的事件:"Load Form2Debug.Print "用Unload卸载窗体时发生的事件:"Unload Form2Debug.Print "用Set窗体名=Nothing语句解除初始化时发生的事件:"Set Form2=NothingDebug.Print "窗体第三次(解除初始化后)装入内存时发生的事件:"Load Form2End Sub’Form2窗体事件过程Sub Form_Initialize() Debug.Print"Initialize事件"End SubSub Form_Lond() Debug.Pnnt"Load事件"End SubSub Form_QueryUnload(Cancel As hteger, UnloadMode As Integer) Debug.Print"QueryUnload"End SubSub Form_Unlond(Cancel As Integer) Debug.Print"Unload"End SubSub 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 Sub2.如何在目录列表框表示当前选定的目录在程序运行时双击目录列表框的某目录项,则将该目录项改变为当前目录,其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.FileNameElse ’ 表示选定的是子目录,子目录与文件名之间加"\"F=Filel.Path+"\"+Filel.FileNameEnd IfOpen F For Input As # 14.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 #1Print FOpen "C:\my\t1.txt" For Input As #1Print "2";F执行到第二句Open语句时显示"文件已打开"的出错信息。6.如何读出随机文件中的所有记录,但又不知道记录号。不知道记录号而又要全部读出记录,则只要同顺序文件的读取相似,采用循环结构加无记录号的Get语句即可,程序段如下: Do While Not EOF(1) Get #1, , j Print j; Loop随机文件读写时可不写记录号,表示读时自动读下一条记录,写时插入到当前记录后。

vb实例教程(一个查找程序)

Dim a As IntegerDim b As IntegerPrivate Sub Command1_Click()k = InStr(a, Text2, Text1)If k 》 0 Then Command1.Caption = "查找下一个" a = k + Len(Text1) Text2.SetFocus Text2.SelStart = k - 1 Text2.SelLength = Len(Text1) b = b + 1Else MsgBox "查找完毕!共找到 " & b & " 个 " & Text1 Command1.Caption = "查找" a = 1End If’Print kEnd SubPrivate Sub Form_Load()Label1 = "要查找的内容:"Command1.Caption = "查找"a = 1End Sub

细致深入讲解VB.NET通信程序

和大家一起来探讨一下通信程序及其在windows平台下的通信软件设计方法,结合具体实例给出了基本的通信程序,希望对大家有帮助。1992年crescent software inc.公司专为vb设计mscomm.vbx用户通信控件,它提供了通过串口发送和接收数据的串行通信能力,不但包括了全部windows api中关于串行通信的16个函数所完成的功能,而且开拓了更多的使用户设计方便的对象属性来满足不同用户不同业务的需求。目前国内众多的vb资料中很少涉及该通信控件的介绍,本文将详细介绍mscomm.vbx通信控件及编程方法,并结合工作中的一个实例给出基本通信程序。1 mscomm.vbx通信控件描述mscomm.vbx通信控件可直接从vb的toolbox中加入窗体form,即可用其进行通信。若toolbox中无此控件,则用tools的custom controls 将mscomm.vbx从windows的system子目录中加入vb的toolbox中。1.1 通信方式mscomm.vbx有2种不同的方式来处理和解决各类通信软件的开发和设计问题1)事件驱动。它与c/c++写windows 软件时的窗口回调函数类似,是1种功能强大的处理问题的方法。在实际工作中,往往要处理许多通信中的相关事件,例如:当线路数据到达本端或cd线和rts信号线状态发生变化时,要求我们使用相应的事件来跟踪和处理,该控件是使用oncomm事件来实现的,它也包括检测和处理通信错误等方面的问题,commevent 值返回最近的通信事件或错误的数字代码。通信控件详细的错误和事件举例有:mscomm-er-break 收到1个break signalmscomm-er-cdto cd 信号超时mscomm-ev-cd cd信号改变2)查询方式。由程序设计者负责读取commevent的值并处理所发生的错误或事件。通常简单的应用程序设计可采用这种办法。1.2 通信控件的属性利用通信控件编制通信程序,关键是准确理解设置通信控件的属性。mscomm.vbx提供了27个关于通信控件方面的属性,例如:commport:设置或返回通信口编号。settings:设置或返回以字符串形式出现的数据通信格式:波特率、校验、数据位和停 止位。portopen:设置或返回通信口状态(包括打开和关闭1个通信口)2.实例本程序应用背景为dcc95型静电除尘器自动监控系统软件,解决1个pc工控机(主站)与32个单片机(子站)之间的通信问题。主站与子站之间这总线式网络结构,采用rs-485通信标准,以问答方式进行数据通信。由于32个子站与主站发送通信命令(下行命令),主站在接收子站发回的相应回答命令(上行命令)后继续发送下行命令的通信形式。根据系统功能的要求,主站需发送2种类型的命令:(1)同期命令,它由定时器触发引起,每隔ls周期发送1次;(2)非周期性命令,它由操作者按动相应命令按钮引起,非周期性发送。自动监控系统软件安装在主站上,而通信程序作为自动监控系统软件的一部分也安装在主站上。本文仅列出调试通信程序时进行试验用的基本演示程序清单。试验时,用1台pc机作为主站,另一台pc机模拟32个子站的工作,两台pc机之间采用rs232c串口通信。往主站的通信演示程序窗体(form)中加入1个通信控件、2个定时器控件和1个命令按钮控件,通信控件(mscomm1)用于访问串口,发送和接收数据;periodic定时器控件(periodic)用于控制每秒由主站向各子站发送周期性命令;命令按钮控件(nonperiodic-command)与nonperiodic定时器控件(nonperiodic)用于发送非周期性命令。数据传送采用事件驱动的通信方式,根据不同的发送命令设置rtreshlod属性,从而引起oncomm事件以接收数据。2.1 窗体各控件初始化程序设置通信串口工作参数,设置periodic定时器的在断间隔为ls, nonperiodic定时器的中断间隔为0.5s。sub form-load ()mscomm1.commport=2 ’选用com2串行口mscomm1.settings="9600,n8,1" ’波特率9600,无奇偶校验位,8位数据位1位停止位mscomm1.inputlen=0 ’input将读取接收缓冲区的全部内容mscomm1.inbuffersize=1024 ’设置接收缓冲区的字节长度mscomm1.portopen=true ’打开通信口mscomm1.inbuffercount=0 ’清除发送缓冲区数据mscomm1.outbuffercount=0 ’清除接收缓冲区数据periodic.inteval=100 ’设置ls定时间隔,使遥测命令每隔ls发送1次nonperiodic.inteval=500 ’设置0.5s定时间隔,查询命令按钮是否处于激活状态以确定是否发送周期性命令command-pressed=false ’命令按钮为未激活状态during- periodic=false ’周期性命令数据传输尚未开始during- nonperiodic=false ’非周期性命令数据传输尚未开始end sub2.2 非周期性命令发送程序根据命令按钮状态及周期性命令数据传输状态,在nonperiodic定时器的中断程序中发送非周期性命令。sub nonperiodic-command-click ()command-pressed=true ’命令按钮激活end subsub nonperiodic-timer ()if during- periodic=true or command-pressed=falsethen exit sub ’若周期性命令数据传输尚未结束或命令按钮处于激活状态,则退出发送非周期性命令程序。command-pressed=false ’命令按钮恢复为未激活状态call senddata (nonperiodic-command) ’发送非周期性命令mscomm1.rthreshold=r-nonperiodic-byte’发送非周期性命令后,设置rthreshold属性,使主站接收所设定的字节数后引发oncomm事件end sub2.3 periodic定时器程序在periodic定时器的中断程序中发送周期性命令:sub periodic-timer ()if during- nonperiodic=true then exit sub ’若非周期性命令数据传输尚未结束,则退出发送非周期性命令程序。during-periodic=true ’设置周期性命令数据传输状态为正在进行中call senddata (periodic-command) ’发送周期性命令mscomm1.rthreshold=r-periodic-byte ’发送周期性命令后,主站接收r-remot- edata-byte个字节,可引发oncomm 事件end sub2.4 oncomm事件程序根据rthreshold属性设置值,当接收缓存区内接收到相应字节的字符时,引发oncomm事件,在中断程序中接收数据。sub mscomm1-oncomm () select case mscomm1.commevent ’在此可插入处理各种不同错误或事件的代码case mscomm-ev-receivereceivestring$=mscomm1.inputselect case mscomm1.rthresholdcase r-periodic-byte ’周期性命令的应答数据call disposedata(periodic-command) ’处理接收数据during periodic=false ’设置周期性命令数据传输状态为结束case r-nonperiodic-byte ’非周期性命令的应答数据call disposedata(nonperiodic-command) ’处理接收数据during-nonperiodic=false ’设置非周期性命令数据传输状态为结束end selectend select随着vb版本的不断升级,vb将成为最快速、易用、强劲的应用开发工具,是企业级客户/服务器应用软件开发的首选工具之一。

结合实际生活举例说明VB的程序设计的应用

我用VB6编程的程序,作福彩双色球(按青睐的号码加权)电脑选号,

运行界面截图如下,你想要该程序否?

vb程序设计,要详细解答过程,谢谢

#include《stdio.h》int main(){int x;int b;int y;printf("请输入X的值:");scanf("%d",&x);if(x》1&&x《10&&x!=2&&x!=6)b=1;if(x==2||x==4||x==6)b=2;if(x》=10)b=3;if(x==0)b=4;switch(b){case 1:printf("输出y=10\n");break;case 2:printf("输出y=20\n");break; case 3:printf("输出y=30\n");break;case 4:printf("输出y=40\n");break;}}

vb程序设计实例讲解(vb程序设计,要详细解答过程)

本文编辑:admin

更多文章:


c语言创建二维数组(C语言如何建立一个二维数组)

c语言创建二维数组(C语言如何建立一个二维数组)

本文目录C语言如何建立一个二维数组用c语言创建一个二维数组a[m][n],要求m,n从键盘输入C语言:创建一个5x5二维数组,使周边元素值为1,其余元素值为0,并显示在屏幕上,咋写C语言如何建立一个二维数组刚刚看错了,原来是C语言,这样就好

2024年7月1日 21:29

html小图标代码大全(HTML静态网页的地址栏小图标)

html小图标代码大全(HTML静态网页的地址栏小图标)

大家好,今天小编来为大家解答以下的问题,关于html小图标代码大全,HTML静态网页的地址栏小图标这个很多人还不知道,现在让我们一起来看看吧!本文目录HTML静态网页的地址栏小图标这个小图标怎么用html代码写出来HTML怎么在超链接被鼠标

2024年7月10日 02:04

超详细tomcat安装及配置教程(apache_tomcat_7.0.69怎样安装及配置)

超详细tomcat安装及配置教程(apache_tomcat_7.0.69怎样安装及配置)

各位老铁们好,相信很多人对超详细tomcat安装及配置教程都不是特别的了解,因此呢,今天就来为大家分享下关于超详细tomcat安装及配置教程以及apache_tomcat_7.0.69怎样安装及配置的问题知识,还望可以帮助大家,解决大家的一

2024年8月5日 04:15

fontweight wpf(WPF 按钮属性触发器的问题)

fontweight wpf(WPF 按钮属性触发器的问题)

本文目录WPF 按钮属性触发器的问题WPF DATAGRID分组如何实现全展开WPF Canvas子控件Label无法居中wpf DynamicDataDisplay 如何设置Y轴从上到下显示是从小到大WPF 按钮属性触发器的问题原因是你在

2024年7月9日 12:54

possible同义词两个空(probably的同义词是什么)

possible同义词两个空(probably的同义词是什么)

本文目录probably的同义词是什么possible等于什么两个单词的请问possible,probably,may,might,may be,maybe,的区别probably的同义词是什么maybe、perhaps、possibly一

2024年7月10日 15:18

js弹出框确定和取消点击事件(用weeboxs.js做弹出框,点击确定或取消按钮,想返回true 或false值,可是调用的时候只得到true或false)

js弹出框确定和取消点击事件(用weeboxs.js做弹出框,点击确定或取消按钮,想返回true 或false值,可是调用的时候只得到true或false)

本文目录用weeboxs.js做弹出框,点击确定或取消按钮,想返回true 或false值,可是调用的时候只得到true或falsejs 鼠标点击事件JavaScript关闭IE弹出提示,救助,感谢!用javascript实现一个对话框,点

2024年5月29日 17:35

定义锚点属性(简要说明如何在html中创建锚点链接)

定义锚点属性(简要说明如何在html中创建锚点链接)

大家好,定义锚点属性相信很多的网友都不是很明白,包括简要说明如何在html中创建锚点链接也是一样,不过没有关系,接下来就来为大家分享关于定义锚点属性和简要说明如何在html中创建锚点链接的一些知识点,大家可以关注收藏,免得下次来找不到哦,下

2024年7月23日 13:22

java常见编程笔试题(JAVA笔试题(与构造函数、静态变量有关))

java常见编程笔试题(JAVA笔试题(与构造函数、静态变量有关))

这篇文章给大家聊聊关于java常见编程笔试题,以及JAVA笔试题(与构造函数、静态变量有关)对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录JAVA笔试题(与构造函数、静态变量有关)哪里有java笔试题一道JAVA面试笔试题,

2024年7月9日 06:43

switch日本官网(switch日本人工客服怎么联系)

switch日本官网(switch日本人工客服怎么联系)

这篇文章给大家聊聊关于switch日本官网,以及switch日本人工客服怎么联系对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录switch日本人工客服怎么联系switch日版账号注册教程switch日版niconico打不开

2024年8月11日 09:45

美国最无能的五位总统(美国历史上最差的一任总统是谁,有怎样的地位)

美国最无能的五位总统(美国历史上最差的一任总统是谁,有怎样的地位)

本文目录美国历史上最差的一任总统是谁,有怎样的地位美国历史上最糟糕的十大总统与最著名的十大总统分别是谁盘点美国历史上竞选连任失败的总统:20世纪以来共5位美国最无能总统是谁美国第44任总统是不是美国史上最无能的总统奥巴马和小布什谁是美国历史

2024年7月24日 15:11

抽象类的关键字(kotlin 抽象类(Abstract)和接口(Interface))

抽象类的关键字(kotlin 抽象类(Abstract)和接口(Interface))

这篇文章给大家聊聊关于抽象类的关键字,以及kotlin 抽象类(Abstract)和接口(Interface)对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录kotlin 抽象类(Abstract)和接口(Interface)

2024年8月3日 21:45

tel什么意思(TEL是什么意思)

tel什么意思(TEL是什么意思)

本文目录TEL是什么意思TEL的意思是什么TEL是什么意思TEL=Telphone=电话号码TEL=Telphone=电话号码.TELl域名又称之为网络名片、手机名片。.TEL域名不能像.COM域名那样解析指向到你自己的主机服务器以展示你的

2023年12月22日 20:40

嵌入式驱动开发(嵌入式开发有分几类呢)

嵌入式驱动开发(嵌入式开发有分几类呢)

本文目录嵌入式开发有分几类呢嵌入式系统,驱动开发需要掌握什么知识嵌入式驱动开发需要了解的知识大概有哪些呢嵌入式Linux设备驱动开发驱动开发一定是嵌入式开发吗嵌入式开发有分几类呢嵌入式技术已经无处不在,从随身携带的mp3、语言复读机、手机、

2024年7月5日 05:01

porter classic(porter classic为什么这么贵)

porter classic(porter classic为什么这么贵)

本文目录porter classic为什么这么贵求Miss Porter 的插曲 let me teach you how to danceporter classic为什么这么贵因为他的定位就很高端,单品含大量日本刺子老布。他是复古

2024年6月26日 13:13

orthogonal(wifi网和手机4G网络哪个快)

orthogonal(wifi网和手机4G网络哪个快)

本文目录wifi网和手机4G网络哪个快wifi网和手机4G网络哪个快我有靠谱回答。简单的比较4G网络和WiFi的网速没有实际意义,4G网络不同的带宽网速不一样,WiFi各协议所能达到的网速也不同。网速受多方面因素影响,一般情况下,WiFi的

2024年6月27日 16:40

电销外呼软件不封号(电销用什么软件不封号)

电销外呼软件不封号(电销用什么软件不封号)

这篇文章给大家聊聊关于电销外呼软件不封号,以及电销用什么软件不封号对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录电销用什么软件不封号电销防封软件怎么做到不封号我们是电销团队,想找一款自动外呼防封卡功能的软件,大家推荐一下电销

2024年7月22日 06:01

vmwaretools安装命令(如何在Linux命令行模式安装VMware Tools)

vmwaretools安装命令(如何在Linux命令行模式安装VMware Tools)

大家好,vmwaretools安装命令相信很多的网友都不是很明白,包括如何在Linux命令行模式安装VMware Tools也是一样,不过没有关系,接下来就来为大家分享关于vmwaretools安装命令和如何在Linux命令行模式安装VMw

2024年8月29日 23:25

z型提升机功率计算(提升机提升机构,减速机速比是17,电机输入转速1400r/min,顶端链轮直径400mm,求电机功率)

z型提升机功率计算(提升机提升机构,减速机速比是17,电机输入转速1400r/min,顶端链轮直径400mm,求电机功率)

本文目录提升机提升机构,减速机速比是17,电机输入转速1400r/min,顶端链轮直径400mm,求电机功率做个小型提升机,吊500公斤左右,高度6米,速度15秒每米,需要多大的电机提升机的功率该怎么算谁会算提升机的用电量计算啊设备的功率是

2024年7月22日 15:39

自动分词工具(有没有好用的词云工具,就是可以提取一大段文本的高频词,可以随意排列的那种)

自动分词工具(有没有好用的词云工具,就是可以提取一大段文本的高频词,可以随意排列的那种)

本文目录有没有好用的词云工具,就是可以提取一大段文本的高频词,可以随意排列的那种如何自动把竞价账户的长尾词和短词自动分组,最近搭建新账户,感觉词SEM竞价推广中关键词快速分组工具使用方法谁来推荐一个JAVA的分词工具打字自动分词怎么办有没有

2024年5月6日 02:29

vlookup函数教学视频(excel里的vlookp函数怎么用)

vlookup函数教学视频(excel里的vlookp函数怎么用)

本文目录excel里的vlookp函数怎么用请教excel高手,vlookup怎么用vlookup函数的操作实例,求详细图例解释 ,最好是视频教学vlookup函数的应用视频excel里的vlookp函数怎么用工具/材料:Microsoft

2023年9月30日 17:40

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1730
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1154
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1151
标签列表

热门搜索