我在Delphi中创建了MDI应用程序。让我们假设我的应用程序中有一堆MDIChild表单在屏幕上可见。我想对这些表单执行循环,并检查每个表单在屏幕上显示的顺序。
例如,如果我有3个MDICHild表单:
FormA
,FormB
,FormC
和
FormB
部分重叠FormA
,FormC
部分重叠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
感谢您的时间。
答案 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序列中表单的名称。它还会列出您的主表单,但您可以编写它。如果您将另一个孩子组成活动孩子,然后再次单击菜单选项,您将看到表单的顺序已更改。