不可能的任務 II : 動態查詢 Method 是否 TNotifyEvent等 |
尚未結案
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
承繼自 "不可能的任務? 能否動態列出所有 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 發送簡訊給我 |
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 發送簡訊給我 |
我在官方新閒組也是得到相類的答覆。 看來己到達 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。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |