学习java事件前,回顾了下vb6和vb.net的事件机制,总结在这里,供对比用。

事件是面对对象中对象间通信的方法。事件发生者(又叫事件源)发生一个事件时,通过发送一条消息,给事件接受者(事件处理者),事件接受者可以做出响应的处理。比如在某登录界面中,单击一个按钮,系统会验证用户的用户名和密码是否正确。用户单击按钮后,按钮(事件源)发出了单击事件,产生了自己被单击的消息给窗体,窗体(事件接受者)在自身代码窗口中进行响应的处理。

我们分别看下在vb和vb.net中是怎么实现事件机制的。

在vb6中,使用Event关键字定义事件,raiseEvent发出事件消息,在接受者的类中使用WithEvent表明自己是某个类的事件的接受者,我们看这样两段代码:

首先建立一个窗体,是一个登录窗体,输入用户名和密码后,点击登陆按钮可以登陆,代码(vb6)如下,使用了WithEvent来接收验证类(verifyClass)的消息:

Option Explicit

'本句代码表明该窗体能接受验证类的事件消息
Private WithEvents vfClass As VerifyClass Private Sub cmdLogin_Click()
'定义用户名和密码
Dim userName As String
Dim password As String
'定义返回结果
Dim Result As Boolean
Set vfClass = New VerifyClass userName = txtUserName.Text
password = txtPassword.Text '将用户名和密码传到验证类进行验证
Result = vfClass.Verify(userName, password) End Sub Private Sub Form_Load() End Sub '引发验证失败事件后,在此处可以进行相应处理
Private Sub vfClass_loginFail(ByVal userName As String)
MsgBox (userName + "登录失败")
End Sub
'验证成功事件
Private Sub vfClass_LoginSuccess(ByVal userName As String)
MsgBox (userName + "登录成功")
End Sub

接下来添加一个类模块,是登陆窗体中用到的验证类(verifyClass)的代码,里面定义(Event)了并引发(raiseEvent)了事件:

Option Explicit

'定义验证成功和失败的事件
Public Event LoginSuccess(ByVal userName As String)
Public Event loginFail(ByVal userName As String) '验证方法:对用户名和密码进行验证
Public Function Verify(ByVal userName As String, ByVal password As String) As Boolean
Dim blnResult As Boolean If userName = "123" And password = "123" Then
'如果正确,发出登陆成功的消息
RaiseEvent LoginSuccess(userName)
blnResult = True
Else
'错误则发出登陆失败的消息
RaiseEvent loginFail(userName)
blnResult = False
End If
Verify = blnResult End Function

在vb.net中事件的实现机制同vb基本相同,并且有了优化,通过Handles关键字,使事件实现的机制更灵活,handles可以使多个事件到同一个事件处理程序:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click, Button3.Click
System.Windows.Forms.MessageBox.Show("我被触发了")
End Sub

也可以通过AddHandler动态的绑定事件处理程序,即可以根据当时的条件选择将要绑定的事件处理程序,看下面这个例子。

首先定义一个person类,有走路这个事件,在走路方法中触发走路事件

Public Class Person

    Public Event walked(ByVal Distance As Integer)

    Public Sub walk(ByVal Distance As Integer)
RaiseEvent walked(Distance)
End Sub End Class

接下来新建一个窗体类,窗体上有一个文本框和一个按钮,代码如下

Public Class Form1
'本句代码表明该窗体能接受验证类的事件消息
Public WithEvents objPerson As Person Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
objPerson = New Person()
'满足条件下才执行绑定操作
If (TextBox1.Text = "1") Then
'满足条件,执行动态绑定,将事件绑定到某方法,该方法转变成事件处理程序
AddHandler objPerson.walked, AddressOf Person_walk
objPerson.walk(50)
Else
System.Windows.Forms.MessageBox.Show("您输入的文本不是1")
End If End Sub
'触发的事件将绑定到本事件处理程序
Public Sub Person_walk(ByVal Distance As Integer)
System.Windows.Forms.MessageBox.Show("a person walked" + Distance.ToString() + " kilometer!")
End Sub End Class

这就是vb和vb.net的事件处理机制,等学了java事件机制后将进行对比。

