从字符串在运行时创建Delphi Firemonkey组件

纳西斯·佩特鲁(Narcis Petru)

我如何在运行时最终使用RTTI将可视组件作为表单的子级创建?我所得到的只是一个TValue实例...

 t := (ctx.FindType(Edit1.Text) as TRttiInstanceType);
 inst:= t.GetMethod('Create').Invoke(t.MetaclassType,[Form1]);

谢谢!

雷米·勒博(Remy Lebeau)

纯粹的RTTI方法使用TRttiMethod.Invoke()如下所示:

var
  ctx: TRttiContext;
  t: TRttiInstanceType;
  m: TRttiMethod;
  params: TArray<TRttiParameter>;
  v: TValue;
  inst: TControl;
begin
  t := ctx.FindType(Edit1.Text) as TRttiInstanceType;
  if t = nil then Exit;
  if not t.MetaclassType.InheritsFrom(TControl) then Exit;
  for m in t.GetMethods('Create') do
  begin
    if not m.IsConstructor then Continue;
    params := m.GetParameters;
    if Length(params) <> 1 then Continue;
    if params[0].ParamType.Handle <> TypeInfo(TComponent) then Continue;
    v := m.Invoke(t.MetaclassType, [TComponent(Form1)]);
    inst := v.AsType<TControl>();
    // or: inst := TControl(v.AsObject);
    Break;
  end;
  inst.Parent := ...;
  ...
end;

一个不使用的简单得多的方法TRttiMethod.Invoke()如下所示:

type
  // TControlClass is defined in VCL, but not in FMX
  TControlClass = class of TControl;

var
  ctx: TRttiContext;
  t: TRttiInstanceType;
  inst: TControl;
begin
  t := ctx.FindType(Edit1.Text) as TRttiInstanceType;
  if t = nil then Exit;
  if not t.MetaclassType.InheritsFrom(TControl) then Exit;
  inst := TControlClass(t.MetaclassType).Create(Form4);
  inst.Parent := ...;
  //...
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Firemonkey组件在运行时移动

来自分类Dev

Firemonkey组件样式无法在运行时创建

来自分类Dev

Delphi Firemonkey 在运行时创建 TExpanders 和 TLabels

来自分类Dev

Delphi / Firemonkey在运行时更改iOS屏幕旋转

来自分类Dev

选择在运行时创建的组件

来自分类Dev

在运行时创建的组件中传播 viewModel

来自分类Dev

XamlParseException在运行时。从x:Static切换到相对组件字符串以引用图像可修复该问题。为什么?

来自分类Dev

XamlParseException在运行时。从x:Static切换到相对组件字符串以引用图像可修复该问题。为什么?

来自分类Dev

Delphi 10.1 Firemonkey-组件构造期间的属性值

来自分类Dev

Delphi XE2在运行时不考虑组件属性

来自分类Dev

Delphi Firemonkey-运行时加载样式

来自分类Dev

如何在运行时创建的面板中创建组件?

来自分类Dev

如何在运行时在Firemonkey中创建和销毁TGrid-Android和iOS App Dev

来自分类Dev

如何释放在运行时组件中创建的c ++ WinRT类的内存

来自分类Dev

在Firemonkey中的运行时创建并销毁TLabel

来自分类Dev

我可以在运行时通过评估字符串来创建函数吗?

来自分类Dev

我可以在运行时通过评估字符串来创建函数吗?

来自分类Dev

在运行时使用连接字符串

来自分类Dev

PyQt:在运行时转换模块字符串

来自分类Dev

尝试在运行时编辑字符串

来自分类Dev

Dapper 在运行时更改连接字符串

来自分类Dev

在运行时更改组件的ID名称

来自分类Dev

是否可以在运行时更改组件样式?

来自分类Dev

在运行时更改组件的ID名称

来自分类Dev

如何在运行时分配组件名称?

来自分类Dev

在运行时更改文本组件值

来自分类Dev

如何在运行时更改 QML 组件的样式?

来自分类Dev

FireMonkey TListView:如何在运行时为项目着色?

来自分类Dev

Firemonkey:在运行时将子控件添加到TListViewItem

Related 相关文章

  1. 1

    Firemonkey组件在运行时移动

  2. 2

    Firemonkey组件样式无法在运行时创建

  3. 3

    Delphi Firemonkey 在运行时创建 TExpanders 和 TLabels

  4. 4

    Delphi / Firemonkey在运行时更改iOS屏幕旋转

  5. 5

    选择在运行时创建的组件

  6. 6

    在运行时创建的组件中传播 viewModel

  7. 7

    XamlParseException在运行时。从x:Static切换到相对组件字符串以引用图像可修复该问题。为什么?

  8. 8

    XamlParseException在运行时。从x:Static切换到相对组件字符串以引用图像可修复该问题。为什么?

  9. 9

    Delphi 10.1 Firemonkey-组件构造期间的属性值

  10. 10

    Delphi XE2在运行时不考虑组件属性

  11. 11

    Delphi Firemonkey-运行时加载样式

  12. 12

    如何在运行时创建的面板中创建组件?

  13. 13

    如何在运行时在Firemonkey中创建和销毁TGrid-Android和iOS App Dev

  14. 14

    如何释放在运行时组件中创建的c ++ WinRT类的内存

  15. 15

    在Firemonkey中的运行时创建并销毁TLabel

  16. 16

    我可以在运行时通过评估字符串来创建函数吗?

  17. 17

    我可以在运行时通过评估字符串来创建函数吗?

  18. 18

    在运行时使用连接字符串

  19. 19

    PyQt:在运行时转换模块字符串

  20. 20

    尝试在运行时编辑字符串

  21. 21

    Dapper 在运行时更改连接字符串

  22. 22

    在运行时更改组件的ID名称

  23. 23

    是否可以在运行时更改组件样式?

  24. 24

    在运行时更改组件的ID名称

  25. 25

    如何在运行时分配组件名称?

  26. 26

    在运行时更改文本组件值

  27. 27

    如何在运行时更改 QML 组件的样式?

  28. 28

    FireMonkey TListView:如何在运行时为项目着色?

  29. 29

    Firemonkey:在运行时将子控件添加到TListViewItem

热门标签

归档