1. 程式人生 > >Delphi MDI 子窗體的建立和銷燬 [zhuan]

Delphi MDI 子窗體的建立和銷燬 [zhuan]

1.如果要建立一個mdi child,先看是否有這個child 存在,如果有,則用它,如果沒有再建立

//該函式判斷MDI 子窗體是否存在,再進行建立和顯示
function isInclude(formclass: TFormClass): boolean;
var
  i: Integer;
  form: TObject;
begin
  result := false;
  for i := 0 to frmMain.MDIChildCount do
  begin
    form := frmMain.MDIChildren[i];
    if form is formclass then
      result := true;
  end;
end;

//例如:開啟frmAbout這個子窗體

procedure TfrmMain.actAboutExecute(Sender: TObject);
begin
  if not isInclude(TfrmAbout) then
//  if not Assigned(frmAbout) then
  begin
    frmAbout := TfrmAbout.Create(Self);
    frmAbout.Caption := '關於';
    frmAbout.Show;
  end
  else
    frmAbout.Show;
end;

 http://www.whois.com/whois/pc100.net

2. 如果判斷一個form是否存在,用 assigned(aForm)來看是否有建立並指向這個instance. (需要注意form destroy掉時,aForm 指標並沒有free掉,要注意下一條的細節。


3. 對於mdi child 的銷燬,注意以下幾項: 
   ①關閉mdi, 用form.close方法。 
   ②在 onClose事件處理中,需要判斷是否可以 free掉, 用 Action := caFree 
   ③銷燬form時,需要釋放form引數的指標內容。 aForm := nil.


Delphi中MDI子視窗的關閉方式預設為縮小而不是關閉,所以當你單擊子視窗右上角的關閉按鈕時會發覺該子視窗只是最小化,而不是你預期的那樣被關閉。解決辦法是在子視窗的OnClose事件處理過程中加入如下程式碼,示例: 
procedure ChildForm.OnClose(Sender: TObject; var Action: TCloseAction); 
begin 
  Action := caFree; 
end;


Delphi為一個Form的關閉行為指定了四種方式,分別是: 
    caNone: 禁止Form被關閉  
    caHide: Form不被關閉,但是被隱藏。被隱藏的Form仍然可以被程式訪問。 

    caFree: Form被關閉,並且釋放其佔用的資源。  
    caMinimize: Form被最小化而不是被關閉,這是MDI子視窗的預設關閉行為。

原文出自:http://www.cnblogs.com/python001/