metaClass 的問題 |
尚未結案
|
thomas0728
中階會員 發表:112 回覆:260 積分:89 註冊:2002-03-12 發送簡訊給我 |
各位大大:
我有一段程式是這樣的 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 發送簡訊給我 |
程式碼參考如下, 若把 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
------
-- 小卜子 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |