如何托管在另一个内部对齐的FireMonkey表单客户端?

时间:2014-10-22 10:27:46

标签: delphi frame firemonkey

我的Delphi XE7 FireMonkey项目正在不断增长的控制力,我自然而然地转向使用框架。在我使用VCL中的框架的地方,有些情况我只是选择在另一个内部托管一个(复杂的)VCL表单,而是以表格的OnShow创建和显示它并设置它客户端对齐(这样做的好处是,在编辑框架时,您不会遇到悬挂继承控件的问题。)

但是,使用FireMonkey,情况发生了轻微变化,我试图让一个孩子形成客户端在另一个内部对齐是绊脚石。我遇到了这个very useful SO link,它显示了如何在VCL表单中托管FireMonkey表单,所以我使用我的代码构建了这个表单,如下所示:

procedure THostForm.FormCreate(Sender: TObject);
begin
  FForm := TChildForm.Create( Self );
  FForm.BorderIcons := [];
  FForm.BorderStyle := TFmxFormBorderStyle.None;
  FForm.Visible := True;
  FForm.Parent := Self;
  ResizeForm;
end;

procedure THostForm.FormResize(Sender: TObject);
begin
  inherited;
  ResizeForm;
end;

procedure THostForm.ResizeForm;
begin
  if Assigned(FForm) then
    FForm.SetBounds( Round(ClientRect.Left), Round(ClientRect.Top), Round(ClientWidth), Round(ClientHeight));
end;

这会生成一个子窗体,它使用主机窗体更改大小,但仍保留在屏幕的左上角。我也在ResizeForm例程中尝试了各种位置选项。在我看来,一个表单可能无法成为另一个表单的父表单因为TForm不是IAligneableControl而TFrame是。所以,我试着对接'我的子表单到以主机表单对齐的TRectangle客户端,其行为方式相同。

有没人检查过这个?

* MARCO以下建议的解决方案详情*

Marco的解决方案非常简洁,减少了“托管”的问题。只需两行代码。你需要确保你的孩子(托管)表单中的所有内容都在另一个客户端对齐控件内--Marco建议使用TLayout,但我已经有一个TPanel,我用于背景所以我没有完全改变儿童形式。因此,要在TChildForm内托管此子格式THostForm,请执行以下操作:

procedure THostForm.FormCreate(Sender: TObject);
begin
  FForm := TChildForm.Create( Self );
  FForm.Panel1.Parent := Self;
end;

完成工作。谢谢Marco。

1 个答案:

答案 0 :(得分:4)

在FireMonkey中混合表单和控件并不是一个好主意,因为它是VCL,因为在VCL控件和表单中都是具有自己的Windows句柄的TWinControl后代,而在FireMoneky中,表单与操作系统对象相关联虽然控制不是。

地址方案,我使用了不同的解决方案。使用客户端对齐的无用TLayout创建了一个表单,其中包含所有控件。在运行时,创建此表单并将Layout表示为新容器(例如,多选项卡控件中的选项卡)。

我已经使用了几次,从未发现过它的大问题,也是动态创建标签页以保持可视化开发模型的好方法。