線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2552
推到 Plurk!
推到 Facebook!

關於 MDI 相同 Form 重複開啟,再逐一關閉時的錯誤問題.

答題得分者是:eaglewolf
ssbbs
一般會員


發表:3
回覆:10
積分:2
註冊:2008-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-24 01:32:52 IP:203.70.xxx.xxx 訂閱
請問一下,在下設計兩個 Form, 一個主 Form1 -> MDI, 一個 子 Form2 -> MDIChild
我查遍網站所有關於 MDI 文章,都只提到要避免相同 MDIChild Form 的重複開啟,
可是,在下要設計的卻偏偏是相同 MDIChild Form 可以重複開啟的程式,

在執行階段點出相同 Form2 兩次, 然後關閉第一個 Form2, 沒有問題,
再關閉第二個 Form2 時,就會出現問題.
請問這樣子有解嗎?
我測試結果,應該是 Form2 在第一次關閉時被 Free 了,
所以關閉第二次 Form2 時才造成記憶體上得差錯吧?

eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-24 09:10:07 IP:211.75.xxx.xxx 訂閱
不知道您的問題點在哪
以下的程式可以正常的 開啟/關閉多個MDIChild Form
[code delphi]
{ Unit1.pas}
procedure TForm1.N11Click(Sender:TObject)
begin
Form2 := TForm2.Create(Form1);
Form2.Show;
end;


{Unit2.pas}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
[/code]


===================引 用 ssbbs 文 章===================
請問一下,在下設計兩個 Form, 一個主 Form1 -> MDI, 一個 子 Form2 -> MDIChild
我查遍網站所有關於 MDI 文章,都只提到要避免相同 MDIChild Form 的重複開啟,
可是,在下要設計的卻偏偏是相同 MDIChild Form 可以重複開啟的程式,

在執行階段點出相同 Form2 兩次, 然後關閉第一個 Form2, 沒有問題,
再關閉第二個 Form2 時,就會出現問題.
請問這樣子有解嗎?
我測試結果,應該是 Form2 在第一次關閉時被 Free 了,
所以關閉第二次 Form2 時才造成記憶體上得差錯吧?

------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
ssbbs
一般會員


發表:3
回覆:10
積分:2
註冊:2008-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-01-24 09:54:53 IP:203.70.xxx.xxx 訂閱
在下 MDI form 的程式碼為:

var
frmMain : TfrmMain;

implementation
uses cut;

procedure TfrmMain.Csutomer1Click(Sender: TObject);
begin
frmCut := TfrmCut.Create(frmMain);
frmCut.Show;
end;

MDIChild 程式碼如下:

var frmCut: TfrmCut;
implementation

procedure TfrmCut.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
frmCut := NIL;
end;

procedure TfrmCut.ToolButton5Click(Sender: TObject);
begin
frmCut.Close;
end;



這個 MDIChild -> frmCut 連續開兩次,
關閉第一次開啟的沒問題,
關閉第二次開啟的就會出現如下訊息:
錯誤訊息

pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-01-24 23:06:53 IP:122.127.xxx.xxx 訂閱

===================引 用 ssbbs 文 章===================
在下 MDI form 的程式碼為:

var
frmMain : TfrmMain;

implementation
uses cut;

procedure TfrmMain.Csutomer1Click(Sender: TObject);
begin
frmCut := TfrmCut.Create(frmMain);
frmCut.Show;
end;

MDIChild 程式碼如下:

var frmCut: TfrmCut;
implementation

procedure TfrmCut.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
frmCut := NIL; {這行拿掉可以嗎}
end;

procedure TfrmCut.ToolButton5Click(Sender: TObject);
begin
frmCut.Close;
end;




這個 MDIChild -> frmCut 連續開兩次,
關閉第一次開啟的沒問題,
關閉第二次開啟的就會出現如下訊息:
錯誤訊息
------
努力會更接近成功
ssbbs
一般會員


發表:3
回覆:10
積分:2
註冊:2008-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-01-24 23:59:18 IP:203.70.xxx.xxx 訂閱
試過了,一樣會出現紅色框框...

===================引 用 pceyes 文 章===================
procedure TfrmCut.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
frmCut := NIL; {這行拿掉可以嗎}
end;

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-01-25 09:46:27 IP:61.64.xxx.xxx 訂閱
問題在你建立的 TfrmMain ,上面的都西,有程式上的邏輯錯誤

===================引 用 ssbbs 文 章===================
在下 MDI form 的程式碼為:

var
frmMain : TfrmMain;

implementation
uses cut;

procedure TfrmMain.Csutomer1Click(Sender: TObject);
begin
frmCut := TfrmCut.Create(frmMain);
frmCut.Show;
end;

MDIChild 程式碼如下:

var frmCut: TfrmCut;
implementation

procedure TfrmCut.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
frmCut := NIL;
end;

procedure TfrmCut.ToolButton5Click(Sender: TObject);
begin
frmCut.Close;
end;



這個 MDIChild -> frmCut 連續開兩次,
關閉第一次開啟的沒問題,
關閉第二次開啟的就會出現如下訊息:
錯誤訊息
ssbbs
一般會員


發表:3
回覆:10
積分:2
註冊:2008-01-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-01-25 09:56:06 IP:203.70.xxx.xxx 訂閱
我附上這兩支單元的 source, 可否請你幫忙看一下是哪裡錯誤了?
www4.zzz.com.tw/dkdl.rar

===================引 用 syntax 文 章===================
問題在你建立的 TfrmMain ,上面的都西,有程式上的邏輯錯誤
ssbbs
一般會員


發表:3
回覆:10
積分:2
註冊:2008-01-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-01-25 11:24:13 IP:203.70.xxx.xxx 訂閱
一直找不出問題,後來乾脆整個專案重新做過,就沒這個問題了...
yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-01-29 16:53:00 IP:60.248.xxx.xxx 訂閱
The following codes are just for your reference.
既然要設成自動釋放(caFree), 可以with的方式避開變數的設定, 如此一來, 開幾個Child Form都沒有問題。

[code delphi]
procedure TfrmMain.Csutomer1Click(Sender: TObject);
begin
with TfrmCut.Create(Owner) do begin
// 如果需要做Child form的設定, 則寫在這裡...
Show;
end;
end;

MDIChild 程式碼如下:

procedure TfrmCut.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

[/code]
ssbbs
一般會員


發表:3
回覆:10
積分:2
註冊:2008-01-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-01-29 18:55:32 IP:203.70.xxx.xxx 訂閱
咦?我不是已經結案了嗎?怎麼還能回覆呢?
不過,這個問題,最後我找出解決方法,
那就是在 MDIChild 中要關閉 form,
不能用 frmxxx.Close;
否則就會像我的情形一樣,
要改為: Close;
或是: Self.Close; 才能避免這個問題發生.
因為在 MDI 運作下,frmxxx 不一定還是原來的 frmxxx ...
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-02-19 23:02:55 IP:124.10.xxx.xxx 訂閱
MDI child 中要避免誤用 frmXXX.Close 最好的辦法,就是把自動產生的

var
frmXXX: Tfrmxxx;

這一段刪除

KTop 的「結案」代表發問人得到了滿意答覆,不代表不可以繼續回覆
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2024-05-14 0:00:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!