[英]Delphi - Creating a generic TButton that creates an object of any given class
我正在以編程方式創建UI組件。 我的組件之一是TButton(或后代),並且我希望按鈕在單擊時創建給定類型的對象。 我有很多類型,當然我也不想創建很多TxxxButton類。
是否可以有一個單一的通用TButton后代,例如添加一個保存類的屬性,並告訴它每當單擊該按鈕時,就應該添加一個此類的對象?
TCustomButton = class(TButton)
public
childObjectType: TClass;
procedure Click; override;
...
那我想做
TCustomButton.Create;
TCustomButton.childObjectType:=TClass1;
結果,當我單擊任何此類按鈕時,它將創建一個TClass1類型的對象。
我應該看看泛型嗎?
感謝您的見解。
我認為通用的VCL組件在這里不是正確的方法,但是您可以為按鈕指定類類型。 特別是如果您要創建的對象是TComponent后代(通常具有相同的構造函數),則可以像這樣創建它。
type
TYourButton = class(TButton)
...
public
property ComponentClass: TComponentClass read ComponentClass write FComponentClass;
end;
procedure TYourButton.Click;
var
c: TComponent;
begin
c := ComponentClass.Create(Self);
// Rigging up c, for instance setting text, tag, or check if it's
// a TControl and set parent and position if so.
end;
// And to assign a component class:
YourButton1.ComponentClass := TPanel;
對於更細粒度的控件,例如,如果它可以是任何類,因此可以是任何構造函數簽名,則可以將工廠方法或工廠對象傳遞給按鈕。 該工廠對象具有一個固定的接口,該按鈕可以調用該接口,並完成裝配該對象的所有工作。 這樣,創建對象的任何復雜性都可以在工廠中隱藏起來,並且按鈕不需要知道它。
工廠本身不需要成為可視組件,並且如果需要,可以使用泛型來簡化操作,盡管在這種情況下它似乎不是很有用。
在最簡單的形式之一中,您只需將過程或函數傳遞給按鈕即可調用以創建對象。 可以通過與OnClick之類的事件相同的方式來實現。 您可以在按鈕中聲明一個OnCreateObject屬性,並為其分配一個方法,該方法構造該對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.