vb和vb.net事件机制的更多相关文章

  1. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  2. 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)

    前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜鸟,建议您好好读一读,真的理解下来会有不一样的收获 在下才疏学浅, ...

  3. tkinter事件机制

    一.tkinter.Event tkinter的事件机制跟js是一样的,也是只有一个Event类,这个类包罗万象,集成了键盘事件,鼠标事件,包含各种参数. 不像java swing那种强类型事件,sw ...

  4. [解惑]JavaScript事件机制

    群里童鞋问到关于事件传播的一个问题:“事件捕获的时候,阻止冒泡,事件到达目标之后,还会冒泡吗?”. 初学 JS 的童鞋经常会有诸多疑问,我在很多 QQ 群也混了好几年了,耳濡目染也也收获了不少,以后会 ...

  5. Atitit  数据库的事件机制--触发器与定时任务attilax总结

    Atitit  数据库的事件机制--触发器与定时任务attilax总结 1.1. 事件机制的图谱1 2. 触发器的类型2 3. 实现原理 After触发器 Vs Instead Of触发器2 3.1. ...

  6. 深入浅出iOS事件机制

    原文地址: http://zhoon.github.io/ios/2015/04/12/ios-event.html 本文章将讲解有关iOS事件的传递机制,如有错误或者不同的见解,欢迎留言指出. iO ...

  7. Java 事件机制

    java事件机制包括三个部分:事件.事件监听器.事件源. 1.事件.一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息,用于listener的相应的方法之中,作 ...

  8. Angular $scope和$rootScope事件机制之$emit、$broadcast和$on

    Angular按照发布/订阅模式设计了其事件系统,使用时需要“发布”事件,并在适当的位置“订阅”或“退订”事件,就像邮箱里面大量的订阅邮件一样,当我们不需要时就可以将其退订了.具体到开发中,对应着$s ...

  9. JavaScript 详说事件机制之冒泡、捕获、传播、委托

    DOM事件流(event  flow )存在三个阶段:事件捕获阶段.处于目标阶段.事件冒泡阶段. 事件捕获(event  capturing):通俗的理解就是,当鼠标点击或者触发dom事件时,浏览器会 ...

随机推荐

  1. VC++6.0中各种文件的作用

    VC++ 6.0是一款很经典的C/C++开发工具,虽然是1998年的东西了,但是现在使用依然很广!在用它开发的时候,会发现在建立的工程的文件夹里面,有很多文件,各种后缀名.在这里呢,我主要说一下各个文 ...

  2. GLSL中的各种变量总结

    1.uint CreateShader(enum type) : 创建空的shader object; type: VERTEX_SHADER, 2.void ShaderSource(uint sh ...

  3. 禁用Visual Studio 2013的Browser Link功能

    禁用Visual Studio 2013的Browser Link功能 GET http://localhost:37478/7fd25f8af33f443494e765be19be6240/brow ...

  4. mysqlcluster笔记

    1.config的datamemory和indexmemory规定的内存占有量会在ndb启动时直接占用掉,所以在计算内存时,这两个加起来要小于ndb的内存,这两个还只是数据和索引的内存,查询或者插入时 ...

  5. 转载纯真ip库

    http://blog.csdn.net/clin003/archive/2007/08/14/1743157.aspx 利用 QQWry.Dat 实现 IP 地址高效检索(PHP) 根据 LumaQ ...

  6. TC基础使用指南(基于xbeta的TC配置文件)

    所有常用目录都可以通过ctrl+d加一个或几个字母的超快捷方式直接跳转到位. 按下BackSpace键,就可以进入到上一级目录 Ctrl+q 在右侧打开左侧选定文件,再按一次Ctrl+q退出 按 Ct ...

  7. hdu 4465 Candy 2012 成都现场赛

    /** 对于大数的很好的应用,,缩小放大,,保持精度 **/ #include <iostream> #include <cmath> #include <algorit ...

  8. django-celery

    在settings.py里installed_apps里添加 djcelery 需安装django-celery 在settings末端添加 import djcelery djcelery.setu ...

  9. XML 反序列化为Model

    什么也不多说,直接贴代码 需要反序列的XML <?xml version='1.0' encoding='utf-8' ?> <GetCitiesListResponse> & ...

  10. 条码知识之九:EAN-128条码(上)

     EAN-128码,现称GS1-128码,是专用于GS1系统中的条码,可以标注商品的附加信息,在商品信息的标识.产品的跟踪与追溯中有广泛的用途. EAN-128码来自于CODE-128码,在字符集.条 ...