日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

DELPHI中MDI子窗口的关闭和打开

發布時間:2023/12/13 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 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子窗口的关闭和打开的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。