metaClass 的強型別轉換 |
尚未結案
|
thomas0728
中階會員 發表:112 回覆:260 積分:89 註冊:2002-03-12 發送簡訊給我 |
各位大大好:
我有二個 四個 form, A 是 B,C 的父類別,D 是 A FORM 裡一個方法會叫用到的 FORM,這個方法是 FORM 上的一個 BUTTON 的事件,B,C 直接繼承並沒有 OVERRIDE,今天如果我執行 B FROM, 那叫用 D FROM 所傳入的 SELF, 當然是 B FROM ,如果是 執行 C FROM 則傳入的 SELF 是 C FROM 類別,今天我想透過 METACLASS 的功能來轉型,讓 D FROM 也能依實際情形叫用 B 或 C FROM 裡芋一個方法,至於會叫用到那一個方法則依實際的類別來決定,但我在轉型時會出現錯誤,不知那位高手能解決,以下是程式的大概情形
unit SingleBas; ....... procedure TBasSignle.sbSearchClick(Sender: TObject); begin fmDataSearch:=TfmDataSearch.Create(self);<----此 self 可能是 // TBasSignle 的子類別,如tdeptbill,temploybill try fmDataSearch.ShowModal(self); finally fmDataSearch.Free; fmDataSearch:=nil; end; end; .... emd. unit DataSearch; interface uses .........,SingleBas; type TBasSignleClass = Class of TBasSignle;<----宣告 METACLASS TfmDataSearch = class(TfmBaseDialog) ........ procedure FormCreate(Sender: TObject); public { Public declarations } ClassList:TComboBox; function ShowModal(opener:TComponent):integer;reintroduce;overload; .... end; .... implementation uses BillDept,billemploy; ..... .... function TfmDataSearch.ShowModal(opener:TComponent):integer; var Reference:TBasSignleClass; Instance:TBasSignle; begin //這行執行正確無誤,可傳回 TDELPBILL 類別 Reference:=TBasSignleClass(ClassList.Items.Objects[0]); SHOWMESSAGE(Reference.CLASSNAME); //<---測試傳回的實際類別名稱 Instance:=Reference(opener); <-----這行會出現錯誤 Missing // operrator or semicolon,請問我該如何轉型 Instance.cdsBillInfo.Data:=FCDSBillInfo.Data; result:=ShowModal; end; procedure TfmDataSearch.FormCreate(Sender: TObject); begin inherited; ClassList:=TComboBox.Create(self); classlist.Parent:=self; with ClassList.Items do begin AddObject('TDeptBill',TObject(TDeptBill)); AddObject('TEmployBill',TObject(TEmployBill)); end; ClassList.ItemIndex:=0; end; END.感激 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
thomas0728
中階會員 發表:112 回覆:260 積分:89 註冊:2002-03-12 發送簡訊給我 |
|
thomas0728
中階會員 發表:112 回覆:260 積分:89 註冊:2002-03-12 發送簡訊給我 |
嗯,我說簡單點好了,透過類別可建立物件,如tedit1:=tedit.create(self);
透過 metaclass 可傳回一個類別指標,我是想知道傳回的類別指標可否用來當轉型用,如
TYPE TEDITCLASS=CLASS OF TEDIT; ........ TEDITCLASS(FEDIT); ^^^^^^^^^^ Reference:=TEDITCLASS('TEDIT'); Reference(FEDIT);<----可不可以如 TEDITCLASS(FEDIT);這樣用如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
引言: 這只是簡單的舉例與運用,實際運用時,從 TBasSignle 繼承下來的 form 有近一百個,使用 call back 要一一下條件判斷,那程式會瘋掉,人不會.. 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 >>< face="Verdana, Arial, Helvetica"> < class="code"> TMyCallBack = procedure(s: string) of object; TClassA = class procedure ABC(s: string); end; TClassB = class procedure DEF(s: string); end; {...} var ClassA: TClassA; ClassB: TClassB; {...} SomeMethod(ClassA.ABC); SomeMethod(ClassB.DEF); {...} Hop you understand what I mean by call back |
thomas0728
中階會員 發表:112 回覆:260 積分:89 註冊:2002-03-12 發送簡訊給我 |
哦!我誤會你的意思了
但你也誤會我的意思了
基本上並不是二個類別的方法的問題
TClassA = class procedure ABC; procedure TClassA .ABC VAR CLASSD:TCLASSD; BEGIN CLASSD:=TCLASSD.CREATE(SELF); CLASSD.SHOWMODAL(SELF);<----這是關鍵 end; END. TClassB = class(TClassA) .... end; TClassC = class(TClassA) .... end; TClassD = class TCLASSD.SHOWMODAL(opener:TComponent); BEGIN opener----->不確定的 END BECAUSE.....MAY BE CLASEA:=TCLASEA.CREATE(SELF); CLASEA.SHOWMODAL(SELF););<---TCLASSA MAY BE CLASEB:=TCLASEA.CREATE(SELF); CLASEB.SHOWMODAL(SELF);<----TCLASSB 了解嗎如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |