Delphi - 创建一个通用的 TButton 来创建任何给定 class 的对象
Delphi - Creating a generic TButton that creates an object of any given class
我正在以编程方式创建 UI 组件。
我的组件之一是 TButton(或后代),我希望按钮在单击时创建给定类型的对象。
我有几十种类型,当然我不想创建几十个 TxxxButton classes.
是否可以有一个通用的 TButton 后代,例如添加一个包含 class 的 属性 并告诉它无论何时单击,它都应该添加一个这样的对象 class?
TCustomButton = class(TButton)
public
childObjectType: TClass;
procedure Click; override;
...
那我想做
TCustomButton.Create;
TCustomButton.childObjectType:=TClass1;
因此,当我单击任何此类按钮时,它将创建一个类型为 TClass1 的对象。
我应该看看仿制药吗?
感谢任何见解。
我认为通用 VCL 组件不是这里的正确方法,但您可以为按钮提供 class 类型。特别是如果您要创建的对象是 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;
对于更细粒度的控制,例如,如果它可以是任何 class,因此可以是任何构造函数签名,您可以将工厂方法或工厂对象传递给您的按钮。工厂对象有一个按钮可以调用的固定接口,并完成装配对象的所有工作。这样,创建对象的任何复杂性都可以隐藏在工厂中,并且按钮不需要知道它。
工厂本身不需要是一个可视组件,如果你愿意的话,为它使用泛型会更容易一些,尽管它在这种情况下似乎不是很有用。
在最简单的形式之一中,您可以只将过程或函数传递给按钮,按钮可以调用它来创建对象。这可以像 OnClick 这样的事件一样实现。可以在按钮中声明一个OnCreateObject属性,并为其赋值一个方法,构造对象
我正在以编程方式创建 UI 组件。 我的组件之一是 TButton(或后代),我希望按钮在单击时创建给定类型的对象。 我有几十种类型,当然我不想创建几十个 TxxxButton classes.
是否可以有一个通用的 TButton 后代,例如添加一个包含 class 的 属性 并告诉它无论何时单击,它都应该添加一个这样的对象 class?
TCustomButton = class(TButton)
public
childObjectType: TClass;
procedure Click; override;
...
那我想做
TCustomButton.Create;
TCustomButton.childObjectType:=TClass1;
因此,当我单击任何此类按钮时,它将创建一个类型为 TClass1 的对象。
我应该看看仿制药吗?
感谢任何见解。
我认为通用 VCL 组件不是这里的正确方法,但您可以为按钮提供 class 类型。特别是如果您要创建的对象是 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;
对于更细粒度的控制,例如,如果它可以是任何 class,因此可以是任何构造函数签名,您可以将工厂方法或工厂对象传递给您的按钮。工厂对象有一个按钮可以调用的固定接口,并完成装配对象的所有工作。这样,创建对象的任何复杂性都可以隐藏在工厂中,并且按钮不需要知道它。
工厂本身不需要是一个可视组件,如果你愿意的话,为它使用泛型会更容易一些,尽管它在这种情况下似乎不是很有用。
在最简单的形式之一中,您可以只将过程或函数传递给按钮,按钮可以调用它来创建对象。这可以像 OnClick 这样的事件一样实现。可以在按钮中声明一个OnCreateObject属性,并为其赋值一个方法,构造对象