2016-03-08 64 views
2

到目前爲止,在我的應用程序中已經發現所有在運行時創建的附加窗體都應該是模態的。因此,創造一種新的形式,當我用類似的東西下面的代碼塊:使用C++ Builder/Firemonkey中的表單創建管理內存

void __fastcall ShowForm(TComponent * Owner) 
{ 
    TForm1 * form = new TForm1(Owner); 
    form->ShowModal(); 

    delete form; 
} 

通過這種方法,用戶已經關閉後,窗體的記憶很容易被刪除。

但是,當試圖找出如何處理非模態對話框的內存管理時,我遇到了一個問題。顯然,我不能簡單地在ShowForm方法的末尾調用delete,因爲表單在創建後會立即刪除。所以我留下了這樣的事情:

void __fastcall ShowForm(TComponent * Owner) 
{ 
    TForm1 * form = new TForm1(Owner); 
    form->Show(); 
} 

基於this documentation,我寫了一個測試程序,我知道,一旦它的主人已經關閉了form指針將被刪除。然而,這仍然給我以下情況:

可以說我有FormA帶有一個按鈕,該按鈕使用代碼就像上面的方法一樣創建和顯示FormB的實例。我現在點擊按鈕創建一個FormB,然後關閉FormB三次。在FormA關閉之前,FormB的三個實例保留在內存中。

如何管理內存以進行表單創建,從而在表單關閉後刪除爲表單分配的內存?有沒有一個標準的最佳做法,或者我缺少的內置功能?

回答

5

使用TForm::FormClose事件,以及Action參數設置爲caFree:然後

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) 
{ 
    Action = TCloseAction::caFree; 
} 

形式將中解脫出來,當它被關閉。