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

metaClass 的問題

尚未結案
thomas0728
中階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-20 06:14:11 IP:61.70.xxx.xxx 未訂閱
各位大大: 我有一段程式是這樣的 if Sender is TDBEdit then begin TDBEdit(Sender).Value:='abbb' ...... end; if Sender is DBLookupComboBox then begin TDBEdit(Sender).Value:='abbb' ...... end; if Sender is ..... 一大段程式基本上都一樣,只是類別轉型不一樣,請問我有可能透過 MetaClass 的觀念讓上一段程式更簡潔嗎?也就是如下的程式 if Sender is TDBCustEditClass then begin TDBCustEditClass(Sender).Value:='abbb' ...... end; 這個 TDBCustEditClass 會依實際型別來做轉換 謝謝 如果愛情也有味覺 那麼 有沒有ㄧ種愛 微微泛酸 不太苦澀 有點甜密 嚐起來的滋味讓人想起幸福 Thomas Chiou
------
Thomas Chiou
Diviner
初階會員


發表:36
回覆:112
積分:34
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-10 16:33:02 IP:218.103.xxx.xxx 未訂閱
程式碼參考如下, 若把 Distributor 改為 Object 更佳。
type
  TForm1 = class(TForm)
    btnCreateLabel: TButton;
    btnCreateEditBox: TButton;
    btnClear: TButton;
    btnCreateMemo: TButton;
    procedure btnCreateLabelClick(Sender: TObject);
    procedure btnCreateEditBoxClick(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure btnCreateMemoClick(Sender: TObject);
  private
    MyControl: TControl;
    function  CreateControlFactory(const AOwner: TComponent;
        const BusinessCase: String): TControl;
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    { TForm1 }    function TForm1.CreateControlFactory(const AOwner: TComponent;
  const BusinessCase: String): TControl;
type
  TControlClass = class of TControl;      TControlDistributeItem = record
    BusinessCase: String;
    ControlClass: TControlClass;
  end;      TControlDistributor = array of TControlDistributeItem;    var
  ControlDistributor: TControlDistributor;      procedure DefineControlDistributor;
  begin
    SetLength(ControlDistributor, 3);
    ControlDistributor[0].BusinessCase := 'Case 1';
    ControlDistributor[0].ControlClass := TLabel;
    ControlDistributor[1].BusinessCase := 'Case 2';
    ControlDistributor[1].ControlClass := TEdit;
    ControlDistributor[2].BusinessCase := 'Case 3';
    ControlDistributor[2].ControlClass := TMemo;
  end;      function DistributeControl(const BusinessCase: String): TControlClass;
  var
    i: Integer;
  begin
    result := nil;
    for i := 0 to Length(ControlDistributor) - 1 do
    begin
      if ControlDistributor[i].BusinessCase = BusinessCase then
      begin
        result := ControlDistributor[i].ControlClass;
        break;
      end;
    end;
    Assert(Assigned(result), 'Business out of range');
  end;    var
  ControlClass: TControlClass;
begin
  DefineControlDistributor;
  ControlClass := DistributeControl(BusinessCase);      result := TControlClass(ControlClass).Create(AOwner);
  result.Left := 0;
  result.Top  := 0;
end;    procedure TForm1.btnCreateLabelClick(Sender: TObject);
begin
  MyControl := CreateControlFactory(self, 'Case 1');
  MyControl.Parent := self;
  TLabel(MyControl).Caption := 'Hello';
end;    procedure TForm1.btnCreateEditBoxClick(Sender: TObject);
begin
  MyControl := CreateControlFactory(self, 'Case 2');
  MyControl.Parent := self;
  TEdit(MyControl).Text := 'Hello';
end;    procedure TForm1.btnCreateMemoClick(Sender: TObject);
begin
  MyControl := CreateControlFactory(self, 'Case 3');
  MyControl.Parent := self;
  TMemo(MyControl).Lines.Add('Hello');
end;    procedure TForm1.btnClearClick(Sender: TObject);
begin
  FreeAndNil(MyControl);
end;
-- 小卜子 發表人 - diviner 於 2004/09/10 16:37:26
------
--
小卜子
系統時間:2024-05-18 13:49:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!