2017-02-15 46 views
-1

這可能不是我的應用程序(XE7)的問題,因爲它只發生在我的客戶工作站中的一個上,但是我想確認我是否正確編碼並要求提供解決方案的任何指導應用程序z訂購問題

會發生什麼事是,從應用程序主窗體沒有非模態形式,可以推出,然後當這些最後一個隨後關閉場所的應用主要形式,在Windows的Z順序的後面

這裏是我的啓動代碼的主要應用

Application.Initialize; 
Application.MainFormOnTaskbar := True; 
Application.CreateForm(TDM, DM); 
Application.CreateForm(TfmMain, fmMain); 
Application.CreateForm(TfmReportDefn, fmReportDefn); 
Application.Run; 

下面是代碼啓動非模態的例子形成

if (fmCustomer = nil) then 
    fmCustomer := TfmCustomer.Create(nil); 
    else 
    fmCustomer.SetFocus; 

這裏是對非模態窗體的OnClose事件代碼

procedure TfmCustomer.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    action := cafree; 
    fmCustomer := nil; 
end; 

感謝您的任何答覆

回答

0

下面是啓動非模態窗體代碼示例

if (fmCustomer = nil) then 
    fmCustomer := TfmCustomer.Create(nil); 
else 
    fmCustomer.SetFocus; 

我建議更多的東西像這個:

if (fmCustomer = nil) then 
    fmCustomer := TfmCustomer.Create(Application); 
fmCustomer.Show; 

首先,設定物主保證,如果應用程序被關閉的形式還是自動釋放,並且用戶沒有關閉表呢。

其次,使用Show()而不是SetFocus()來確保窗體實際上可見並被帶到前臺。

這裏是對非模態形式

procedure TfmCustomer.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    action := cafree; 
    fmCustomer := nil; 
end; 

使用caFree優良OnClose事件代碼,但我建議nil任務移動到OnDestroy事件,而不是:

procedure TfmCustomer.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

procedure TfmCustomer.FormDestroy(Sender: TObject); 
begin 
    fmCustomer := nil; 
end; 

OnClose事件只會在用戶手動關閉窗口時觸發,如果操作系統是正在關機,或者如果您的代碼調用fmCustomer.Close()。如果表單因爲除此以外的任何原因而被釋放,您仍然需要nil指針,但不會調用OnClose