vb事件说明 Event使用方法
- 格式:ppt
- 大小:74.50 KB
- 文档页数:8
什么是窗体事件Click、Load、Dblclick、KeyDown、KeyPress、KeyUp、MouseDown、MouseMove、MouseUp、Unload 等在Visual Basic应用程序中,窗体的事件(Event)就是指由Visual Basic预先定义好的,能够被窗体对象所识别的动作。
事件可以由用户激发,也可以由系统激发。
窗体是控件的载体,是程序运行的主要场所,一些程序运行所必须的初始化操作和退出前的善后工作,往往要在窗体创建及退出时被激活的事件过程中进行。
下面我们边了解窗体的生命历程:创建状态、加载状态、可见状态和卸载状态,边学习各阶段会发生的事件。
常用窗体事件(1)Click 事件在程序运行时单击窗体内的某个位置,Visual Basic将调用窗体的Form_Click 事件。
如果单击的是窗体内的控件,则只能调用相应控件的Click事件。
Click 事件:标题栏显示“鼠标单击”,窗体显示"欢迎使用VB"Private Sub Form_Click()Caption = "鼠标单击"Print "欢迎使用VB"End Sub(2)DblClick 事件程序运行时双击窗体内的某个位置,就触发了两个事件,第一次按动鼠标时,触发Click事件,第二次产生DblClick事件。
DblClick 事件:标题栏显示“双击窗体” ,清除背景图。
Private Sub Form_DblClick()Caption = "鼠标双击"Picture = LoadPicture("")Print "结束使用VB"End Sub(3) Initialize初始化事件与 Load事件在程序运行时,当窗体被装入工作区时开始为Initialize之后才触发它的Load 事件。
所以该事件通常用来在启动应用程序时,对控件属性和变量初始化Private Sub Form_Load()Caption = "装入窗体"Picture = LoadPicture ( App.Path + "\window.jpg")FontSize = 48FontName = "隶书"Print "装入窗体"End Sub(4) Unload事件Private Sub Form_Unload(cancel As Integer)卸载窗体时触发该事件。
VB DoEvents用法VB6.0Windows98我要实现一个类似Windows复制(移动)文件时的提示窗体,耗时很长,且要求中断后能继续未完成的操作,不知使用DoEvents从长循环中跳出后,程序将从何处开始继续执行,是否是从DoEvents所在的Sub开始?(倔小孩)事实上仅使用DoEvents,并不意味着从长循环中跳出。
DoEvents只是允许用户选择其他按钮而已,不中断循环,不管用户如何操作,都继续执行DoEvents后面的语句,即使用户按下了中断按钮,你的循环仍然在继续,甚至你关闭了窗体,程序仍然继续在后台运行。
正确的中断处理是这样的:1、建立一个全局或窗体变量bRun。
2、在启动循环前设置bRun为True。
bRun = TrueWhile bRun And (....)....DoEventsWend...3、在中断按钮Click事件中加入代码:bRun = False4、在Form_Unload事件中加入代码:bRun = False这样一旦用户按下了中断按钮,bRun = False,循环的条件就不满足了,所以退出循环,执行后续语句。
你也可以采用下面的方式:bRun = TrueWhile ....If Not bRun ThenExit SubEnd If....DoEventsWend...郭勇的意见:《解析事件,Doevents,闲置循环和控时循环中的难点问题》Visualbasic6.0 代码copyright guoyong in cqums(2004-2-26)关键问题归于doevents 函数DoEvents函数的功能是:转让控制权,以便让操作系统处理其它的事件。
问:为什么要用doevents?A.在需要用某一循环处理相当耗时或者很快速的代码时,就需要用到它,以便用户能在起处理过程中能做其他事情,即程序能被控制,而不是无响应状态B.vb6.0中多线程vb代码极度不稳定,而且无法调试,所以vb中的多线程用的很少(注:是指vb 的代码在多线程中运行时不稳定)C.timer控件可以起到后台运行作用,但其是通过事件控制,一是不稳定,二是速度太慢,如果想用其处理高速又耗系统的代码更本不能达到预期的效果下面将其某些用法和难点简介如下:(注: '** 后面的代码表示如果在该处用了这个语句以下代码中用到了一些api函数,请用vb附带的api浏览器查阅)一. 基本用法:1.窗体启动时如果要处理的事务太多或者用sleep函数暂停,造成其很久都不能出现时怎么办?例如代码:Private Sub Form_Load()Show'**DoEventsSleep 5000End Sub通常容易想到在sleep前加个show,但还是不能达到预想的效果,窗体虽然出来了,但好象只达到了一半,如果加上第3句,将看到效果大不相同2.如果有个很耗时的循环导致程序不响应,怎么办?例如:Dim L As LongFor L = 1 To 1000000'** DoEventsNext L如果无'**,在循环过程中程序无法处理事件,对于用户来说是不响应,无法控制的3.想在循环中看到处理过程?同样:Dim L As LongFor L = 1 To 10000'** DoEventsText1.Text=Cstr(l)Next L无'** 时将无法看到text1中的变化,而只在循环结束时看到最后结果4.怎样中止循环?如果有:Private Sub Command3_Click()Dim L As LongDoL = L + 1Debug.Print LLoopEnd Sub会发现当关闭窗口后,debug中的数据仍然在变化,说明并没结束需要如下:Dim IsExit As BooleanPrivate Sub Command1_Click()Dim L As LongIsExit = FalseDo While DoEventsIf IsExit = True Then Exit DoL = L + 1LoopEnd SubPrivate Sub Command2_Click()''或者在form_unload模块中等等IsExit = TrueEnd Sub其中isexit是全局变量<>有些人喜欢用end语句来结束程序,小程序固然可以,但当太大,或者调用了某些特殊的api 函数后可能导致预想不到的错误,如果装载了许多东西在程序结束时不处理将卸载很慢,而且这种做法也极不符合正规软件的要求...总之end语句毛病很多,此不详谈,建议少使用甚至不使用二. 其基本用法大概就这些,现在解析其中的一些[难点]1.为什么还是不能结束?代码如下:Dim IsExit As BooleanPrivate Sub Command1_Click()Dim L As LongIsExit = FalseDoIf IsExit = True Then Exit Do '句0DoEvents '** 句1Text1.Text = CStr(L) '** 句2L = L + 1LoopEnd SubPrivate Sub Form_Load()Static N As LongN = N + 1End SubPrivate Sub Form_Unload(Cancel As Integer)IsExit = TrueEnd Sub运行结果:启动时msg显示1,点击command1,text1在变化此时再点form右上角的小差(关闭窗体),发现vb运行控制上的按扭并没变化,说明程序还在运行.如果编译成程序后运行,按下ctrl+del+alt也可发现它还没结束.通过读代码,并没发现错误,怎么回事?关键在于句2 访问了控件的属性代码运行路径:当在doevents 时,程序释放控制权,可以接收事件消息,form-unload事件只能从此处产生,假设此时关闭form ,unload事件发生,即doevents后就运行unload代码,得到isexit=t,并且form卸载,代码返回到doevents 之后,运行句2.注意现在form 已经卸载了,text1从哪里来呢?于是form重新装载,代码跳到form_load模块运行,所以在关闭窗体后可以看到msg 显示2,此模块运行完后再继续句2后面的代码,当下次循环遇到句0时退出循环另:既然退出了循环,怎么还不能结束?vb程序规定(其实其他的windows语言一样):窗体卸载时并不是立即卸载其模块代码,而只先卸载窗体中的控件和一些属性值,程序中最后一个窗体卸载时才完全卸载.在这个单窗体程序中,form卸载时因为循环的控制无法卸载代码,失去了卸载代码的机会,导致再也不能卸载(因为没卸载代码,所以运行的句2 是并不会出错)另:既然再次运行了form_load代码,怎么看不见窗体?因为程序启动时窗体的到显示的消息,而只运行此模块并没有(如果在msgbox n语句前加上show,就可以看到它了)如何解决?通过以上分析,应该很简单,把句1 和句2调换一下就可以了,关键:<仔细分析代码是如何运行的,避免在form已经卸载了情况下访问控件>2.用了doevents速度太慢了怎么办?doevents的代价是速度变慢,但要程序响应又不得不用其实doevents语句允许任何应用程序执行相关事件,而不仅仅是你自己的程序,所以变得很慢.可以让它响应本程序事件动作,需要用到api函数GetInputState例如用: If GetInputState() Then DoEvents '来代替doevents可使循环运行更快3.既要同时响应事件又要控件不变化,怎么办?例如在一个长的循环中向listview控件中添加记录,无doevents时程序无响应,但有它时控件又闪的厉害解决办法:a.不一定每次循环都doevents,可以在适当时间时才用,至少没那么闪b.应用api函数V alidateRect 功能是使指定的矩型区域生效,通知Windows不对指定的区域进行重画另:InvalidateRect 功能相反,同时需要用到函数GetClientRect 取得指定对象的矩形区域应用*rect函数指定listview的矩形区不重画,即可避免闪烁(但还是要注意恢复重画,否则看不见了真实效果)4.控时循环和变速齿轮请看下面的代码:Option ExplicitPrivate Declare Function timeGetTime Lib "winmm.dll" () As LongDim IsExit As BooleanPrivate Sub Command1_Click()Dim L As LongDim Kt As LongIsExit = FalseDoKt = timeGetTime()'do somethingL = L + 1Text1.Text = L'DoEvents '句1While timeGetTime - Kt < 50 '句2'While Abs(timeGetTime - Kt) < 50 '句3'While Abs(timeGetTime - Kt) And (Not IsExit) < 50 '句4DoEvents '句5Wend'DoEvents '句6If IsExit Then Exit DoLoopEnd SubPrivate Sub Form_Unload(Cancel As Integer)IsExit = TrueEnd Sub其中可用的代码(除去加"'" 号的代码)就是通常的控时循环代码运行代码并不会出现错误,但在循环过程,请开启变速齿轮看看当关闭齿轮时,将发现text1.text停止了,别慌,等一段时间它又会继续(这要看你设定的时间,这里是50毫秒,如果设定的太长text1.text将半天都没变化,这是怎么回事?变速齿轮在启动时将hook.dll映射到你的程序地址运行,更改了timegettime()函数获取的时间如果在句2和句3间插入debug.print timegettime,timegettime-kt 将发现,在关闭齿轮的瞬间后者变成了负值,timegettime变小了,所以才造成需要等很久如果是编写游戏,而用户开了齿轮,那可就惨了解决方案:a.用句3代替句2,这个方法最简便,虽然不符实,但不会出问题,建议使用b.不要句5,换用句6(这样就能达到效果吗?) 因为齿轮还是从doevents语句运行时才能插的进来,所以只要kt=timegettime 和timegettime之间没有doevents就不会出错ab.两种方法都有些小问题,但无大碍,有兴趣者请自己分析5.程序怎么"死了"?这只是一些人编写时没注意到的小问题,提醒一下:同样用上面的代码,如果设定的时间太短,以至在代码运行到句2时已经超时了,句5将不能运行了,当然程序就死了哦,以防万一,加上句1,所以此时也只能用a方案来解决齿轮的问题了有必要用句4代替句3 吗? 除非你设定的时间太长,人家想关闭你的程序要等上好半天好了,也差不多,该收工了,如果有什么忘了说,你又想知道的话,可以来和我一起探讨若有什么错了的请指正,谢谢!希望你能把程序写的更好!。
vb6 withevents 说明
在Visual Basic 6中,使用`WithEvents`关键字可以声明和处理事件。
`WithEvents`关键字用于声明一个对象变量,并允许该变量处理其他对象所引发的事件。
使用`WithEvents`关键字的步骤如下:
1. 首先,在类模块或标准模块中声明一个对象变量,并在变量声明之前使用`WithEvents`关键字。
例如:
```
Private WithEvents myButton As CommandButton
```
2. 然后,通过实例化对象并将其赋值给变量,将事件处理程序与对象的事件关联起来。
例如:
```
Set myButton = mand1
```
3. 最后,在类模块或模块中编写事件处理程序来响应所关联对象的事件。
例如:
```
Private Sub myButton_Click()
MsgBox "Button clicked!"
End Sub
```
通过使用`WithEvents`关键字,可以将对象的事件处理程序与
对象的事件关联起来,使得在事件发生时自动触发相应的事件处理程序。
这样,我们可以通过编写相应的代码来处理事件,而不需要手动检测并响应事件。
vb6 withevents 说明VB6是一种编程语言,它具有一项功能叫做"WithEvents"。
本文将详细介绍VB6中的"WithEvents"功能,包括其定义、用途和示例代码等。
"WithEvents"是VB6中的一个关键字,用于声明一个对象变量,该对象变量可以处理其他对象的事件。
在VB6中,对象可以引发事件,而"WithEvents"关键字允许我们在代码中编写事件处理程序来响应这些事件。
通过"WithEvents",我们可以将事件处理程序与特定的对象关联起来,从而实现对事件的响应和处理。
在VB6中,我们可以使用"WithEvents"关键字来声明一个对象变量,并将其与一个具有事件的对象相关联。
当相关联的对象引发事件时,与之相关联的事件处理程序将被调用。
这使得我们可以根据需要对事件进行自定义处理。
"WithEvents"关键字的语法如下所示:```Dim WithEvents 对象变量名 As 对象类型```在声明对象变量时,我们使用"WithEvents"关键字,并为其指定一个对象类型。
这样,对象变量就具有了处理该对象的事件的能力。
"WithEvents"关键字的使用非常灵活,我们可以将其与各种对象一起使用,包括窗体、按钮、文本框等。
通过使用"WithEvents",我们可以根据需要对不同对象的不同事件进行处理,从而实现更加灵活和个性化的编程。
下面是一个使用"WithEvents"关键字的示例代码:```Private WithEvents btnClick As CommandButtonPrivate Sub Form_Load()Set btnClick = Command1End SubPrivate Sub btnClick_Click()MsgBox "按钮被点击了!"End Sub```在上面的示例代码中,我们使用"WithEvents"关键字声明了一个名为"btnClick"的CommandButton对象变量,并将其与一个具有点击事件的CommandButton对象相关联。
VB事件事件(Event):事件是指由系统事先设定的、能被对象识别和响应的动作。
事件是指对象对于外部动作的响应,当对象发生了某个事件,就会执行与此对象的这个事件相应的代码,这段代码被称为“事件过程”。
事件过程的命名格式为: Private Sub 控件名_事件名()例如:我们在窗体上按了一下鼠标左键,这样就发生了一个窗体的“Click”(即单击)事件,并执行与其对应的事件过程。
这个的事件过程名称为:Form1_Click我们可以为事件过程编写代码,使得当某个对象发生了某个事件时可以执行我们需要的一些操作。
事件即控件对外部条件的反应,不同的控件具有不同的事件。
如:对于命令按钮,通常情况下我们都是单击它,所以最常使用的是单击事件,对于驱动器列表框控件,通常我们使用的是它的改变事件。
但我们使用控件的相应事件时,我们必须对其相应的事件进行编写代码,否则控件什么事情也不会做。
事件处理器确定控件如何响应事件的事件过程可以称之为“事件处理器”。
要为某一控件的特定事件编写程序,可以通过双击控件切换到代码窗口再选择相应的事件来完成,也可以通过“视图”菜单中的“代码窗口”命令切换到代码编辑窗口来完成。
我们看到两个下拉列表框,第一个下拉列表框里包含了窗体中所有的控件,包括窗体本身;第二个下拉列表框中包含了选中控件的所有事件。
在此状态下,要对某个控件进行编程,需要先在左边的下拉列表框中选中要编程的控件,然后再右边的下拉列表框中选择要编程的事件。
例如我们要对“Commandl”控件的“KeyDown'’事件进行编程。
控件名称和相应事件的名称共同构成了事件处理器的名称,如上图中所示的“Form Load ()”表示对象是“Form'’窗体,“Load'’表示窗体的加载事件,即窗体启动时发生的事件,对此事件进行编程可以确定窗体启动时所做的事情。
常用的事件有两种,即鼠标事件和键盘事件。
鼠标事件鼠标事件是Visual Basic编程中最常用到的事件,多数控件都支持鼠标操作,因此对鼠标事件进行编程是非常重要的。
DoEvents的作用及实例讲解在VB编写应用程序的时候,往往会遇到一些比较费时的任务,比如读取读取一个较大的文件。
但是,大家也试过,如果直接执行这些语句,应用程序就会卡住,因为这时主线程正在“全速”执行这些代码,所以不能响应任何的事件消息。
很多朋友想到了用多线程的办法,确实没错,使用另一个任务线程来完成任务,主线程就仍然可以响应事件消息。
但是,在VB中使用多线程是不稳定的,极容易发生严重的错误,如:————————————————————————————————————————————————“0x********”指令引用的“0x********”内存,该内存不能为“read”【或“written”】要终止程序,请单击“确定”要调试程序,请单击“取消”————————————————————————————————————————————————这是内存访问错误,是VB经常发生的,所以,我不推荐在VB中使用多线程,它们会带来无法预料的结果。
但是,VB中的DoEvents语句可以“模拟”多线程:语法格式:DoEvents作用:这条语句相当于告诉系统:这个过程(Sub/Function)不重要。
执行完了这条语句,并不会跳出这个过程,也不会另外创建一个线程继续执行,而是继续像原来那样执行!有人会问:那应用程序不是还会卡住吗?而这时的答案却不是你想的那样。
因为它向系统说过“这个过程不重要”,所以在执行与DoEvents语句在同一个过程中的、在DoEvents后面的语句时,系统就不会只管执行这些代码,而可以接受其他的事件消息。
那么,有人会问:那系统会在创建一个线程,一个线程执行原理没执行完的的过程,一个线程处理刚才的时间吗?答案是否定的。
还记得刚才的“不重要”吗?对于系统来说,它会暂停原来过程的执行,先处理完这个事件后,才会到没执行完的过程,继续执行。
这样,相当于是合理的安排了任务,当触发了新的事件时,就响应用户,执行事件过程,一旦有空闲的时候(处理完了前面的事件而没有触发新的事件),就可以处理这些费时的任务了。
事件方法vb事件方法是Visual Basic中用于处理事件的过程或函数。
事件方法通常与用户交互或操作相关的事件相关联,例如按钮点击事件、菜单项点击事件等。
当发生与事件相关的动作时,事件方法将被调用并执行特定的代码。
在Visual Basic中,可以通过以下方式创建事件方法:1. 使用事件处理程序向控件添加事件方法。
可以通过双击控件,在代码编辑器中自动生成事件方法的框架代码。
在事件方法中,可以编写与事件相关的代码逻辑。
vbPrivate Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click' 事件相关的代码逻辑End Sub2. 手动编写事件方法。
通过在代码中声明事件方法,并使用事件处理程序将其与事件关联起来。
vbPrivate Sub MyEventHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)' 事件相关的代码逻辑End Sub' 将事件处理程序与事件关联AddHandler Button1.Click, AddressOf MyEventHandler在事件方法中,可以使用Visual Basic提供的语法和函数来实现特定的功能。
例如,可以在按钮点击事件方法中编写代码来执行某些操作,例如更改文本框的内容、执行计算、显示消息框等。
总之,事件方法是Visual Basic中用于处理事件的过程或函数,通过与事件关联,可以在特定的事件发生时执行相应的代码。
一、什么是 DoEvents?在中,DoEvents是一个用于让应用程序处理消息队列中的所有等待消息的方法。
当应用程序在执行复杂运算或者等待外部事件响应时,DoEvents可以让程序在后台处理消息,从而保持界面的响应性。
二、 DoEvents的用法1. 使用DoEvents来处理界面卡顿在编写界面响应性较差的应用程序时,可以通过在复杂运算或者等待外部事件响应的过程中不断调用DoEvents来保持界面的响应。
在一个长时间的循环过程中插入DoEvents方法,可以让界面在处理循环的同时仍然能够响应用户的操作。
2. 避免滥用DoEvents虽然DoEvents可以让界面在复杂运算中保持响应,但是滥用DoEvents也可能导致一些问题。
因为DoEvents会让应用程序在处理消息队列中的所有消息,可能会导致程序处理消息的顺序被打乱,从而引发一些难以调试的bug。
因此在使用DoEvents时,需要谨慎考虑是否真正需要在特定的地方调用该方法。
3. 示例代码下面是一个简单的示例代码,演示了在一个长时间的循环中使用DoEvents来保持界面的响应:```Private Sub LongRunningProcess()For i As Integer = 1 To 0' 一些复杂的运算' ...' 在循环过程中处理消息队列If i Mod 1000 = 0 ThenApplication.DoEvents()End IfNextEnd Sub```以上代码会在每1000次循环时调用DoEvents来处理消息队列,从而保持界面的响应。
三、总结中的DoEvents方法可以在复杂运算或者等待外部事件响应的过程中保持界面的响应,但是需要谨慎使用,避免滥用导致一些潜在的问题。
在实际开发中,可以根据具体的情况来决定是否需要使用DoEvents方法,以达到最佳的用户体验。
四、 DoEvents的适用场景在实际的软件开发中,DoEvents方法可以应用于以下几个场景:1. 在长时间的循环或者计算过程中,可以使用DoEvents来让界面保持响应,同时可以让用户进行其他操作或者取消当前的计算任务。
VBA中常用的属性方法和事件VBA (Visual Basic for Applications) 是一种用于在Microsoft Office应用程序中编写宏的编程语言。
下面是VBA中常用的属性、方法和事件:属性 (Properties):1. Value:表示对象的值。
2. Name:表示对象的名称。
3. Visible:表示对象是否可见。
4. Enabled:表示对象是否可用。
5. Left、Top、Width、Height:表示对象的位置和大小。
6. Font、ForeColor、BackColor:表示对象的字体、前景色和背景色。
7. Text、Caption:表示对象显示的文本。
8. DefaultValue:表示对象的默认值。
方法 (Methods):1. Activate:激活对象。
2. Add:向集合中添加一个新对象。
3. Clear:清除对象中的内容。
4. Copy:复制对象。
5. Delete:删除对象。
6. Find:查找对象。
7. Open:打开对象。
8. Close:关闭对象。
9. Save:保存对象。
事件 (Events):1. Click:当用户单击对象时触发。
2. Change:当对象的值发生改变时触发。
3. KeyPress:当用户按键时触发。
4. MouseMove:当鼠标移动到对象上时触发。
5. BeforePrint:在打印对象之前触发。
6. OpenWorkbook:在打开工作簿时触发。
7. BeforeSave:在保存工作簿之前触发。
8. SheetChange:当工作表中的内容发生改变时触发。
此外,还有一些常用的VBA内置函数,用于执行特定的操作,例如:1. MsgBox:显示一个消息框。
2. InputBox:显示一个输入框,接收用户输入。
3. Format:格式化数据的显示方式。
4. Trim:删除字符串中的空格。
5. Len:返回字符串的长度。
vbdoevents函数用法
VBDoEvents函数是VisualBasic中的一个内置函数,其作用是让程序暂停执行,将控制权交还给操作系统,以便操作系统能够处理其他任务。
在程序执行期间,如果你需要让用户能够在程序执行期间进行其他操作,你可以使用VBDoEvents函数。
语法
VBDoEvents
示例
下面是一个使用VBDoEvents函数的示例:
Sub ExampleVBDoEvents()
'设置变量
Dim i As Integer
'循环
For i = 0 To 100
'更新进度条
UserForm1.ProgressBar1.Value = i
'暂停程序
VBDoEvents
Next i
End Sub
上面的代码在循环过程中调用VBDoEvents函数,这样就可以让程序暂停执行,以便用户可以进行其他操作。
在这个示例中,我们使
用VBDoEvents函数来更新进度条的值,这样用户就可以看到程序的进展情况。
注意事项
1. 在使用VBDoEvents函数时,要注意不要滥用这个函数,否则可能会导致程序出现意外的行为。
2. 在使用VBDoEvents函数时,要注意不要在循环体内频繁地调用这个函数,否则可能会导致程序运行缓慢。