none
想請教有關動態載入函式,或指定 Event 的方式 RRS feed

  • 問題

  • 想請問一個動態載入的問題。

    目前有一個需求,是讓使用者自行決定某些按鈕執行某些動作。比如畫面上有兩個 Button,Button1 執行後,畫面底色變黃,Button2 執行後,畫面底色變藍 (執行動作的內容與功能不在問題範圍內)

    因此我會先定義一個 Class 內含兩個 Method ,一個是讓畫面底色變藍、一個是變黃。

    為了達到動態指定的需求,我查了一下書籍跟 MSDN。裏面不失所望的查到了相關的指令。先寫了一個測試程式簡略如下。

    clsTest oTest = new clsTest();   //內含兩個 Method 的 Class
    Type t = typeof(clsTest);
    foreach (MethodInfo m in t.GetMethods())
    {
        Console.WriteLine("MethodInfo {0}", m.Name);
        if (m.Name == sHookKey)    //這裏是某種邏輯判斷,不是重點。
        {                              
                //這樣就執行到我要的 Method 了
                t.InvokeMember(sHookKey, 

               BindingFlags.InvokeMethod | BindingFlags.Default, null, oTest, null);
         }

     }

    因為測試程式的成功,很高興想把它納入正式程式裏面,但後來發現,

    假設 this.button1.Click += new EventHandler( xxxxx );

    這邊的 xxxx 它強列要求的是 Method 名稱,我不知道該如將它結合在一起。不知道有沒有人有類似的開發經驗,可提供參考一下。

    感謝各位

    P.S. 我是想過再用一個 Method 去解決它,由那個 Method 再去判斷,目前是那一個 Button 該做什麼事,但只是覺得這樣的寫法很醜。

    2006年6月21日 上午 08:32

解答

  •  

     C# 2.0 新增不具名的委託函式, 程式可以寫成這樣:

    this.button1.Click +=  new System.EventHandler(
        delegate (object sender, EventArgs ent) {
            this.GetType().GetMethod("button_click1").Invoke(this, new object[] { sender, ent});
        });

    2006年6月29日 上午 04:27

所有回覆

  • 先把所有的動作分別寫成 Method, 再動態的用 += 指定 Button 所對應的動作。

     

    2006年6月27日 下午 04:15
  • 感謝你的回覆,但我有點不太懂你的意思。

    一、先把所有的動作分別寫成 Method,

    二、再動態的用 += 指定 Button 所對應的動作。

    我目前的作法的確是將所有的動作,分別寫成 Method。

    但我困惑的是,我不知道要如何『動態』的用 += 指定 Button所對應的動作。

    不知道是否可提供簡單的 Sample 或 Keyword 讓我可以查詢。

    感謝

    2006年6月27日 下午 04:54
  • 關鍵字是 event, delegate 及 EventHandler, 範例可參考 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconeventsmini-sample.asp

    建議還是先找一本 C# 的書, 看完事件與委託的章節, 光看範例不見瞭解發生什麼事

    2006年6月27日 下午 05:10
  • 再次感謝你,不過,我想可能是我在表達問題的敘述上,有點問題。

    我原先的目的,是希望藉由外部檔案 (FuncMap.XML) 的設定,來動態指定功能。

    比如,我現在有一個 Class 叫 clsUserFunc,裏面可能是使用者比較常用到的功能,

    比如 SaveFile,CloseFile,Help.......等等。(我直接將其定為 Method 名稱,無參數)

    因此我會在 FuncMap.XML 定義如下, 

    <XML>

    <Func Key="F1" Func="Help" />

    <Func Key="F2" Func="SaveFile" />

    ..... </XML>

    在這邊,使用者可以根據自己的喜好,去變改 FuncMap.XML 的定義,我會再動態配置 HotKey 對應的功能。

    在第一部份,我成功的將類似 "Help" 文字敘述轉換成了執行功能 (請參照最早先的問題說明)

    但我所謂的困惑是說:  InvokeMember(....) 的用法是直接執行我轉換過來的功能,

    比如說,我從 "SaveFile" 去找 clsUserFunc 裏是否有 SaveFile 這樣的 Method ,有的話就執行。這個部份我是成功達到了。

    但對於我的目的,我想讓 HotKey 被觸發的時候,比如 F2 ,(這邊是一個 Hook 的 Class) 它會有類似像

    clsHotkey.Shortcut = Shortcut.F2;

    clsHotkey.Pressed += new System.EventHandler(xxxxxx);

    這邊的 xxxxxx 我不知道該如何填入,(它要求的是 Method 名稱,但 InvokeMember 是直接執行)

    因此我想問的是有沒有這樣的 Keyword 可以供我查詢。

    我目前暫時解決的方式是,再另外寫一個指定的 Method 叫 DoHotKeyWork()。

    將以上的動作變成

    clsHotkey.Shortcut = Shortcut.F2;

    clsHotkey.Pressed += new System.EventHandler(DoHotKeyWork);

    然後在

    private void DoHotKeyWork(object sender, System.EventArgs e)

    { .... }

    判斷使用者的按鍵是什麼,再去動態載入執行。

    雖然目前是可運行的,也解決了我的問題,但我還是會想知道,有沒有辦法可以讓它直接指定。也就是上述裏的 xxxxxx 要怎樣填入。

     

    2006年6月28日 上午 02:24
  •  

     C# 2.0 新增不具名的委託函式, 程式可以寫成這樣:

    this.button1.Click +=  new System.EventHandler(
        delegate (object sender, EventArgs ent) {
            this.GetType().GetMethod("button_click1").Invoke(this, new object[] { sender, ent});
        });

    2006年6月29日 上午 04:27