DELPHI中MDI子窗口的关闭和打开
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;如果要通知父窗體子窗口已關閉,可以在子窗體里設計一個自定義類。typeTshowEvent=procedure(show:bool)ofobject;
在窗口類定義里privateFshowEvent:TshowEvent;
publicpropertyonShowEvent:TshowEventreadFshowEventwriteFshowEvent;
在子窗體里onClose里ifAssigned(onShowEvent)thenonShowEvent(true);
在父窗體窗口類里procedureshowMessage(show:bool);
Form1.showpage(show:bool);
begin
ifshowthen//接到子窗口的關閉通知
end
第二種是不用設置窗體的FormStyle直接設置另一個窗口為子窗口。
Application.CreateForm(Tform3,form3);
windows.SetParent(Form3.Handle,Form1.Handle);
form3.show;
這種有個好處,不用設置panel1,但這窗體是窗口內嵌方式。
總結
以上是生活随笔為你收集整理的DELPHI中MDI子窗口的关闭和打开的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7搭建ftp服务器教程
- 下一篇: 工业相机各种参数计算方法