Delphi - 在窗体中嵌套子窗体

10

出于美观的考虑,我想将一个表单显示在另一个表单的顶部,就像它是一个组件一样,例如TPanel。它应该随着父级大小调整而调整大小,在父级通过其标题栏拖动时移动,等等。

-----------------------------
| main form component 1     |
-----------------------------
| main |  the 'embedded'    |  
| form |  form goes here    |
|comp 2|                    |
-----------------------------

我可以这样做吗?如果可以,怎么做?


现在我倾向于使用 MDI...


1
请参见 https://dev59.com/SUzSa4cB1Zd3GeqPkjrl. - Uli Gerhardt
3
我们称之为“对接”(嵌入式形式在此)。 - Warren P
3个回答

22

在设计时将一个面板放置到您想要嵌入表单的位置。在运行时,创建表单,然后将嵌入表单的父级属性设置为面板。

procedure TParentForm.FormCreate(ASender: TObject);
begin
  FEmbeddedForm := TEmbeddedForm.Create(self);

  FEmbeddedForm.Parent := Panel1;
  FEmbeddedForm.Align := alClient;
  FEmbeddedForm.Visible := True;

end;

编辑:

如果你想要停止窗口标题和边框的显示,将以下代码添加到FormCreate()函数的末尾

  LForm.Caption := '';
  LForm.BorderStyle := bsNone;

顺便说一句,我不是在倡导使用父窗体来替代框架,只是回答问题。框架非常好用(我经常使用它们),但它们和表单并不完全相同。它们几乎就像带有控件的面板。

例如,框架没有OnCreate事件或OnShow事件,这有时会很痛苦,特别是在重复使用它们并需要那种行为时。

N@


2
@Nat:.Parent 接受的是 TWinControl,而不是 WindowHandle。我帮你修复了代码。 - Francesca
有人知道设置Parent与使用align=alClient的TForm.ManualDock是否有任何区别吗? - Warren P
@Fransois:谢谢!你说得太对了!这是漫长一周的结束... @Warran P:ManualDoc()可能会产生有趣的效果,我只设置父级,除非我真的要“停靠”一个窗体。 - Nat
框架没有独立的alpha混合属性。 - PA.
编辑:我错了!嵌入窗体的alphablend属性只是被忽略了。 - PA.
显示剩余2条评论

14

3

原生的win32 MDI已经被认为是“过时的”。我想你可能正在寻找类似JEDI JvDocking库的东西。我使用它来模拟MDI,但不使用win32 MDI支持。


谢谢您的建议(+1)。我正在使用TMS组件,不想混合太多第三方内容。我会尝试将其放在面板上的建议。 - Mawg says reinstate Monica

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