異世界


2012年7月31日 星期二

委託(delegate)

委託(delegate), 已經在前文 UDP Server (二)SerialPort Class 擴充 (二) 中使用。

在此做一個簡明的說明,作為助憶。

JgeComport Class 該文為例

1. 宣告一個委託的格式(模板) : 委託(delegate)必須有一個簽章,以下簽章使用事件(event)專有格式(並非必要)

public delegate void jgecomEventHandler(object sender, jgecomEventArgs e);

 

2.  宣告一個委託方法的物件: 舊說法為,宣告一個方法的指標。若為事件則稱為 event

public event jgecomEventHandler Received;


3. 執行該委託,以下程式說明: 若該方法指標指向 null 則不執行。若為事件,該處為事件觸發程式

if (Received != null) //. 當事件變數不為 null 則執行之
{
omEventArgs e = new jgecomEventArgs(msg, commName);
Received(this, e);
}
4. 依據委託格式(模板),建立方法。若為事件,則稱為 event 處理器



private void onReceived(object sender, jgecomEventArgs e)
{
switch (e.NAME.ToString())
{
case "COM2":
Byte[] bytes = new Byte[1024];
bytes = JgeComport.StreamToBytes(e.MSG);

string ss = System.Text.Encoding.ASCII.GetString(bytes);
textBox1.AppendText(ss + Environment.NewLine);

textBox1.Text += String.Format("{0}{1}", BitConverter.ToString(bytes), Environment.NewLine); //Environment.NewLine => \r\n
label2.Text = bytes.Length.ToString();
break;
default:
break;
}
}

5. 將事件與事件處理器繫結

MyJgeComport.Received += this.onReceived;


6.執行委託的其他方法

   6.1 將方法與委託進行聯繫,實體化一個 onReceived 方法物件

jgecomEventHandler jHandler = new jgecomEventHandler( this.onReceived; );


   6.2 建立一個方法,該方法接受一個委託物件作為參數

public void DoEventHandler(jgecomEventHandler jeh, object sender, jgecomEventArgs e )
{
MessageBox.Show( e.ToString() );
}


  6.3 執行

DoEventHandler( this.onReceived, this , new jgecomEventArgs(msg, commName) );





一個最典型的委託 為 Invoke 方法 (Delegate, Object[]) 在擁有控制項基礎視窗控制代碼的執行緒上,以指定的引數清單執行指定的委派。
public Object Invoke (
Delegate method,
params Object[] args
)


method

方法的委派,採用和 args 參數中包含者相同的數字和型別的參數。



args

做為引數傳遞至指定方法的物件陣列。如果方法沒有引數,這個參數可能是 Null 參照 (即 Visual Basic 中的 Nothing)。



沒有留言:

張貼留言