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

时间:2018-05-14 21:39:37

标签: delphi delphi-10.2-tokyo

我正在以编程方式创建UI组件。 我的一个组件是TButton(或后代),我希望按钮在单击时创建给定类型的对象。 我有几十种类型,当然我不想创建几十个TxxxButton类。

是否可以拥有一个通用的TButton后代,例如添加一个包含类的属性,并告诉它每次点击时,它应该添加这样一个类的一个对象?

JdbcTemplate

然后我想做

TCustomButton = class(TButton)
  public
    childObjectType: TClass;
    procedure Click; override;
...

因此,当我点击任何这样的按钮时,它将创建一个TClass1类型的对象。

我应该看看泛型吗?

感谢您的任何见解。

1 个答案:

答案 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属性,并为其指定一个方法,该方法构造该对象。