【问题标题】:Create Firemonkey form and populate by code创建 Firemonkey 表单并通过代码填充
【发布时间】:2016-05-17 07:37:00
【问题描述】:

我正在将 VCL 组件移植到 FMX。 99% 的代码是纯对象帕斯卡,所以效果很好 - 但我有一个方法可以创建一个表单,用按钮和文本框填充它,这在 FMX 下根本不起作用。

手动创建表单然后从代码中填充它的重点是确保它在 VCL、LCL 和 FMX 下编译;并且它在 iOS、Android 和任何使用的平台下也能正常显示。

但我不断收到“资源 /classname/ 未找到”,其中 /classname/ 是我给我的临时表单类的任何类名。

这样简单的事情会产生错误:

type
TMyDialogForm = Class(TForm);

procedure TForm1.Button1Click(Sender: TObject);
var
  LDialog:  TMyDialogForm;
begin
  LDialog := TMyDialogForm.Create(application.MainForm);
  try
    LDialog.Caption := 'Yahoo!';
  finally
    LDialog.Free;
  end;
end;

由于错误涉及资源,我怀疑它正在寻找某种类型的布局数据。我刚开始玩 FMX,我确实注意到不同的平台允许不同的布局。但我必须承认,无论您针对什么平台,我都希望它回退到默认主题。

那么——我究竟如何通过代码创建一个表单、填充它并使用 Firemonkey 显示 ut 而不会遇到这种错误?它在 VCL 和 LCL 下工作得非常好,但 FMX 一直在处理资源。

请不要告诉我所有的表单必须被设计?

【问题讨论】:

    标签: delphi firemonkey vcl


    【解决方案1】:

    @RemyLebeau 在 delphi 论坛 (How to create a TForm at runtime?) 中回答了类似的问题:

    您正在调用调用 DFM 流的 TForm 构造函数。原因 它在非 FMX 应用程序中不会失败是因为 TCustomForm.Create() 过滤器 专门输出 TForm,这样它就不会尝试流式传输。在 FMX 中,TCommonCustomForm.Create() 过滤掉 TCommonCustomForm 而不是 TForm,这就是为什么你的 TForm 在 FMX 正在尝试自己进行流式传输。

    既然你知道没有 DFM,你应该使用非 DFM 构造函数 相反,在 VCL 和 FMX 中:

    FRM := TForm.CreateNew(Application);
    

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 1970-01-01
      • 2012-03-26
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      相关资源
      最近更新 更多