如何检查MDI应用程序中表单的“Z位置”?

时间:2009-11-10 14:50:17

标签: delphi forms mdi

我在Delphi中创建了MDI应用程序。让我们假设我的应用程序中有一堆MDIChild表单在屏幕上可见。我想对这些表单执行循环,并检查每个表单在屏幕上显示的顺序。

例如,如果我有3个MDICHild表单:

FormAFormBFormC

FormB部分重叠FormAFormC部分重叠FormB

我想按如下方式标记他们的Z属性(深度):

FormB.Z = 2 // that form is between FormA and FormC
FormA.Z = 3 // that form's distance is longest from user, form is overlapped by FormB and 
FormC.Z = 1 // that form is at the top of all forms in my application 

感谢您的时间。

2 个答案:

答案 0 :(得分:4)

J 的回答通过Screen.Forms循环。这包含应用程序中的所有表单,包括非MDI表单,正如我在您的评论中看到的那样。您可以手动过滤主表单和关于框,但这很麻烦,您还需要为其他表单执行相同的操作。我真的不喜欢这样做,因为它似乎容易出错。

你的问题说你只想知道父母中MDI子表单的z顺序,在这种情况下,有一个更好的解决方案。

MDI子项在MDI父表单的MDIChildren属性中以z排序顺序列出。找到Z深度的代码看起来像这样(未经测试):

function FindChildDepth(Child : TForm) : Integer;
var
  i : Integer;
begin
  Result := -1; // Form not found
  for i := 0 to MDIChildCount-1 do
  begin
    if (MDIChildren[i] == Child) then
    begin
      Result := i;
      Exit;
    end;
  end;
end;

应返回0到n-1之间的子深度,其中0表示顶部,如果在MDIChildren数组中找不到表单,则返回-1。如果您希望“1”表示top而不是0,则只需将Result设置为i + 1.

答案 1 :(得分:1)

使用Screen.Forms属性迭代应用程序中的表单。它按照Z顺序返回它们,完全按照你想要的那样。

e.g。使用1个MDIForm和3个MDIChild表单创建一个应用程序。

在主窗体的菜单选项中,输入:

procedure TForm1.mnuFormOrder2Click(Sender: TObject);
var
  i: Integer;
  s: String;
begin
  s := '';
  for i := 0 to Pred(Screen.FormCount) do
  begin
    s := s + Screen.Forms[i].Caption+#13;
  end;

  MessageBox(Self.Handle, PChar(s),
    PChar(Self.Caption), MB_OK or MB_ICONINFORMATION or MB_TASKMODAL);
end;

这将显示一条消息,列出Z序列中表单的名称。它还会列出您的主表单,但您可以编写它。如果您将另一个孩子组成活动孩子,然后再次单击菜单选项,您将看到表单的顺序已更改。