判別子視窗存在? |
尚未結案
|
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
試試看吧
procedure TForm1.Button1Click(Sender: TObject); begin // Form2 不存在則建立一個 If Not Assigned(Form2) Then Form2 := TForm2.Create(Application); // 如果最小化則給它還原 If Form2.WindowState = wsMinimized Then Form2.WindowState = wsNormal ; // 如果隱藏則讓它顯示 If Not Form2.Visible Then Form2.Show; // 移到最上層 Form2.BringToFront; end;不好意思! 沒看清楚 這是BCB的版面 BCB 我沒學過 發表人 - chance36 於 2004/02/09 19:28:13 |
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
引言: 試試看吧我試過了,好像 BCB 沒有 Assigned 這個函數?? 下面這一行是錯誤的. if( !Assigned(Form2) ) Form2= new TForm2(Application ); 下面這個方式也是危險性的錯誤 if( Form2 == NULL ) Form2= new TForm2(Application ); 當 Form2曾被建立且關閉後,被關閉後,重跑一次該段程式碼, 系統會以為 Form2 是存在的,而忽略這一段建構碼. 發表人 - 海星 於 2004/02/10 03:46:26procedure TForm1.Button1Click(Sender: TObject); begin // Form2 不存在則建立一個 If Not Assigned(Form2) Then Form2 := TForm2.Create(Application); end;不好意思! 沒看清楚 這是BCB的版面 BCB 我沒學過 |
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
海星您好:
小弟試過這段碼不會發生您說的問題耶,基本上Form2被關閉時指標也被清掉了...
小弟做法如下:
void __fastcall TForm1::Button1Click(TObject *Sender) { if (Form2) { Form2->Show(); if (Form2->WindowState == wsMinimized) Form2->WindowState = wsNormal; Form2->SetFocus(); } else { Form2 = new TForm2(Application); Form2->Show(); } }如有錯誤請指正 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
引言: 海星您好: 小弟試過這段碼不會發生您說的問題耶,基本上Form2被關閉時指標也被清掉了... 小弟做法如下:void __fastcall TForm1::Button1Click(TObject *Sender) { if (Form2) { Form2->Show(); if (Form2->WindowState == wsMinimized) Form2->WindowState = wsNormal; Form2->SetFocus(); } else { Form2 = new TForm2(Application); Form2->Show(); } }如有錯誤請指正 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ >>< face="Verdana, Arial, Helvetica"> 你這一段不會發生問題的主要原因是,你只是把 Form2 Close(), 並沒有真正做 delete Form2; 的動作,所以 Form2還是霸佔該處記憶體, 當然不會有問題,你再加上下面這一段程式碼,再重新執行你的程式, 你就知道結果如何了。 void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; } |
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
海星您好:
引言: 你這一段不會發生問題的主要原因是,你只是把 Form2 Close(), 並沒有真正做 delete Form2; 的動作,所以 Form2還是霸佔該處記憶體, 當然不會有問題,你再加上下面這一段程式碼,再重新執行你的程式, 你就知道結果如何了。 void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; Form2 = NULL; }加了這行程式,果然發生記憶體存取錯誤問題,trace結果發現caFree釋放記憶體, 卻沒有將Form2這個指標指向NULL,導致Form1誤判, 因此只要加了紅色這行就可以囉< > 不知這是不是您要的< > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action) { Action = caFree; Form2 = NULL; }這一段程式碼會不會有問題?? 雖然執行起來,系統不會當機, 但 因為 Form2 = NULL 這一行是寫在 Form2 的函數內,當 Form2 真的被釋放了,怎麼可能還可以繼續跑後續的程式碼?? 如果BCB的架構是把整段程式碼全部跑完,最後才來釋放記憶體, 那這一段程式碼更是千錯萬錯,因為你已經把Form2 的指標改到 NULL 這個位置了,也就是說,Form2根本不會被銷毀,還是在某 個不知位置的記憶體內,你釋放的是 NULL 這個位置的記憶體, 意思也就是說什麼動作根本都沒做,所以你也不會當機。 以上看法有錯,有請指正。 |
CuteBabyBoy
初階會員 發表:18 回覆:97 積分:48 註冊:2003-07-11 發送簡訊給我 |
|
海星
高階會員 發表:41 回覆:217 積分:106 註冊:2003-01-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |