【问题标题】:How to avoid issues when embedding a TForm in another TForm?将一个 TForm 嵌入另一个 TForm 时如何避免问题?
【发布时间】:2026-02-22 09:25:01
【问题描述】:

我经常像这样将TForm 后代嵌入到另一个TForm 后代中:

var
  Form1: TForm1;
  Form2: TForm2;
begin
  Form2.Parent      := Form1;
  Form2.BorderStyle := bsNone;
  Form2.Align       := alClient;
  Form2.Show;
end;

通常这可以正常工作,但有时 Form2 中的控件没有正确对齐。这类问题有通用的解决方法吗?

有人知道是什么导致了这种“错位”吗?

我知道我可以使用TFrame 来完成这种工作,但是我有很多库代码需要重写,我看不出有任何理由说明TForm 中的TForm 方法应该不工作?

编辑:我已将组件TcxListView 确定为这里的罪魁祸首,我已向组件供应商(DevExpress)提交了错误报告:

http://www.devexpress.com/issue=B194161

编辑 2: DevExpress 的开发人员分析了这个问题,并表示这实际上是 Embarcadero 的 TGridPanel 组件中的缺陷:

http://qc.embarcadero.com/wc/qcmain.aspx?d=90324

【问题讨论】:

    标签: delphi layout delphi-2007 vcl tframe


    【解决方案1】:

    我也这样做,并使用以下例程来实现它:

    procedure TMyForm.PlaceInsideContainer(Container: TWinControl);
    begin
      Parent := Container;
      Align := alClient;
      BorderIcons := [];
      BorderStyle := bsNone;
      ParentBackground := True;
      Show;
    end;
    

    我对此没有任何问题。我可以想象的唯一可能相关的区别是 BorderIcons 的分配,但我怀疑这会导致问题。

    【讨论】:

    • 即使BorderStylebsNone,是否有任何理由将BorderIcons 设置为[]
    • @Jens 好吧,这段代码太老了,我不记得为什么会这样了。我想知道将 BorderIcons 设置为 [] 是否意味着 ALT+SPACE、ALT+F4 快捷键被禁用。
    • 我这里没有可用的 Delphi VCL/RTL 源代码或 Delphi 编译器,但我认为如果 BorderStylebsNoneBorderIcons 无效。在这种情况下,Alt+Space 不起作用,但 All+F4 起作用。
    • 是的,我刚刚做了一些测试,我认为设置 BorderIcons 是没有意义的。也许它源于某些旧版本的 Delphi,或者更可能是我刚刚度过了糟糕的一天!
    【解决方案2】:

    我读到了一个类似的问题(你必须用谷歌搜索),TeamB 的答案是不这样做,因为行为是不可预测的,你应该使用 TFrame 代替(这是我一直在做的)。

    【讨论】:

    • 我在使用 TFrame 时遇到的问题比将一个表单停靠在另一个表单上要多得多。
    • 在另一个表单中托管一个表单对我的所有应用程序来说都是必不可少的。
    • 考虑在容器 TForm 上放置一个 TPanel,并将其用作停靠嵌入式 TForm 对象的 DockSite。 TForm 确实没有经过精心设计,无法设置为另一个 TForm 的直接子代。
    最近更新 更多