簡體   English   中英

Delphi-創建一個通用的TButton來創建任何給定類的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM