【问题标题】:Delphi - form within formDelphi - 形式中的形式
【发布时间】:2011-01-29 08:27:42
【问题描述】:

出于美学原因,我想在另一个表单之上显示一个表单,就像它是一个组件一样,比如一个 TPanel。它应该与父级一起调整大小,在父级被其标题栏拖动时四处移动,等等。

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

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


我现在倾向于 MDI...

【问题讨论】:

标签: delphi c++builder vcl


【解决方案1】:

在设计时将面板放置在您希望嵌入表单的位置。在运行时,创建表单,然后将嵌入表单的 Parent 属性设置为面板。

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@

【讨论】:

  • @Nat: .Parent 采用 TWinControl,而不是 WindowHandle。我冒昧地修复了你的代码。
  • 任何人都知道设置 Parent 是否与使用 align=alClient 的 TForm.ManualDock 有任何不同?
  • @Fransois:谢谢!你是对的!漫长的一周结束...@Warran P:ManualDoc() 可以产生有趣的效果,除非我真的“对接”表单,否则我会一直设置 Parent。
  • 和 Frame 没有独立的 alphablend 属性
  • 编辑:我错了!嵌入表单的 alphablend 属性将被忽略。
【解决方案2】:

您可以使用frame

【讨论】:

    【解决方案3】:

    本机 win32 MDI 被认为“过时”。我想您可能正在寻找 JEDI JvDocking 库之类的东西。我用它来模拟 MDI,但没有使用 win32 MDI 支持。

    【讨论】:

    • 感谢您的建议 (+1)。我正在使用 TMS 组件并且不想混合太多的第 3 方的东西。我会尝试将其放在面板上的建议。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2011-07-05
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多