vb.net函數(shù)委托,VB net

vb.net中如何用事件和委托,會C#中的事件和委托,但不知VB.net中的語法,望給個簡單的例子熟悉語法。

一委托:此示例演示如何將方法與委托關聯(lián)然后通過委托調(diào)用該方法。

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設、做網(wǎng)站與策劃設計,合作網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十載,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:合作等地區(qū)。合作做網(wǎng)站價格咨詢:18980820575

創(chuàng)建委托和匹配過程

創(chuàng)建一個名為 MySubDelegate 的委托。

Delegate Sub MySubDelegate(ByVal x As Integer)

聲明一個類,該類包含與該委托具有相同簽名的方法。

Class class1

Sub Sub1(ByVal x As Integer)

MsgBox("The value of x is: " CStr(x))

End Sub

End Class

定義一個方法,該方法創(chuàng)建該委托的實例并通過調(diào)用內(nèi)置的 Invoke 方法調(diào)用與該委托關聯(lián)的方法。

Protected Sub DelegateTest()

Dim c1 As New class1

' Create an instance of the delegate.

Dim msd As MySubDelegate = AddressOf c1.Sub1

' Call the method.

msd.Invoke(10)

End Sub

二、事件

下面的示例程序闡釋如何在一個類中引發(fā)一個事件,然后在另一個類中處理該事件。AlarmClock 類定義公共事件 Alarm,并提供引發(fā)該事件的方法。AlarmEventArgs 類派生自 EventArgs,并定義 Alarm 事件特定的數(shù)據(jù)。WakeMeUp 類定義處理 Alarm 事件的 AlarmRang 方法。AlarmDriver 類一起使用類,將使用 WakeMeUp 的 AlarmRang 方法設置為處理 AlarmClock 的 Alarm 事件。

該示例程序使用事件和委托和引發(fā)事件中詳細說明的概念。

示例

' EventSample.vb.

'

Option Explicit

Option Strict

Imports System

Imports System.ComponentModel

Imports Microsoft.VisualBasic

Namespace EventSample

' Class that contains the data for

' the alarm event. Derives from System.EventArgs.

'

Public Class AlarmEventArgs

Inherits EventArgs

Private _snoozePressed As Boolean

Private nrings As Integer

'Constructor.

'

Public Sub New(snoozePressed As Boolean, nrings As Integer)

Me._snoozePressed = snoozePressed

Me.nrings = nrings

End Sub

' The NumRings property returns the number of rings

' that the alarm clock has sounded when the alarm event

' is generated.

'

Public ReadOnly Property NumRings() As Integer

Get

Return nrings

End Get

End Property

' The SnoozePressed property indicates whether the snooze

' button is pressed on the alarm when the alarm event is generated.

'

Public ReadOnly Property SnoozePressed() As Boolean

Get

Return _snoozePressed

End Get

End Property

' The AlarmText property that contains the wake-up message.

'

Public ReadOnly Property AlarmText() As String

Get

If _snoozePressed Then

Return "Wake Up!!! Snooze time is over."

Else

Return "Wake Up!"

End If

End Get

End Property

End Class

' Delegate declaration.

'

Public Delegate Sub AlarmEventHandler(sender As Object, _

e As AlarmEventArgs)

' The Alarm class that raises the alarm event.

'

Public Class AlarmClock

Private _snoozePressed As Boolean = False

Private nrings As Integer = 0

Private stopFlag As Boolean = False

' The Stop property indicates whether the

' alarm should be turned off.

'

Public Property [Stop]() As Boolean

Get

Return stopFlag

End Get

Set

stopFlag = value

End Set

End Property

' The SnoozePressed property indicates whether the snooze

' button is pressed on the alarm when the alarm event is generated.

'

Public Property SnoozePressed() As Boolean

Get

Return _snoozePressed

End Get

Set

_snoozePressed = value

End Set

End Property

' The event member that is of type AlarmEventHandler.

'

Public Event Alarm As AlarmEventHandler

' The protected OnAlarm method raises the event by invoking

' the delegates. The sender is always this, the current instance

' of the class.

'

Protected Overridable Sub OnAlarm(e As AlarmEventArgs)

