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