2009-11-10 43 views
1

我在Delphi中創建了MDI應用程序。讓我們假設我的應用程序中有一堆MDIChild表單,這些表單在屏幕上可見。我想對這些表單執行一個循環,並檢查每個表單在屏幕上顯示的順序。如何檢查MDI應用程序中窗體的「Z位置」?

例如,如果我有3種MDICHild形式:

FormAFormBFormC

FormB部分重疊FormAFormC部分重疊FormB

我要紀念他們ž財產(深)如下:

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 

謝謝你的時間。

回答

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是頂部之間的孩子的深度和-1如果表單沒有在MDIChildren數組中找到。如果你想讓「1」代表0而不是0,只需將Result設置爲i + 1即可。

+0

相當正確,我一直使用MDIChildren,但沒有意識到它以Z順序返回了表格。 – 2009-11-11 08:30:20

+0

謝謝大衛M.因爲它是更乾淨的解決方案,我會將其標記爲正確的答案。希望_J_不會感到生氣;-) – Wodzu 2009-11-11 11:45:45

+0

哎。很公平。 – 2009-11-11 12:21:17

1

使用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-序列形式的名稱。它也會列出你的主窗體,但你可以編寫它。如果您將另一個孩子變成活動孩子,然後再次單擊菜單選項,您將看到表單的順序已更改。

+0

謝謝_J_這正是我想要的。但是!;)如果你在從wizzard創建的新的MDI應用程序下測試你的代碼,它會向你顯示關於在屏幕上不可見的窗體。但我想這可以很容易地過濾掉。再次感謝。 – Wodzu 2009-11-10 17:13:28

相關問題