如何避免在一个TForm中嵌入另一个TForm时出现问题?

9

我经常像这样将一个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

2个回答

8
我也这样做,我使用以下程序使其实现:
procedure TMyForm.PlaceInsideContainer(Container: TWinControl);
begin
  Parent := Container;
  Align := alClient;
  BorderIcons := [];
  BorderStyle := bsNone;
  ParentBackground := True;
  Show;
end;

我对此没有任何问题。唯一可能有关的区别是BorderIcons的分配,但我怀疑这会引起问题。


1
即使BorderStyle为bsNone,将BorderIcons设置为[]是否有任何理由? - Jens Mühlenhoff
@Jens 嗯,这段代码太旧了,我已经记不清它为什么是这样的了。我想知道将 BorderIcons 设置为 [] 是否意味着禁用 ALT+SPACE、ALT+F4 快捷键。 - David Heffernan
我这里没有 Delphi VCL/RTL 源代码或 Delphi 编译器,但我认为如果 BorderStylebsNone,那么 BorderIcons 就没有效果。在这种情况下,Alt+Space 不起作用,但 All+F4 可以。 - Andreas Rejbrand
是的,我刚刚做了一些测试,我觉得设置BorderIcons是无意义的。可能这源自Delphi的某个旧版本,或者更有可能只是我当时心情不好! - David Heffernan

1

我看到了一个类似的问题(你需要谷歌一下),而TeamB的答案是不要这样做,因为行为是不可预测的,你应该使用TFrame代替(这也是我一直在做的)。


1
我使用TFrame时遇到的问题比将一个窗体停靠在另一个窗体上要多得多。 - Warren P
将一个表单嵌套在另一个表单中对于我所有的应用程序都是必不可少的。 - Brian Frost
1
考虑将 TPanel 放置在容器 TForm 上,并将其用作 DockSite,以便停靠嵌入的 TForm 对象。TForm 真的不太适合作为另一个 TForm 的直接子级。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接