日期:2014-05-18  浏览次数:20681 次

@@哪位朋友给讲讲委派和事件的使用啊,这个地方不理解!@@
哪位朋友给讲讲委派和事件的使用啊,这个地方不理解!最好写几句给举例说明一下啊。谢谢啦!

------解决方案--------------------
委托”机制的“委托”到底是什么意思呢,《高级汉语大词典》中是如下解释的:托付给别的人或机构办理。要说生活中的意思其实大家都能理解,无非是“当某人(机构)需要完成一件自己不能或不应该完成的事情的时候,此人(机构)物色一个合适的且有能力完成此事的人选,然后提供必要的信息,将此事委托给物色到的人(机构)来完成。”

  软件的对象方法其实是对现实世界的模拟,你可能会想现实世界里的委托哪有这么多呢?这么重要呢?其实你也许没有注意到老板把厚厚的一摞资料摔在你的案头让你无论如何在×月×日前交活,这不就是一种委托吗?当然也许没有委托书(和委任状),但它就是委托。这样看委托是不是就非常重要了,它甚至是构成现实社会的基础机制之一。

  从这个意义上理解委托机制的重要性我想应该是足够了。委托机制是促使事件发送与事件接受的一种对接策略,对象对周围信号的反应或在一定环境中所具备的对其它对象的通知行为的响应则被描述成所谓的“事件”,这可以类比人对周围世界反馈产生信号的能力。

  委托就是一种定向信号流:指定产生、接受信号者并产生信号反馈的技术。

  我可爱的小女儿才刚刚学会说话就在饭桌上支使她可怜的“老”爸:爸爸,把我的小勺子拿来。我接到“信号”立即屁颠屁颠地跑到厨房拿到勺子送到女儿的小手上,一个“委托”完成的非常漂亮,而女儿则无须知道我在什么地方、如何拿到勺子,她只管接受到我给她专门买的小勺子就行,否则,她就要仰着小脸“哇哇”大哭了。

  先说说事件委托的基础。

  为了说明问题我设计了一个窗体还有几个按钮的示例DelegateDemo1项目,以便可以直观感受委托的基本用法。

  至于委托在.net中的实现,编译器会自动生成一个完整的类定义:一个构造器,Invoke,BeginInvoke,以及EndInvoke。

  C#中隐式使用Invoke(其显式调用会报错)会让我们误解有一个以委托名称为名称的函数,其实没有,它只是隐式使用Invoke方法。而VB.net包括最新的VB.net2005均可以采取两种方法(显式或隐式)使用Invoke方法。我比较喜欢显式使用它,因为这样比较贴近事物的本质。

  回到示例,代码如下:

Public Class Form1Class Form1
Inherits System.Windows.Forms.Form
Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles Button1.Click,_
Button2.Click, Button4.Click
Select Case CType(sender, Button).Name
Case "Button1 "
MessageBox.Show( "你点击了Button1! ", "委托提示 ", MessageBoxButtons.OK)
Case "Button2 "
MessageBox.Show( "你点击了Button2! ", "委托提示 ", MessageBoxButtons.OK)
Case "Button3 "
MessageBox.Show( "你点击了Button3! ", "委托提示 ", MessageBoxButtons.OK)
Case "Button4 "
MessageBox.Show( "你点击了Button4! ", "委托提示 ", MessageBoxButtons.OK)
End Select
End Sub
Private Sub Button2_Click()Sub Button2_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles Button2.Click
MessageBox.Show( "Button2的Click事件,注意执行顺序! ", "委托提示 ", MessageBoxButtons.OK)
End Sub
Private Sub Button3_Click()Sub Button3_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles Button3.Click
Dim Demohandler1 As DemoHandler
Demohandler1 = AddressOf Button1_Click
Demohandler1.Invoke(sender, e)
Dim Demohandler2 As DemoHandler
Demohandler2 = AddressOf Button2_Click
Demohandler2(sender, e)
End Sub
Private Sub Button4_Click()Sub Button4_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles Button4.Click
End Sub
Private Sub Button5_Click()Sub Button5_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles Button5.Click
End Sub
Private Sub Form1_DoubleClick()Sub Form1_DoubleClick(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles MyBase.DoubleClick, Button5.Click
If TypeOf sender Is Button Then
If MessageBox.Show( "你确定退出吗? ", "退出提示 ",_
MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = DialogResult.Yes Then
Me.Close()
Else : Exit Sub
End If
Else : Me.Close()
End If
End Sub
End Class


  Button1按钮的click事件的代码只需看看Handles子句,不仅有Button1.Click还有Button2.Click, Button4.Click,MSDN上说:在过程声明结尾处使用Handles关键字将使其处理由使用 WithEvents 关键字声明的对象变量所引发的事件。也可以在派生类中使用Handles关键字处理基类的事件。其实Handles子句允许任何与事件的参数签名相符的过程来响应这个事件。这实际上就是委托。在编译时间,.NET Framework用你的事件名称创建一个委托类,只是在结尾添加“EventHandler”字样。换言之,事件是使用委托来实现的,委托是面向对象函数指针的一种形式,它允许通过对函数进行引用的方法来间接地调用该函数。

  双击set_Button1方法或其他set_...方法,你都可以看到有System.EventHandler类出现。.NET Framework 中的事件模型基于具有事件委托,System.EventHandler将事