1. 程式人生 > >DELPHI中MDI子窗口的關閉和打開

DELPHI中MDI子窗口的關閉和打開

mil proc afr con 過程 處理過程 sage 父窗體 self

DELPHI中MDI子窗口的關閉 和打開 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子窗口的默認關閉行為。 ================================================== 在MDIForm調用MDIChild窗體時要這樣用 引用 if not Assigned(Form2) then begin Form2:=TForm2.Create(Self); Form2.Show; end else Form2.BringToFront; 另外在MDIChild的OnClose, OnDestroy中要以下代碼 Form2為MIDChild窗體的名稱 procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; end; procedure TForm2.FormDestroy(Sender: TObject); begin Form2:=nil; end; ================================================= 如何獲得當前打開的子窗口的數量? Application.MainForm.MDIChildCount ================================================== 怎麽關閉所有打開MDI子窗體? 除了在主窗體寫入 procedure TFrmMain.N15Click(Sender: TObject); var I:integer; begin if Application.MessageBox(‘確定要關閉所有窗口嗎?‘,‘System‘,mb_iconinformation mb_yesno)=id_yes then begin for I:=MdiChildCount-1 downto 0 do MdiChildren[I].Close; end; end; 還要在各個子窗口寫入 procedure TFrmchildn.FormClose(Sender: TObject; var Action: TCloseAction); begin action:=cafree; Frmchildn:=nil; end; procedur TFrmchildn .FormDestroy(Sender: TObject); begin TFrmchildn:=nil; end; ================================================= 根據以上的測試,有效代碼: 主窗體: 引用 procedure TForm1.a2Click(Sender: TObject); begin if Assigned(Form2) then begin Form2.Close; end; end; procedure TForm1.a3Click(Sender: TObject); begin if not Assigned(Form2) then //判斷子窗體是否已打開 begin Form2:=TForm2.Create(Self); Form2.Show; end else Form2.BringToFront; end; 子窗體: 引用 procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; end; procedure TForm2.FormDestroy(Sender: TObject); begin Form2:=nil;

delphi 裏的

mdi 子窗口始終在最底層,父窗口的控件始終在子窗口之上,子窗口上的控件被遮擋,看起來很別扭。

有兩種解決辦法。一種是把父窗口的formstyle :=fsMdiform; 子窗口 formstyle :=fsMdiChild;在父窗口裏放置一個panel1 和父窗口尺寸一樣大。在把父窗口的控件都放在這個panel1上。在設置子窗口的的父類是panel1.

這裏有個關鍵代碼,a:=TForm2.Create(self); windows.SetParent(a.Handle,Panel1.Handle );

經過這種設置後,產生的子窗體就在最上了。關閉子窗體要在 onClose

裏設置 action:=caFree; 如果要通知父窗體子窗口已關閉,可以在子窗體裏設計一個自定義類。type TshowEvent = procedure(show: bool) of object;

在窗口類定義裏 private FshowEvent: TshowEvent;

public property onShowEvent: TshowEvent read FshowEvent write FshowEvent;

在子窗體裏 onClose if Assigned(onShowEvent) then onShowEvent(true);

在父窗體窗口類裏 procedure showMessage(show:bool);

Form1.showpage(show: bool);

begin

if show then //接到子窗口的關閉通知

end

第二種 是不用設置窗體的 FormStyle 直接設置另一個窗口為子窗口。

Application.CreateForm(Tform3,form3 );
windows.SetParent(Form3.Handle,Form1.Handle);
form3.show;

這種有個好處,不用設置panel1,但這窗體是窗口內嵌方式。

DELPHI中MDI子窗口的關閉和打開