代码之家  ›  专栏  ›  技术社区  ›  Wodzu

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

  •  1
  • Wodzu  · 技术社区  · 15 年前

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

    例如,如果我有3个MDichild窗体:

    FormA , FormB , FormC

    福尔巴 部分重叠 福尔马 货船安全证书 部分重叠表格B

    我想标记他们的Z属性(deepth),如下所示:

    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 回复  |  直到 15 年前
        1
  •  4
  •   David Mohaimin Moin    15 年前

    J 的答案在screen.forms中循环。这包含了应用程序中的所有表单,包括非MDI表单,正如我从您的评论中看到的那样。您可以手动筛选主窗体和About Box,但这很混乱,您还需要对其他窗体执行相同的操作。我真的不喜欢这样做,因为它看起来很容易出错。

    你的问题是,你只想知道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;
    

    如果在MDichildren数组中找不到该窗体,则返回0到n-1之间的子级的深度,其中0是顶部,而-1。如果您希望“1”的意思是top而不是0,只需将result设置为i+1即可。

        2
  •  1
  •   J__    15 年前

    使用screen.forms属性迭代应用程序中的表单。它按Z顺序返回它们,完全符合您的需要。

    例如,使用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顺序排列的表单名称。它还将列出您的主窗体,但您可以对此进行编码。如果将其他子窗体设为活动窗体,然后再次单击菜单选项,则会看到窗体的顺序已更改。