创建 Firemonkey 表单并通过代码填充

Create Firemonkey form and populate by code

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

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

但我一直收到 "Resource /classname/ not found",其中 /classname/ 是任何 classname 我给我的临时表格 [=32] =].

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

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 一直在处理资源问题。

请不要告诉我所有表格 必须 设计?

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

You are calling the TForm constructor that invokes DFM streaming. The reason it does not fail in non-FMX apps is because TCustomForm.Create() filters out TForm specifically so it won't try to stream. In FMX, TCommonCustomForm.Create() filters out TCommonCustomForm instead of TForm, which is why your TForm in FMX is trying to stream itself.

Since you know that there is no DFM, you should be using the non-DFM constructor instead, in both VCL and FMX:

FRM := TForm.CreateNew(Application);