我目前正在爲現有的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;
這工作不錯,但唯一的問題是有效的重複循環永遠不會打破,孩子一直即使逃脫,所以父母的形式永遠不會重演。 有什麼辦法可以解決這個問題嗎?
您是否試圖在關閉之前使子窗體顯示父窗體? – 2011-12-16 21:52:33
我不知道如何隱藏'父'窗口將導致任何形式的可移動性。請準確地描述你的目標,或者從問題中刪除多餘的部分。 – NGLN 2011-12-16 21:58:55