Delphi的metaclass似乎可以typecast |
|
A022
一般會員 ![]() ![]() 發表:18 回覆:29 積分:9 註冊:2002-06-21 發送簡訊給我 |
找到網站From Delphi Package 學習筆記
使用Google 關鍵字delphi metaclass 搜尋link到http://sun.cis.scu.edu.tw/~nms9115/articles/delphi/Package/package.htm 裏面有關內容及程式碼,部份節錄:怕侵權, 請自行看該網站文章 VCL 類別註冊函式 (Classes.pas)RegisterClass 與 RegisterClasses procedure RegisterClass(AClass: TPersistentClass); procedure RegisterClasses(AClasses: array of TPersistentClass); 透過串流系統(stream system)註冊類別,已註冊過的類別不會重複註冊, 但如果是不同 package 有相同的類別名稱,則呼叫此函式會出現EFilerError 的錯誤訊息。 此函式通常放在程式的 initialization 區段。 GetClass 透過 RegisterClass 註冊的類別可以用此函式取得類別的 MetaClass,取得 MetaClass 之後就可以以此來建立該類別的物件。 參考下面的範例(以下展示的方式不只可以建立 Form 物件,稍作修改就可以建立其他物件): function CreateFormByClassName(ClassName: string): integer; var AClass: TPersistentClass; AForm: TCustomForm; begin Result := mrNone; { Note that TApplication "owns" this form and thus it must be freed prior to unloading the package } AClass := GetClass(ClassName); if AClass <> nil then begin AForm := TComponentClass(AClass).Create(Application) as TCustomForm; Result := AForm.ShowModal; end; end; 這幾行是重點 ... var AClass: TPersistentClass; AForm: TCustomForm; ... AClass := GetClass(ClassName); if AClass <> nil then begin AForm := TComponentClass(AClass).Create(Application) as TCustomForm; //TPersistentClass類別參考變數AClass竟能typecast成TComponentClass及使用as成TCustomForm Result := AForm.ShowModal; {Result變數& ClassName是因自訂function CreateFormByClassName(ClassName: string): integer; } end; 真是一篇特別的文章.. |
A022
一般會員 ![]() ![]() 發表:18 回覆:29 積分:9 註冊:2002-06-21 發送簡訊給我 |
|
pcplayer99
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |