Forms 如何创建包含多个可移动/调整大小和显示激活的“子”表单的delphi表单

Forms 如何创建包含多个可移动/调整大小和显示激活的“子”表单的delphi表单,forms,delphi,parent,Forms,Delphi,Parent,我已经创建了一个表单,其中包含一个或多个“子”表单。在“我的编辑”模式下,每个子窗体都显示其边框和标题栏,使其可以像旧的MDI应用程序一样移动和调整大小。在我的编辑模式下,边框消失,子窗体固定到位。对于我的简单演示,我正在创建子窗体,如下所示: procedure TForm1.Button1Click(Sender: TObject); var Frm : TForm; begin Frm := TForm3.Create( Self ); Frm.Parent := Self;

我已经创建了一个表单,其中包含一个或多个“子”表单。在“我的编辑”模式下,每个子窗体都显示其边框和标题栏,使其可以像旧的MDI应用程序一样移动和调整大小。在我的编辑模式下,边框消失,子窗体固定到位。对于我的简单演示,我正在创建子窗体,如下所示:

procedure TForm1.Button1Click(Sender: TObject);
var
  Frm : TForm;
begin
  Frm := TForm3.Create( Self );
  Frm.Parent := Self;
  Frm.Visible := True;
结果是这样的布局:

我注意到子窗体中的编辑控件从未处于活动状态。我想让“点击”表单显示一个活动的标题栏颜色,就像点击时活动的应用程序一样。我假设我的子窗体的“尸体”行为是因为它们是不活动的,但试图做像ChildForm.SetFocus这样的事情却什么都不做

我需要做什么才能激活这些编辑控件,并将其中一个窗体显示为“选定”窗体

如果可能的话,我也想“选择”多个表单

调用Windows.SetFocusForm.Handle,它比TForm.SetFocus更有力。具体来说,Windows.SetFocus将聚焦并激活一个不活动的表单,我怀疑这是您的主要问题

让多个表单处于活动状态感觉是错误的


最后,你是否考虑过使用MDI?它仍然有效。

我认为MDI是最简单的方法,在主窗体集合FormStyle=fsMDIForm中,在childs FormStyle=fsMDIChild中


就是这样,这样你就不必设置家长让它工作。

导致这种行为的是VCL的家长机制。我不知道确切的原因,我想需要一些时间才能弄清楚,因为这是一个复杂的机制

通过api,您可以获得所需的育儿行为:

procedure TForm1.Button1Click(Sender: TObject);
var
  Frm : TForm;
begin
  Frm := TForm3.Create( Self );
//  Frm.Parent := Self;
  windows.SetParent(Frm.Handle, Handle);
  Frm.Visible := True;
您肯定会丢失与VCL的一些同步,例如依赖于父级的属性、锚定、所有权等。。它甚至可能在api方面有问题,比如缺少WS_子标志。。。试试看它是否适合你的需要

要对多个活动形式有感觉,您可以让其中任何一个进行相应的绘制:

  SendMessage(Frm.Handle, WM_NCACTIVATE, WPARAM(True), 0);

当任何表单收到此消息时,它将重新绘制其非客户端区域,以反映其假定的激活状态。为wParam传递'false'将导致相反的结果。

在评论中包含一个很好的选项,但不会回答任何其他问题。.通常我会同意,但似乎有一个我认为传统MDI无法处理的关键要求:退出我的编辑模式,边界消失了,子窗体也固定了位置。当你最终显然想要MDI时,为什么你还特意不使用MDI呢?我讨厌MDI、它的外观、工作原理等等。从可用性和UI交互设计的角度来看,这是一个糟糕的概念。但是如果你真的想要mdi的可怕外观,那么就使用mdi吧-@warren有时mdi正是您所需要的并且有效beautifully@WarrenPMDI很可怕?嗯,他们就是这么说的。。。但对于我的大多数商务应用程序,我都需要它们。不幸的是,我不能使用它们,因为我的软件是为Windows和Ubuntu设计的。所以我不得不离开他们。还有一件事我用的是拉扎勒斯,他们说是一样的,但是。。。你知道的;是的,我确实考虑过MDI,但我希望避免并发症和未来可能的贬低。我认为不太可能。最新的文档对新应用程序来说更令人鼓舞。在Delphi中,MDI一点也不复杂。所有的工作都已为您完成。@SertacAkyuz是否有不依赖windows API的解决方案?我的目标是用Lazarus开发Ubuntu/Windows应用程序,我也有同样的问题。所以也许我们的家长设置不正确。纯粹是实验性的。。。在我的例子中,我希望子表单只是显示,而不是移出父容器。如果你们也需要这样做,我已经通过使用带有单个选项卡的PAGECONTROL实现了这一点。关闭子窗体的边框,它就会工作。但是很明显,您不能移动子窗体。现在,这符合我的目的: