全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:965
推到 Plurk!
推到 Facebook!

metaClass 的強型別轉換

尚未結案
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-27 15:50:51 IP:211.75.xxx.xxx 未訂閱
各位大大好:    我有二個 四個 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-27 16:29:04 IP:147.8.xxx.xxx 未訂閱
Perhaps make use of call back is easier 
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-27 16:37:38 IP:211.75.xxx.xxx 未訂閱
這只是簡單的舉例與運用,實際運用時,從 TBasSignle 繼承下來的 form 有近一百個,使用  call back 要一一下條件判斷,那程式會瘋掉,人不會.. 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福
------
Thomas Chiou
thomas0728
中階會員


發表:112
回覆:260
積分:89
註冊:2002-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-27 17:18:39 IP:211.75.xxx.xxx 未訂閱
嗯,我說簡單點好了,透過類別可建立物件,如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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-27 17:56:27 IP:147.8.xxx.xxx 未訂閱
引言: 這只是簡單的舉例與運用,實際運用時,從 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-27 18:27:29 IP:211.75.xxx.xxx 未訂閱
哦!我誤會你的意思了 但你也誤會我的意思了 基本上並不是二個類別的方法的問題
    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
系統時間:2024-05-18 16:13:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!