RaiseEvent Alarm(Me, e)

End Sub

' This alarm clock does not have

' a user interface.

' To simulate the alarm mechanism it has a loop

' that raises the alarm event at every iteration

' with a time delay of 300 milliseconds,

' if snooze is not pressed. If snooze is pressed,

' the time delay is 1000 milliseconds.

'

Public Sub Start()

Do

nrings += 1

If stopFlag Then

Exit Do

Else

If _snoozePressed Then

System.Threading.Thread.Sleep(1000)

If (True) Then

Dim e As New AlarmEventArgs(_snoozePressed, nrings)

OnAlarm(e)

End If

Else

System.Threading.Thread.Sleep(300)

Dim e As New AlarmEventArgs(_snoozePressed, nrings)

OnAlarm(e)

End If

End If

Loop

End Sub

End Class

' The WakeMeUp class has a method AlarmRang that handles the

' alarm event.

'

Public Class WakeMeUp

Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)

Console.WriteLine((e.AlarmText + ControlChars.Cr))

If Not e.SnoozePressed Then

If e.NumRings Mod 10 = 0 Then

Console.WriteLine(" Let alarm ring? Enter Y")

Console.WriteLine(" Press Snooze? Enter N")

Console.WriteLine(" Stop Alarm? Enter Q")

Dim input As String = Console.ReadLine()

If input.Equals("Y") Or input.Equals("y") Then

Return

Else

If input.Equals("N") Or input.Equals("n") Then

CType(sender, AlarmClock).SnoozePressed = True

Return

Else

CType(sender, AlarmClock).Stop = True

Return

End If

End If

End If

Else

Console.WriteLine(" Let alarm ring? Enter Y")

Console.WriteLine(" Stop Alarm? Enter Q")

Dim input As String = Console.ReadLine()

If input.Equals("Y") Or input.Equals("y") Then

Return

Else

CType(sender, AlarmClock).Stop = True

Return

End If

End If

End Sub

End Class

' The driver class that hooks up the event handling method of

' WakeMeUp to the alarm event of an Alarm object using a delegate.

' In a forms-based application, the driver class is the

' form.

'

Public Class AlarmDriver

Public Shared Sub Main()

' Instantiates the event receiver.

Dim w As New WakeMeUp()

' Instantiates the event source.

Dim clock As New AlarmClock()

' Wires the AlarmRang method to the Alarm event.

AddHandler clock.Alarm, AddressOf w.AlarmRang

clock.Start()

End Sub

End Class

End Namespace

vb.net 中的異步委托機制,最好有相關的詳細資料講解,我是新手

所謂的委托(Delegate)實際上就是和C/C++里面的函數(shù)指針差不多,只是增強了類型檢查等其它健壯性方面的內(nèi)容。異步調(diào)用的回調(diào)函數(shù)有格式要求,所謂格式要求就是參數(shù)數(shù)量及類型順序的要求,具體是什么樣的你要看文檔了。一般.NET Framework里面都是AsyncCallBack。

所謂異步編程,就是說你要求做某樣事情,但是在完成這件事之前,我能接著做下一件事,而當這件事情完成之后,能夠有一種機制通知我完成了。相反,在完成之前一直等待,直到完成了才能進行下一步操作,叫做同步。一般來說,我們平常寫的程序都是“同步”,或者成為“順序執(zhí)行”更加貼切,而“異步”則可以說是“亂序執(zhí)行”的。

可以看到,同步的代碼非常好寫,因為我們可以預測執(zhí)行的順序和情況。而異步就不是很好寫了,因為無法得知完成的時候我正在做什么、做到什么程度。過去寫這些代碼是比較麻煩的,實現(xiàn)的辦法就是自己建立一個處理異步事物的線程,然后在這個線程和主線程之間建立聯(lián)系。而現(xiàn)在這個過程大部分已經(jīng)被系統(tǒng)封裝起來了,你只要調(diào)用BeginXXX,系統(tǒng)就會為你自動建立一個新的線程處理這個事情,當前線程不阻塞,可以馬上進行下一項操作,于是就實現(xiàn)了“異步”了。但是從前面我講道的你就應該知道,開始異步操作并沒有完事,還需要能夠得知操作完成,并能夠進行相應的處理。于是你在調(diào)用BeginXXX的時候就需要傳遞一個回調(diào)函數(shù),在.NET里是以委托的方式傳遞的?;卣{(diào)函數(shù)的意思就是“回過頭來調(diào)用你”,或者說A調(diào)用B并且傳遞函數(shù)C的地址,于是B在指定的情況下調(diào)用A指定的函數(shù)C?,F(xiàn)在就應該明白這個回調(diào)函數(shù)在BeginXXX中的作用就是,當你指定的事情做完之后將會調(diào)用這個回調(diào)函數(shù)。

在這個回調(diào)函數(shù)里面,我們就可以進行一些后續(xù)的工作,例如接著進行性質(zhì)相同的工作,或者相應的處理。在這里,我們也許向知道剛才那件事情執(zhí)行的情況和結(jié)果,這個時候我們就可以通過EndXXX來獲得這些東西。說到這里,結(jié)合上面說到的AsyncCallBack以及隨便哪個BeginXXX,我們可能會對下列兩個東西感到困惑:

IAsyncResult

stateObject

首先說IAsyncResult,這個是一個接口,你在回調(diào)函數(shù)中通過參數(shù)獲得的對象具體是什么類型的一般我們不需要關心,我們只需要依照這個接口的定義進行訪問就可以了。簡單點說,這個接口規(guī)定了順利完成異步操作所需信息的最小集合。一般來說,我們需要通過這個參數(shù)(ar)來識別異步操作。比如說,你在一瞬間發(fā)起一百個“從不同的網(wǎng)絡連接獲取數(shù)據(jù)”的異步請求,當某一個請求被完成的時候,如何判斷是那個請求被完成呢?就是依靠回調(diào)函數(shù)的參數(shù)ar。實際上你一般是不需要參與判斷的,你只要將這個ar傳遞給EndXXX就可以了,EndXXX會根據(jù)這個ar自行判斷的。需要注意的是,這個ar就是你調(diào)用BeginXXX的時候的返回值,可以說是一個存根,如果你需要在完成操作前終止他,也可以通過將這個存根傳遞給EndXXX,EndXXX就會根據(jù)情況終止操作。(IAsyncResult里面的IsCompleted提供了是否已經(jīng)完成的判斷,EndXXX就是根據(jù)這個值決定是否有必要終止。當然,你不需要關心他。)

接下來我們看看stateObject,這個東西被稱為狀態(tài)對象。于是大家就可能奇怪了:那個ar不也是狀態(tài)嗎?實際上stateObject是一個留給用戶使用的東西,BeginXXX/EndXXX根本就不使用。這個stateObject會被裝到ar的AsyncState里面,也就是說這個stateObject可以隨時通過訪問存根(BeginXXX的返回值)或者回調(diào)函數(shù)里的ar得到,你完全沒必要額外的保存到什么地方,更不需要費神的去考慮如何和你的某個異步操作對應起來。說了半天,這個東西有什么用呢?你想怎么用就怎么用唄,發(fā)揮一下你的想象力。比如說,你可以保存這是第幾次操作,或者在多個異步操作之間要同步的時候可以作為信號旗,再或者直接是操作這個異步操作的對象(x.BeginXXX的時候?qū)傳遞到stateObject參數(shù)上)。

第一種用法有點多余,第二種用法有點復雜,第三種我用得最多。因為你很可能在協(xié)一個服務端,而服務段必須能夠響應多個客戶端,這決定了必須用異步。同時,對于多個客戶端必然有多個對象,例如網(wǎng)絡連接的時候可能是Socket。而實際上處理的方法或者協(xié)議是和具體哪個客戶端沒有關聯(lián)的,因此我們只需要一套處理程序就夠了。這個時候第三種用法就很有用處,我們完全可以把代碼寫成這樣:

Sub DataReceived(ByVal ar As IAsyncResult)

ar.AsyncState.EndReceive(ar)

ar.AsyncState.BeginReceive(... , ar.AsyncState)

End Sub

這樣就不需要額外的數(shù)據(jù)結(jié)構去記錄有那些正在活動的對象了。

