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

判別子視窗存在?

尚未結案
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-09 18:37:42 IP:211.74.xxx.xxx 未訂閱
問一個很笨的問題,請問一下要如何判別子視窗已經存在? 如果子視窗(Form2)處在縮小狀態,或者被主視窗蓋住, 那就會秀出原來的子視窗,如果這個子視窗不存在, 那就 new 一個 Form2 出來. 發表人 - taishyang 於 2004/02/09 20:19:49
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-09 19:25:18 IP:211.20.xxx.xxx 未訂閱
試試看吧    
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-10 03:44:48 IP:211.74.xxx.xxx 未訂閱
引言: 試試看吧
procedure TForm1.Button1Click(Sender: TObject);
begin
  // Form2 不存在則建立一個
  If Not Assigned(Form2) Then
    Form2 := TForm2.Create(Application);    end;
不好意思! 沒看清楚 這是BCB的版面 BCB 我沒學過
我試過了,好像 BCB 沒有 Assigned 這個函數?? 下面這一行是錯誤的. if( !Assigned(Form2) ) Form2= new TForm2(Application ); 下面這個方式也是危險性的錯誤 if( Form2 == NULL ) Form2= new TForm2(Application ); 當 Form2曾被建立且關閉後,被關閉後,重跑一次該段程式碼, 系統會以為 Form2 是存在的,而忽略這一段建構碼. 發表人 - 海星 於 2004/02/10 03:46:26
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-10 08:51:33 IP:210.243.xxx.xxx 未訂閱
海星您好: 小弟試過這段碼不會發生您說的問題耶,基本上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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-10 09:22:23 IP:61.218.xxx.xxx 未訂閱
引言: 海星您好: 小弟試過這段碼不會發生您說的問題耶,基本上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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-11 08:49:57 IP:210.243.xxx.xxx 未訂閱
海星您好:  
引言: 你這一段不會發生問題的主要原因是,你只是把 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-11 09:06:07 IP:61.218.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-13 17:27:43 IP:218.167.xxx.xxx 未訂閱
Dear All    如果是我,我會直接用 FindWindow     
if(FindWindow(NULL,"File_Caption"))
        ShowMessage("ok");
 
Baby
海星
高階會員


發表:41
回覆:217
積分:106
註冊:2003-01-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-13 18:39:37 IP:211.74.xxx.xxx 未訂閱
引言: Dear All 如果是我,我會直接用 FindWindow
if(FindWindow(NULL,"File_Caption"))
        ShowMessage("ok");
 
Baby
高招!! 沒想到還有這招可以使用!! 我比較笨,還去寫一個陣列去儲存現在有沒有子視窗存在, 有的話就開啟,沒有的話就去新增子視窗,程序較繁雜,每個子視窗關閉前, 還要去修改這個陣列的狀態,真是沒效率, 還是你這招棒!!
系統時間:2024-07-01 16:23:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!