Delphi - 创建一个通用的 TButton,用于创建任何给定类的对象



我正在以编程方式创建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 属性,并为其分配一个构造对象的方法。

最新更新