2011-12-16 88 views
5

我目前正在爲現有的Delphi應用程序編寫一個窗口系統。Delphi - 覆蓋TForm.showModal隱藏行爲

目前,該程序由許多完整大小的表格組成,這些表格按照它們所需的順序以模式顯示,並且用戶無法移動。我的目標是讓所有這些形式都是可移動的。以前的表格堆疊在一起,但由於沒有任何可移動的背景形式對用戶不可見。到目前爲止,我的解決方案是在打開一個新孩子時隱藏父母形式,並在孩子關閉時重新顯示。

不幸的是,由於每個孩子都用showModal調用,使父窗體可見的調用不會在模態過程完成之後纔會出現,因此在隱藏子窗體之後,用戶看到一個分開的第二閃窗體是可見的。

有沒有一種方法可以防止模態表單在其過程完成後自動隱藏?這將允許我手動隱藏它們,一旦父窗體再次可見。我試圖在每個子窗體的FormHide事件中安排這一點,但這不起作用,因爲打開其自己的子項時,子窗體也隱藏。

編輯:

這是我迄今基於雷米的建議如下

procedure openModalChild(child: TForm; parent: TForm); 
var 
    WindowList: Pointer; 
    SaveFocusCount: Integer; 
    SaveCursor: TCursor; 
    SaveCount: Integer; 
    ActiveWindow: HWnd; 
    Result: integer; 
begin 
    CancelDrag; 
    with child do begin 
    Application.ModalStarted; 
    try 
    ActiveWindow := GetActiveWindow; 
    WindowList := DisableTaskWindows(0); 
    //set the window to fullscreen if required 
    setScreenMode(child); 
    try 
    Show; //show the child form 
    try 
     SendMessage(Handle, CM_ACTIVATE, 0, 0); 
     ModalResult := 0; 
     repeat 
     Application.HandleMessage; 
     //if Forms.Application.FTerminate then ModalResult := mrCancel else 
      if ModalResult <> 0 then closeModal(child as TCustomForm); 
     until ModalResult <> 0; 
     Result := ModalResult; 
     SendMessage(Handle, CM_DEACTIVATE, 0, 0); 
     if GetActiveWindow <> Handle then ActiveWindow := 0; 
    finally 
     parent.Show; 
     Hide; 
    end; 
    finally 
    EnableTaskWindows(WindowList); 
    parent.Show; //reshow the parent form 
    if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow); 
    end; 
    finally 
    Application.ModalFinished; 
    end; 
    end; 
end; 

這工作不錯,但唯一的問題是有效的重複循環永遠不會打破,孩子一直即使逃脫,所以父母的形式永遠不會重演。 有什麼辦法可以解決這個問題嗎?

+0

您是否試圖在關閉之前使子窗體顯示父窗體? – 2011-12-16 21:52:33

+0

我不知道如何隱藏'父'窗口將導致任何形式的可移動性。請準確地描述你的目標,或者從問題中刪除多餘的部分。 – NGLN 2011-12-16 21:58:55

回答

10

ShowModal()在進入其模態處理循環之前明確地調用Show(),並且在退出循環後立即明確地呼叫Hide()。如果不更改VCL的Forms.pas源文件中的代碼,則無法更改該代碼。

如果您需要對窗口進行更好的控制,而無需編輯VCL源代碼,則根本不要使用ShowModal()。根據需要自行使用Show(),Hide(),DisableTaskWindows()EnableTaskWindows()。我會告訴你看看Forms.pas,看看它們是如何使用的。將ShowModal()的實現複製到您自己的函數中,然後您可以根據需要對其進行自定義。