VB.NET下的事件和委托

本文依然给大家介绍事件和委托,只不过这次介绍的是VB.NET中的事件和委托。希望对大家有帮助,一起来看。

AD:


委托是可用于调用其他对象方法的对象。它们有时被称为类型安全函数指针,因为它们与其他编程语言中所使用的函数指针相似。但不同于函数指针,VB.NET 委托是基于 System.Delegate 类的引用类型,它可以引用共享方法—无需特定的类实例即可调用的方法和实例方法。

委托在调用过程和被调用过程需要媒介的情况下是很有用的。例如,您可能想让一个引发事件的对象能够在不同的环境下调用不同的事件处理程序。不幸的是,引发事件的对象无法提前知道处理特定事件的事件处理程序。Visual Basic .NET 通过在使用 AddHandler 语句时创建委托,可让您动态地将事件处理程序与事件关联。在运行时,委托将各种调用转发到相应的事件处理程序。

尽管可以创建自己的委托,但在大多数情况下,Visual Basic .NET 为您创建委托并提供具体信息。例如,Event 语句将名为 <EventName>EventHandler 的委托类隐式定义为 Event 语句所在类的嵌套类,且其签字与该事件相同。AddressOf 语句则隐式创建委托的实例。例如,以下两行代码是等效的:

   
   
  1. AddHandlerButton1.Click
  2. AddressOfMe.Button1_Click
  3. 'AddHandler指向引发事件的对象,AddressOf则确定该事件对象所要调用的事件处理程序
  4. '上述行为又可以称为监视
  5. AddHandlerButton1.Click,NewEventHandler(AddressOfButton1_Click)

只要编译器可以用上下文确定委托的类型,就可以使用速写方法创建委托。

注:处理自基类继承的事件

派生类(继承某个基类特征的类)能用 Handles MyBase 语句处理它们的基类所引发的事件。

处理来自基类的事件

通过给事件处理程序过程的声明行添加 Handles MyBase.<event name> 语句来声明派生类中的事件处理程序,其中的 event name 是基类中正在处理的事件的名称。例如:

   
   
  1. PublicClassClass1
  2. PublicEventSE(ByValiAsInteger)
  3. 'Placemethodsandpropertieshere.
  4. EndClass
  5. PublicClassClass2
  6. InheritsClass1
  7. SubEventHandler(ByValxAsInteger)HandlesMyBase.SE
  8. 'PlacecodetohandleeventsfromClass1here.
  9. EndSub
  10. EndClass

声明使用现有委托类型的事件

某些情况下,可能会要声明某事件使用现有委托类型为基础委托。以下语法说明了进行声明的方式:

Event AnEvent As DelegateType该语法在将多个事件路由到同一处理程序时是很有用的,不过使用现有委托类型时需要先进行如下定义:

   
   
  1. delegate{sub|function}DelegateType(参数1,参数2)

下面是vb.net控制台程序演示单一事件委托多处理程序.

比如说在社会上,你是法律,社会上有三种人,警察、无赖和自愿反扒队。

你规定:如果小偷偷东西,则警察处罚小偷500元钱,自愿反扒队要打无赖进医院一次

这就是现实中的委托。

实际上,在写程序中,程序员就是法律,警察、小偷和自愿反扒队就是三个对象。小偷偷东西是一个方法,小偷还有一个偷东西事件,他偷东西激发这个事件。而警察和自愿反扒队就是两个事件处理对象,警察负责把小偷的钱扣除500,自愿反扒队需要大小偷进医院一次。

所以,委托有如下几个要素:

  • 激发事件的对象--就是小偷
  • 处理对象事件的对象--就是警察和自愿反扒队
  • 定义委托,就是法律让警察和自愿反扒队监视小偷。

如果这三个要素都满足的话,则你就写出了一个完整事件的处理。

