Delphi中的窗體分為模式窗體和無模式窗體。二者的區別在於,用戶可以在無模式窗體和其他窗體之間切換。這樣,用戶就可以同時工作於一個應用程序的幾個部分。Delphi中窗體的初始化有兩種情況,動態創建,和自動創建。通過show顯示一個無模式窗體,ShowModal顯示一個模式窗體。窗體有創建對應的也要考慮釋放問題。當關閉一個窗體時,窗體並沒有真正從內存中釋放掉,它仍然存在於內存中,除非關閉了主窗體。因為模式窗體於無模式窗體的不同,所以二者的釋放處理也有不同。
模式窗體的創建與釋放
因為模式窗體可以判斷什么時候關閉窗體,可以用一下代碼來創建和釋放窗體。
begin ModalForm := TModalForm.Create(Application);//動態創建窗體 try ModalForm.ShowModal;//顯示模式窗體 finally ModalForm.Free; //釋放窗體實例 //ShowMessage(BoolToStr(ModalForm = nil)); ModalForm := nil; //把窗體變量設為nil //ShowMessage(BoolToStr(ModalForm = nil)); end; end;
非模式窗體的創建與釋放
begin Form1 := TForm1.Create(Application); Form1.show; end;
用上述代碼會導致每次都創建窗體實例,從而消耗了大量的內存。我們可以考慮讓窗體只創建一次,同時在窗體關閉的時候將釋放掉。
begin if not Assigned(ModalLessForm) then //確保只創建一個窗口 begin ModalLessForm := TModalLessForm.Create(Application); end; ModalLessForm.Show; end;
以上代碼就是一個單例模式,確保只創建一次。當關閉窗體后,如果希望在內存中釋放掉,就要處理器onClose事件,吧Action設為caFree,同時還要在onDestroy事件中將窗體變量指向nil。
procedure TModalLessForm.FormClose(Sender: TObject; var Action: TCloseAction); begin action := caFree; //當關閉窗口時釋放窗體 end; procedure TModalLessForm.FomDestroy(Sender: TObject); begin ModalLessForm := nil; //在窗口銷毀時,把modalLessForm變量設為nil end;