【问题标题】:How to add custom properties to dynamically (programmatically) created controls in FireMonkey?如何将自定义属性添加到 FireMonkey 中动态(以编程方式)创建的控件?
【发布时间】:2021-07-16 11:05:07
【问题描述】:

在我正在构建的应用程序中,我将控件动态添加到表单上的TFramedScrollbox 控件。

这是我正在使用的代码:

pnlNew: TFlowLayout;
pnlNew := TFlowLayout.Create(sbMain);
pnlNew.Align := TAlignLayout.Top;
pnlNew.ClipChildren := True;

pnlNew.Parent := sbMain;

这段代码按预期工作。

但我想向这个以编程方式创建的控件添加动态属性,如 OrgHeight、CreateOrder、PrevControl 等。

如何做到这一点?

TIA

【问题讨论】:

  • 如果您想向任何控件添加新属性,无论它是静态创建的(在设计时)还是动态创建的(在运行时),您都必须从包含这些控件的所需控件中创建派生类附加属性。对于设计时,需要在 Delphi 中注册新类,以便新属性在对象检查器中可见。但对于运行时,这不是必需的。

标签: delphi dynamic firemonkey


【解决方案1】:

您可以在表单定义上方声明一个“插入器类”,如下所示:

TFlowLayout = class(FMX.Layouts.TFlowLayout) // note fully qualified name of the class we inherit from
private
  OrgHeight: single;
  //... other properties you want to add
end;

TForm36 = class(TForm)
  sbMain: TFramedScrollBox;
  Button1: TButton;
  //...

严格来说,在这种情况下,当您在运行时动态创建实例时,您实际上并不需要在表单定义之前定义“interposer 类”。如果在设计时您的表单上已经有 TFlowLayout 的实例,则必须这样做。

从现在开始,您在表单上实例化的TFlowLayout 具有这些附加属性,您可以编写例如:

pnlNew := TFlowLayout.Create(sbMain);
pnlNew.Align := TAlignLayout.Top;
pnlNew.ClipChildren := True;
pnlNew.Parent := sbMain;
pnlNew.OrgHeight := pnlNew.Height;
pnlNew.Height := 150;

【讨论】:

  • 严格来说,您的代码示例在这里添加的只是字段而不是属性。但是是的,使用“interposer class”是一种方法。我个人避免使用它们,因为它们可能会导致一些问题,尤其是如果您从其他单元访问此类类,因为需要将包含“插入器类”的单元添加到使用列表的末尾。更不用说“插入器类”的附加功能对任何派生类都不可用。这可能会导致其他扩展您的类的程序员感到困惑,然后想知道为什么缺少某些功能。
  • 顺便说一句,Žarko Gajić 在interposer classes 上有一篇简洁的小文章
  • @SilverWarior,非常感谢您的这篇文章。我设法解决了我的问题!
  • @Tom Brunberg 你在建议如何将属性添加到控件中也是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多