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

請問一下位什麼mdichild 關掉後MDIChildCount沒有減掉

答題得分者是:wameng
black_eagle1028
一般會員


發表:8
回覆:7
積分:3
註冊:2007-05-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-10 12:30:47 IP:203.73.xxx.xxx 訂閱
// 檢查是否已經開啟, 如已經開啟則關閉
for i:=0 to MainForm.MDIChildCount-1 do
begin
if copy((MainForm.MDIChildren[i].Name),0,5) = 'stock' then
MainForm.MDIChildren[i].close;
end;
showmessage(inttostr(MDIChildCount));
showmessage(inttostr(MDIChildCount));

以上我我寫的程式, 目的是檢查某一個 form 是否已經開啟, 如果已經開啟則關閉

但是我卻發現子 form 關掉後 count 沒有馬上減少

上面的第一行 showmessage(inttostr(MDIChildCount)); 所顯示的數值居然跟第二行的不一樣???

請問這是什麼原因啊!!!
syntax
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-10 14:59:40 IP:61.64.xxx.xxx 訂閱
是有可能的

牽涉到多執行緒與程式執行順序

你有興趣,可以去 trace 程式,MDI在 Close 的過程中,在哪裡跳出來執行第一行 showmessage


===================引 用 black_eagle1028 文 章===================
// 檢查是否已經開啟, 如已經開啟則關閉
for i:=0 to MainForm.MDIChildCount-1 do
begin
if copy((MainForm.MDIChildren[i].Name),0,5) = 'stock' then
MainForm.MDIChildren[i].close;
end;
showmessage(inttostr(MDIChildCount));
showmessage(inttostr(MDIChildCount));

以上我我寫的程式, 目的是檢查某一個 form是否已經開啟, 如果已經開啟則關閉

但是我卻發現子 form 關掉後 count 沒有馬上減少

上面的第一行showmessage(inttostr(MDIChildCount)); 所顯示的數值居然跟第二行的不一樣???

請問這是什麼原因啊!!!
black_eagle1028
一般會員


發表:8
回覆:7
積分:3
註冊:2007-05-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-12 13:26:21 IP:218.166.xxx.xxx 訂閱
那請問一下有什麼方法可以在close 子 form 後抓取到正確的 mdichildcount 數呢?以及剩下所有開啟的 form 的 name 呢?

因為我打算要寫一個可以切換所有已經開啟的 childf form 的 button , 但是一旦有 form close 後便會抓取錯誤
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-13 11:08:16 IP:211.76.xxx.xxx 訂閱
請問你用的 Delphi 版本是 ? (請參考 [公告] 發問及回答前注意事項 )
我記得 Delphi 5, 6 (後面還有那些版本不記得了 ...)有此問題, 要修改 menus.pas

===================引 用 black_eagle1028 文 章===================
那請問一下有什麼方法可以在close 子 form 後抓取到正確的 mdichildcount 數呢?以及剩下所有開啟的 form 的 name 呢?

因為我打算要寫一個可以切換所有已經開啟的 childf form 的 button , 但是一旦有 form close 後便會抓取錯誤
------
將問題盡快結案也是一種禮貌!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-13 18:06:51 IP:59.124.xxx.xxx 未訂閱
會不會是 MDIChild Close 後但未 Free, 所以 MDIChildCount 不會有所變化
解決方式, 在 MDIChild Form 的 OnClose Event 中, 將 Action 設為 caFree 試試
black_eagle1028
一般會員


發表:8
回覆:7
積分:3
註冊:2007-05-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-13 23:01:43 IP:218.166.xxx.xxx 訂閱
每個子 form close 都有設定 cafree 耶!
black_eagle1028
一般會員


發表:8
回覆:7
積分:3
註冊:2007-05-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-13 23:03:15 IP:218.166.xxx.xxx 訂閱
我使用的是 delphi 7.0 版!請問一下如果要修改 menu.pas 要改什麼啊!
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-14 12:30:23 IP:203.79.xxx.xxx 訂閱
這個我沒有仔細看, 不知道是不是你要的 ?
http://www.stevetrefethen.com/wiki/(S(h0nejp45lrm2ghrei1fdfk45))/Default.aspx?Page=Delphi7&AspxAutoDetectCookieSupport=1

===================引 用 black_eagle1028 文 章===================
我使用的是 delphi 7.0 版!請問一下如果要修改 menu.pas 要改什麼啊!
------
將問題盡快結案也是一種禮貌!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-16 00:01:52 IP:203.79.xxx.xxx 訂閱
<textarea class="delphi" rows="10" cols="60" name="code">procedure TYourChildForm.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; </textarea>
原來已經提過了,sorry, 剛才沒看仔細.

編輯記錄
jow 重新編輯於 2007-08-16 00:05:18, 註解 無‧
jow 重新編輯於 2007-08-16 00:06:22, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-08-16 09:20:01 IP:61.222.xxx.xxx 訂閱
這是很正常的現象,沒什麼好奇怪的。

第一次ShowMessage 的值,為尚未被釋放的數量。
由於呼叫Close 會拋出 PostMessage(Handle, CM_RELEASE, 0, 0);
知道 PostMessage 吧。
因此當Showmessage 空閒時,系統會收到 CM_RELEASE 去真正釋放。

所以第二次顯示 ShowMessage 的值,就會為正確的數量。

因此在ShowMessage 若加入 Application.ProcessMessages; 當然也會得到正確的值。

black_eagle1028
一般會員


發表:8
回覆:7
積分:3
註冊:2007-05-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-08-16 10:39:39 IP:210.68.xxx.xxx 訂閱
其實 showmessage 只是我用來檢查 MDIcount 的值而已

而主要的目的是希望子 form close 後可以立即讀取到目前所剩下所有的 MDIchild 的資料

因為我想要將所有已開啟的 MDIchild 的 name 抓出來

但是程式執行時只在關閉某一個 form 後所抓取道的資料仍是未關閉前的(也就是感覺似乎還沒有關閉完全)

有試著加一行 showmessage 讓它暫停一下便可以正確的讀取到我要的資料

所以, 請問要如何在關閉 from 立即抓取剩下的 MDIchild 的正確資料呢????
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-08-16 11:23:07 IP:61.222.xxx.xxx 訂閱
  for i:=MDIChildCount-1  Downto 0 do
begin
if copy((MainForm.MDIChildren[i].Name),0,5) = 'stock' then MDIChildren[i].Free;
end;
Showmessage(inttostr(MDIChildCount));

===================引 用 black_eagle1028 文 章===================
其實 showmessage 只是我用來檢查 MDIcount 的值而已

而主要的目的是希望子 form close 後可以立即讀取到目前所剩下所有的 MDIchild 的資料

因為我想要將所有已開啟的 MDIchild 的 name 抓出來

但是程式執行時只在關閉某一個 form 後所抓取道的資料仍是未關閉前的(也就是感覺似乎還沒有關閉完全)

有試著加一行 showmessage 讓它暫停一下便可以正確的讀取到我要的資料

所以, 請問要如何在關閉 from 立即抓取剩下的 MDIchild 的正確資料呢????
編輯記錄
wameng 重新編輯於 2007-08-16 11:23:46, 註解 無‧
系統時間:2024-04-28 23:51:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!