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

Bri*_*ost 4 forms delphi parent

我创建了一个托管一个或多个“子”表单的表单。在我的编辑模式下,每个子窗体都会显示其边框和标题栏,允许其移动和调整大小(有点像旧的 MDI 应用程序)。在我的编辑模式之外,边框消失,子表单固定在适当的位置。对于我的简单演示,我正在创建子表单:

procedure TForm1.Button1Click(Sender: TObject);
var
  Frm : TForm;
begin
  Frm := TForm3.Create( Self );
  Frm.Parent := Self;
  Frm.Visible := True;
Run Code Online (Sandbox Code Playgroud)

结果是这样的布局: 布局

我注意到子窗体中的编辑控件从未处于活动状态。我想让“点击”表单显示活动标题栏颜色,就像活动应用程序在单击时四处移动一样。我认为子表单的“尸体”行为是因为它们处于非活动状态,但尝试执行诸如 ChildForm.SetFocus 之类的操作却无济于事。

我需要做什么才能使这些编辑控件处于活动状态并将其中一个表单显示为“已选择”?

(如果可能的话,我真的很想“选择”不止一种表格)

Ser*_*yuz 5

导致该行为的原因是 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;
Run Code Online (Sandbox Code Playgroud)


您肯定会失去与 VCL 的一些同步,例如父依赖属性、锚定、所有权等。它甚至可能在 api 方面出现问题,例如缺少 WS_CHILD 标志...尝试一下,看看它是否有效您的需求..


要感受多个活动形式,您可以告诉其中任何一个进行相应的绘制:

  SendMessage(Frm.Handle, WM_NCACTIVATE, WPARAM(True), 0);
Run Code Online (Sandbox Code Playgroud)

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