SiteMap

2013年7月19日金曜日

c# - Delegate的基本用法

簡單講解一下 Delegate的用法

new 個物件名字叫做 wtf, 然後寫個方法叫做 methodByMe
 把這個方法給 wtf 掛上去
wtf.wtf_delegate += methodByMe
ok, 這樣就寫完了, 只要 wtf裡面有地方使用到 wtf_delegate,
就會去使用我寫的 methodByMe

那 wtf_delegate是怎麼來的, 答案是 wtf這個類別裡面定義好的
它裡面大概是這樣寫
.....  (程式碼開頭)
.....  (中間省略)
     public sthDelegateAnnounce wtf_delegate;
.....  (中間省略)
    (在 wtf的某個地方,比如說按鈕按下去)
     wtf_delegate();
.....
而且在這裡
wtf_delegate沒有定義實作方法, 那麼實作由誰去做呢??
............
厄, 剛剛不是寫了嗎 寫個方法叫做 methodByMe掛上去
那麼 sthDelegateAnnounce 是哪裡來的,
顆顆, 你可以宣告在專案任一個 class裡面
是這樣寫
public delegate sthDelegateAnnounce ( 有想要傳參數寫參數 )

Example:
假設我們現在有兩個 Form, 分別叫做 Form1跟 Form2
程式運作的時候會先開啟 Form1, 然後Form1上面有個按鈕,
按下去之後會啟動 Form2, 接著 點選Form2上面的某些選項
Form1就會接收到Form2上面

架構:
類別A(專門用來宣告Delegate)
      就像是註冊一樣, 跟某個找的到這個資訊的人說這裡有ooxx的東西
類別myPic (一個Form 讓你選擇圖片)
類別Form1 (普通的WinForm, 目標是接收 myPic 丟回來的資訊show出圖片來)
  
實際做法:
    A裡面宣告個delegate
    public delegate void transPic(Image ii);

    Form1 裡面 new 個 myPic 叫做 mp
   
    在 Form1裡面 寫個 Method, 例:
    public void getPic(image ii){
       imgGet = ii;
    }
    //imgGet 可以事先宣告在 Form1裡面, 也可以在 getPic裡面宣告
    // 不過宣告在getPic裡面這物件不就只能活在getPic裡面, 一旦getPic這方法結束了
    //imgGet不就死了
   
    然後 把 getPic這個方法指定給 mp
    mp.selectPic += getPic
   
    然後
    myPic類別裡面這樣寫
    //宣告在A類別裡面定義好的 delegate
    public transPic selectPic;
   
    //在 myPic裡面會做的某個動作, 如說按下Button
    Image img1 = ooxxxoo;
    public void button1_Click(object sender, EventArgs e)
    {
         selectPic(img1);
         //從這裡看來 img1自然就是可以從 myPic裡面拿到(或看見)的 圖片資源了
    }
完成的原始碼
https://drive.google.com/#folders/0B0VyUtjJfcy9SVpZUjR2a1BSUVk

0 件のコメント: