2012-12-27 61 views
4

我目前正在開發一個MDI應用程序。
每次創建一個新的MDI子窗口,它被保存在飛行到SQLite數據庫和open設置爲1列,因此,如果用戶關閉程序並重新打開它的窗口也被恢復(也底層數據的時間如有任何問題TM)。
因此,每個文檔總是存在於數據庫中 - 如果用戶單擊「保存」,發生的唯一情況是列persistent設置爲1
現在如果MDI子窗口關閉,open設置爲0 - 並且persistent=0 AND open=0的每一行註定並將被刪除。如何知道爲什麼'OnCloseQuery'被調用 - MDI子關閉或App關閉?

由於這種行爲,我不需要問「保存文檔?」在ApplicationClose上。
但是我需要問每次一個MDI子窗口關閉。
如果Mainform.OnCloseQuery將在MDIChild.OnCloseQuery之前被調用,那麼這將很容易做到,但遺憾的是情況並非如此。

概括起來:
我需要一種方法來知道MDIChild.OnCloseQuery是否被調用,因爲

  • 應用程序被關閉,或
  • 被關閉的MDI子窗口。

有沒有辦法做到這一點?

+0

電腦不知道「爲什麼」他們知道,在這種情況下,哪個。哪個函數調用哪個函數。要知道哪些是應用程序的全局變量,在應用程序關閉時將設置爲「true」,並且您可以檢查它。這不是一個「delphi」解決方案,而是一個編程解決方案。 – none

+0

當然。全局變量在應用程序關閉時設置爲「true」會很好。這就是我的意思,「如果使用Mainform,這很容易。OnCloseQuery'將被首先調用。 – Pharaoh

回答

7

您需要覆蓋主窗體中受保護的虛擬方法CloseQuery。當發生這種情況時,您知道該應用正在關閉。但是在主窗體上觸發OnCloseQuery事件之前,繼承的實現在MDI子項上調用CloseQuery

下面是TCustomForm實施CloseQuery

function TCustomForm.CloseQuery: Boolean; 
var 
    I: Integer; 
begin 
    if FormStyle = fsMDIForm then 
    begin 
    Result := False; 
    for I := 0 to MDIChildCount - 1 do 
     if not MDIChildren[I].CloseQuery then Exit; 
    end; 
    Result := True; 
    if Assigned(FOnCloseQuery) then FOnCloseQuery(Self, Result); 
end; 

注意,MDI孩子之前得到他們CloseQuery通知Self,即主要形式。

因此,在主窗體,你需要:

type 
    TMainForm = class(TForm); 
    private 
    FCloseQueryExecuting: Boolean; 
    protected 
    function CloseQuery: Boolean; override; 
    public 
    property CloseQueryExecuting: Boolean read FCloseQueryExecuting; 
    end; 

,然後看起來像這樣實現:

function TMainForm.CloseQuery: Boolean; 
begin 
    FCloseQueryExecuting := True; 
    try 
    Result := inherited CloseQuery; 
    finally 
    FCloseQueryExecuting := False; 
    end; 
end; 

然後MDI孩子們可以檢查主窗體的FCloseQueryExecuting屬性的狀態他們的OnCloseQuery事件。

+0

謝謝,這看起來不錯。 – Pharaoh