我正在以编程方式创建UI组件。 我的一个组件是TButton(或后代),我希望按钮在单击时创建给定类型的对象。 我有几十种类型,当然我不想创建几十个TxxxButton类。
是否可以拥有一个通用的TButton后代,例如添加一个包含类的属性,并告诉它每次点击时,它应该添加这样一个类的一个对象?
JdbcTemplate
然后我想做
TCustomButton = class(TButton)
public
childObjectType: TClass;
procedure Click; override;
...
因此,当我点击任何这样的按钮时,它将创建一个TClass1类型的对象。
我应该看看泛型吗?
感谢您的任何见解。
答案 0 :(得分:3)
我不认为通用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属性,并为其指定一个方法,该方法构造该对象。