2014-10-22 47 views
2

我的Delphi XE7 FireMonkey项目正在增加控件,自然我已经转向使用框架。在VCL中使用过框架的地方,有些情况下我只是选择在另一个框架中托管一个(复杂的)VCL表单,在表单的OnShow中创建和显示它并将其设置为客户端对齐(这样做的好处当你编辑框架时,你不会遇到悬挂继承控件的问题)。如何托管一个FireMonkey表单客户端在另一个内部对齐?

尽管使用FireMonkey,事情已经发生了一些变化,我试图让一个孩子表单客户端在另一个里面对齐,这是一个绊脚石。我碰到这个very useful SO link它展示了如何举办一个FireMonkey形式的VCL形式里面,所以我建立在这个与我的代码如下传来:

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 BELOW *

Marco的解决方案是非常整洁,减少了“托管”来的代码只是两行。你需要确保你的孩子(托管)窗体内有另一个客户端对齐控件中的所有东西 - Marco建议使用TLayout,但我已经有一个TPanel用于背景,所以我没有修改子窗体在所有。因此,举办这次子窗体TChildFormTHostForm简单地做:

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

完成任务。感谢Marco。

+0

尝试[ClientToScreen](http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Controls.TControl.ClientToScreen)(ClientRect)或 - 如果父表单本身不是其他表单的子表单 - 简单地BoundsRect。 – 2014-10-22 10:34:29

+0

好主意 - 解决左上角的问题,但移动宿主窗体不会移动孩子 - 我猜是因为这不会触发OnResize。调整大小看起来相当可怕,因为重新定位导致闪烁的黑色带。 – 2014-10-22 10:50:21

回答

4

在FireMonkey中混合形式和控件并不是一个好主意,因为它是VCL,因为在VCL控件和窗体中都是带有自己的Windows句柄的TWinControl后裔,而在FireMoneky中,窗体与操作系统而控件则不是。

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

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

+0

完美的马可,谢谢。我已经用实现你的建议的令人惊讶的简单代码得出了我的问题 - 在我的情况下,我没有努力,因为我有一个TPanel。 – 2014-10-22 14:40:30

相关问题