vb.net 如何取消事件的委托?

可以在選定全部子節(jié)點前,發(fā)送一個變量給全部子節(jié)點(有個tag屬性可以利用),告訴它們不應該執(zhí)行某事件(if語句)。

委托是可用于調(diào)用其他對象方法的對象。它們有時被稱為類型安全函數(shù)指針,因為它們與其他編程語言中所使用的函數(shù)指針相似。但不同于函數(shù)指針,Visual Basic .NET 委托是基于 System.Delegate 類的引用類型,它可以引用共享方法 —無需特定的類實例即可調(diào)用的方法和實例方法。

委托在調(diào)用過程和被調(diào)用過程需要媒介的情況下是很有用的。例如,您可能想讓一個引發(fā)事件的對象能夠在不同的環(huán)境下調(diào)用不同的事件處理程序。不幸的是,引發(fā)事件的對象無法提前知道處理特定事件的事件處理程序。Visual Basic .NET 通過在使用 AddHandler 語句時創(chuàng)建委托,可讓您動態(tài)地將事件處理程序與事件關聯(lián)。在運行時,委托將各種調(diào)用轉(zhuǎn)發(fā)到相應的事件處理程序。

盡管可以創(chuàng)建自己的委托,但在大多數(shù)情況下,Visual Basic .NET 為您創(chuàng)建委托并提供具體信息。例如,Event 語句將名為 EventNameEventHandler 的委托類隱式定義為 Event 語句所在類的嵌套類,且其簽字與該事件相同。AddressOf 語句則隱式創(chuàng)建委托的實例。例如,以下兩行代碼是等效的:

AddHandler Button1.Click, AddressOf Me.Button1_Click

' AddHandler 指向引發(fā)事件的對象,AddressOf則確定該事件對象所要調(diào)用的事件處理程序

'上述行為又可以稱為 監(jiān) 視

AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)。

急求:vb.net委托的資料...

我給你個簡單的例子吧,

public Delegate Sub GetUserInfo '首先定義一個委托,Delegate 為委托關鍵字

'''

'''

'''定義一個方法,該方法將會被交給委托去做

public sub GetData

dim strUserData as string="sdafsdhf"

msgbox(strUserData )

end sub

'''

'''

'''調(diào)用委托

public sub strData

dim aa as new GetUserInfo '實例化剛才定義的委托

aa=AddressOf GetData'通過AddressOf 讓委托去執(zhí)行GetData方法

end sub

簡單點說就是strData 不想去做GetData 這件事,所以它就將GetData 這件事交給委托GetUserInfo 去幫它做

VB.NET中的多線程和委托是什么關系? 能不能給我一個通俗易懂的范例,謝謝

委托,Delegate

就是讓你處于這個線程里時,委托另一個線程去執(zhí)行一些動作

我簡單舉一個寫richtextbox的例子:

////////////////////////////////////////////

'創(chuàng)建一個名為 MySubDelegate 的委托。

Delegate Sub MySubDelegate(ByVal txt As String)

'寫信息到富文本主窗口

Private Sub txtW(ByVal txt As String)

Dim msgd As New MySubDelegate(AddressOf Me.txtW1)

Dim arg(0) As Object

arg(0) = txt

Me.Invoke(msgd, arg)

End Sub

'委托指向

Private Sub txtW1(ByVal txt As String)

Me.RichTextBox1.AppendText(txt)

End Sub

/////////////////////

這樣,你在多線程應用時,在其他線程里用txtW(str)來寫richtextbox,就不會產(chǎn)生錯誤了。不然,直接垮線程寫richtextbox,可能會出現(xiàn)和UI線程的沖突。

vb.net 給委托的函數(shù)傳遞參數(shù)

兩個參數(shù):一個是數(shù)組名,一個是傳遞的長度

Function thename(ByVal imgFrom As Image) As String

thename = imgFrom.Name

End Function

Private Sub Image1_Click()

MsgBox thename(Image1)

End Sub

文章名稱:vb.net函數(shù)委托,VB net
鏈接分享:http://www.muchs.cn/article24/hchoce.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)手機網(wǎng)站建設、App設計網(wǎng)站策劃、網(wǎng)站設計、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營