下面是vb.net控制台的实例

   
   
  1. ImportsSystem
  2. ModuleModule1
  3. '准备引用无赖类的偷东西事件
  4. PublicWithEventswAs无赖
  5. SubMain()
  6. Console.WriteLine("新的一天开始了....")
  7. '实例华警察、无赖、自愿反扒队类
  8. DimpAsNew警察
  9. w=New无赖
  10. DimppAsNew自愿反扒队
  11. '设置对无赖类的偷东西事件的监视,并设置相应的事件处理程序
  12. '如果小偷玩偷东西则引用警察的罚钱处理程序
  13. AddHandlerw.PlayGame,AddressOfp.扣钱
  14. '如果小偷偷东西则引用自愿反扒队的打人处理程序
  15. AddHandlerw.PlayGame,AddressOfpp.打人
  16. w.偷东西()
  17. Console.WriteLine("天黑了....")
  18. Console.ReadLine()
  19. EndSub
  20. 'EndClass
  21. PublicClass警察
  22. SubNew()
  23. Console.WriteLine("生成警察......")
  24. EndSub
  25. '定义的事件处理程序的参数类型要与定义的委托的参数类型相一致
  26. PublicSub扣钱(ByValsenderAsObject,ByValeAsSystem.EventArgs)
  27. Console.WriteLine("警察:好小子,胆敢偷东西...")
  28. '定义线程输出迟缓3秒
  29. System.Threading.Thread.Sleep(3000)
  30. Console.WriteLine("警察:看看你小子有多少钱...")
  31. DimfAs无赖=sender
  32. System.Threading.Thread.Sleep(3000)
  33. Console.WriteLine("无赖的钱:"+f.钱.ToString())
  34. System.Threading.Thread.Sleep(3000)
  35. Console.WriteLine("开始扣钱......")
  36. System.Threading.Thread.Sleep(3000)
  37. f.钱=f.钱-500
  38. Console.WriteLine("扣完了....现在无赖还剩下:"+f.钱.ToString())
  39. System.Threading.Thread.Sleep(3000)
  40. EndSub
  41. EndClass
  42. PublicClass无赖
  43. '先定义一个偷东西的事件使用现有委托类型PlayGameHandler为基础委托
  44. PublicEventPlayGameAsPlayGameHandler
  45. Privatem_MoneyAsInteger
  46. PrivateeyAsInteger
  47. SubNew()
  48. Console.WriteLine("生成无赖....")
  49. m_Money=1000
  50. ey=5
  51. EndSub
  52. '定义挨打属性用来记录挨打过几次
  53. Property挨打()AsInteger
  54. Get
  55. Returney
  56. EndGet
  57. Set(ByValValueAsInteger)
  58. ey=Value
  59. EndSet
  60. EndProperty
  61. '定义前属性用来记录有多少钱
  62. Property钱()AsInteger
  63. Get
  64. Returnm_Money
  65. EndGet
  66. Set(ByValValueAsInteger)
  67. m_Money=Value
  68. EndSet
  69. EndProperty
  70. '定义偷东西过程
  71. PublicSub偷东西()
  72. Console.WriteLine("无赖开始偷东西了")
  73. System.Threading.Thread.Sleep(3000)
  74. '实例化事件参数
  75. DimeAsNewSystem.EventArgs
  76. '引发偷东西事件,参数类型要与现有委托类型一致
  77. RaiseEventPlayGame(Me,e)
  78. EndSub
  79. EndClass
  80. PublicClass自愿反扒队
  81. SubNew()
  82. Console.WriteLine("自愿反扒队来了.....")
  83. System.Threading.Thread.Sleep(3000)
  84. EndSub
  85. '定义的事件处理程序的参数类型要与定义的委托的参数类型相一致
  86. PublicSub打人(ByValsenderAsObject,ByValeAsSystem.EventArgs)
  87. System.Threading.Thread.Sleep(3000)
  88. Console.WriteLine("自愿反扒队:好小子,敢偷东西...")
  89. System.Threading.Thread.Sleep(3000)
  90. Console.WriteLine("自愿反扒队:你小子挨过几次打了...")
  91. DimbnAs无赖=sender
  92. System.Threading.Thread.Sleep(3000)
  93. Console.WriteLine("无赖:"+bn.挨打.ToString+"次")
  94. System.Threading.Thread.Sleep(3000)
  95. Console.WriteLine("自愿反扒队:那也得揍你,先来一拳....")
  96. System.Threading.Thread.Sleep(3000)
  97. Console.WriteLine("自愿反扒队:再来一脚......")
  98. System.Threading.Thread.Sleep(3000)
  99. Console.WriteLine("自愿反扒队:打完了...赶紧去医院吧...")
  100. EndSub
  101. EndClass
  102. '定义委托类型
  103. DelegateSubPlayGameHandler(ByValsenderAsObject,ByValeAsSystem.EventArgs)
  104. EndModule

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")