線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1372
推到 Plurk!
推到 Facebook!

不可能的任務 II : 動態查詢 Method 是否 TNotifyEvent等

尚未結案
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-09 23:55:27 IP:218.16.xxx.xxx 未訂閱
承繼自 "不可能的任務? 能否動態列出所有 publish 了的 Method" http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30177    雖然讀出了所有 publish 了的 Method, 但若不知道是否附合某 Event (如 TNotifyEvent) 及不知道它的 Params 等等,還是沒甚麼用處。    因為讀清單出來就是為了讓使用者或程式來動態 Assign 給附合的形態的 Event (像我們在 Object Inspector 選一樣) 或是直接執行它。但若我們不知道 Method 的形態,甚可準確地 Assign 給 Event 呢。    RTTI 有關 Method Param 及 Return Value 的資料是靜態的資料例如對使用 TNotifyEvent 事件的 Event, 回傳的永遠是 TNotifyEvent 的資料而不是查詢那 Event 的資料。舉例說,我用RTTI查詢 Button1.onClick 的資料,即使我將 Sender : TObject 改成了 Father : TObject, 查詢回來的永遠是 Sender : TObject。    還有,在RUNTIME 用 SetMethodProp 來設定 Method RTTI 亦不會檢查 Method 是否適合而照設不誤,到執行該Event 時當然死得很難看了。    看來,雖然能動態的取到 所有 Published Method 的 Name 及 pointer 但找不到 Parma / Return Value 等資料,還是鏡中之月,能看不能用< > 希望和大大能幫忙解開這個迷< >
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-11 09:43:58 IP:210.3.xxx.xxx 未訂閱
Justmade 兄,這二天小弟也做了一些研究,結論是不可能列出 published method 的參數 因為 class="code">type TTest = class published procedure Test1(const s: string); end; procedure TTest.Test1(const s: string); begin MessageDlg(s, mtWarning, [mbOK], 0); end; type PTest = procedure(const s: string) of object; procedure ExecPro(pCode: pointer); var P: PTest; begin TMethod(P).Code := pCode; TMethod(P).Data := self; P('1111'); end;
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-12 09:17:28 IP:218.16.xxx.xxx 未訂閱
我在官方新閒組也是得到相類的答覆。 看來己到達 RunTime 能動態設定東西的極限。 雖然我仍覺得 Method.Code 既是Method的執行碼應或多或少有些 Param/Return Value 的資料,但可能格式不一所以不能抓出。 我想到是否能做一個元件在 Design Time 使用 IDesigner.GetMethods 來自動取得並記下使用者指定檢查的 Event 類形呢 (如 TNotifyEvent)。不過,好像要使用 Property Editor / Component Editor 才會有 Designer,這樣每次程式員改變了 Method 就會需要使用者去該元件啟動 Editor 才能自動更新,很是麻煩,不知道有否在 DesignTime 直接使用 GetMethods 來取得 NotifyEvent 的方法? 我想做的方法是 : property EventLog : TMyEventLog read FEventLog write SetEventLog stored CheckEventLog; 然後在 CheckEventLog 最後一次檢查並記下要檢查的 Events Type, 不過不知可甚麼使用 GetMethod。
系統時間:2024-05-17 7:43:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!