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

右上方的縮小、放大、關閉,不見了

尚未結案
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-29 23:40:19 IP:203.70.xxx.xxx 未訂閱
請問一下: 我有兩個.CPP檔,一個放主程式,另一個放副程式 各以動態產生一個Form,此時寫在副程式裡所產生的Form 右上方的縮小、放大、關閉,都不見了 之後我發現將 TForm *Form2=new TForm(this); 改成 TForm *Form2=new TForm(Form1); 就又正常了...請問一下這是什麼原因ㄚ...一定要改Form1嗎? 如果Form1是各未知的Form時我該怎麼寫ㄋ?? 請大大替我解惑...謝謝!!
ENIX007
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-30 08:55:21 IP:203.70.xxx.xxx 未訂閱
phorn您好 可以請您Post程式碼嗎? 按照您這個new的方式,產生的Form是個連Caption都沒有的Form喔... 不過右上角那幾個icon還是有的... 我一開始看成Form2是Builder提供的那個全域指標 不過那應該是寫成 > 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-30 09:40:54 IP:203.70.xxx.xxx 未訂閱
ENIX007您好 對於你的說明我不太了解,不好意思可能我不太會表達吧! 那我再說明一次我的問題 我有兩個.CPP檔,一個放主程式,另一個放副程式 主程式有Form 副程式沒有Form ,副程式只放一些函式 然後我寫在副程式裡的函數想產生一個動態的Form 結果右上方的縮小、放大、關閉,都不見了,連Caption都沒有 那時是寫這樣 TForm *Form2=new TForm(this); 後來改做這樣 TForm *Form2=new TForm(Form1); 就又正常了...請問一下這是什麼原因ㄚ...一定要改Form1嗎? 因為寫在副程式裡是方便以後可能讓被別的程式使用 這樣一來Form1就是個未知的Form 那請問一下這時我該怎麼寫ㄋ??    希望這次比較詳細 謝謝!!
ENIX007
高階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-30 10:55:59 IP:203.70.xxx.xxx 未訂閱
phorn您好 既然副程式沒有Form,那它是一個怎樣的class呢? 因為Form這個class所定義的建構子 __fastcall TForm1(TComponent* Owner); 必須傳入一個符合TComponent型態的指標,也就是VCL元件型態... 如果您副程式所定義的class不是這種型態就會有問題... 建議您改成這樣試試看 TForm *Form2 = new TForm(Application); 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-30 17:15:25 IP:210.244.xxx.xxx 未訂閱
引言: phorn您好 既然副程式沒有Form,那它是一個怎樣的class呢? 因為Form這個class所定義的建構子 __fastcall TForm1(TComponent* Owner); 必須傳入一個符合TComponent型態的指標,也就是VCL元件型態... 如果您副程式所定義的class不是這種型態就會有問題... 建議您改成這樣試試看 TForm *Form2 = new TForm(Application); 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
ENIX007您好 我的問題在您英明的建議之下終於解決了 在此先跟你說聲謝謝... 由於我是 >
ENIX007
高階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-30 18:16:01 IP:203.70.xxx.xxx 未訂閱
引言: 為何改成Application就可以了ㄋ 他的涵義代表著什麼ㄋ??
phorn您好 Application就是整個應用程式的核心部分,您可以從Project->View Source 找到它,如果您用過VC 寫過視窗程式的話,建立視窗的基本程序,如註冊視窗, 建立訊息迴圈等等...這些Builder都幫我們包好成這個物件了 TForm物件建構時必須傳入建立這個物件的"擁有者",一般例如在Form1要建立 一個Form,如
 void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TForm *form = new TForm(this);
}
此時this指的就是TForm1這個class的實體物件Form1... 因此new出來的form它的擁有者就是Form1... 由於您要產生form的class不見得是一個VCL物件,因此只能指定該form的 擁有者是這個應用程式的初始物件TApplication...
引言: 再來就是如果我將 new 出來的Form點選右上角X關掉 那他只算是隱藏而已嗎?
是的,因為是new出來的,必須呼叫delete來釋放它
引言: 那如果要將他完全消除(連記憶體也一並)那該如何做ㄋ? 譬如我一直產生3個新的Form 如:A B C 那我想按A的X消除關閉A、B的X消除關閉B、C的X消除關閉C
就是使用delete,一般我的做法是,開一個TForm的陣列指標,紀錄被new 出來的form的位址,form的Tag變數(給使用者存東西用的)當索引,這樣 不論是要操作哪一個form,或者釋放它,都很方便... h檔 TForm *formarray[10]; int index; cpp檔 index=0; TForm *form = new TForm(Application); formarray[index] = form; form->Tag = index; index ; 這樣就能知道每一個form確實存在的位址了... 以上說明如果有不對的地方,請各位大大指正 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-30 22:50:45 IP:211.74.xxx.xxx 未訂閱
ENIX007您好 您解說的很詳細,可以說把我提到的問題通通都解決了! 謝謝您.... 但是這裡我覺得怪怪的formarray[index]不就每次都是formarray[0]了
引言: cpp檔 index=0; TForm *form = new TForm(Application); formarray[index] = form; form->Tag = index; index ;
還有...不好意思我又多一個問題出來 那就是由於我的
ENIX007
高階會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-31 10:31:50 IP:218.164.xxx.xxx 未訂閱
phorn您好 不好意思,那是小弟開會前寫的,只是寫個大概... 以下程式應該能解決您的疑惑 < class="code"> H檔 class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations int index; TForm *formarray[10]; public: // User declarations __fastcall TForm1(TComponent* Owner); void __fastcall CloseFunc(TObject* Sender, TCloseAction &Action); void __fastcall ArrangeArray(int which); }; CPP檔 void __fastcall TForm1::ArrangeArray(int which) {//管理陣列,將執行關閉之後的form往前一個位置存取 for (int i=which ; iCaption = formarray[i]->Caption.ToInt()-1; } formarray[index] = NULL; } //--------------------------------------------------------------------------- void __fastcall TForm1::CloseFunc(TObject* Sender, TCloseAction &Action) { int which = ((TForm *)Sender)->Caption.ToInt(); //由Sender得知哪個form關閉 delete formarray[which]; formarray[which] = NULL; index--; ArrangeArray(which); } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { index = 0; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { formarray[index] = new TForm(Application); formarray[index]->OnClose = CloseFunc; //動態事件 formarray[index]->Caption = index; //由Caption得知該form位於陣列的位置 formarray[index]->Show(); index ; } form上只有一個按鈕,每按一下產生一個form... 我故意把該form於陣列中的位置存在Caption,這樣比較容易看... 一般是存在Tag屬性... 以上...有問題再討論 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-31 23:21:11 IP:211.74.xxx.xxx 未訂閱
ENIX007您好 您寫的程式很好沒有問題...非常感謝您的熱心教導 我現在知道了原來動態事件不是宣告在 __published:        // IDE-managed Components 裡!之前還以為事件都要宣告在這裡...< > 還有原來 > 那我想在請教您一些問題< >< >< > 問題就是如果我不知道我的 > 又要麻煩你教導了~~謝謝!!
ENIX007
高階會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-01 10:54:59 IP:218.172.xxx.xxx 未訂閱
phorn您好  
引言: 還有原來Tag屬性的功用是在放form於陣列中位置的ㄚ
也不是這樣說耶...Tag應該說是Builder提供方便程式師存取任意32Bits的值... 比如指標,參考等等也都可以(詳見BCB Help)
引言:問題就是如果我不知道我的Form會開機個,那我該如何宣告陣列變數呢? 如果宣告過多那會浪費記憶體嗎? 可以開一個宣告一個..開兩個宣告兩個...依此類推... 程式可以這樣寫嗎?
關於這點小弟是覺得應該還好,因為陣列裡放的只是指標,況且應該也能預估 使用者最多會開幾個...了不起就宣告255吧 如果要改成動態管理記憶體也行,使用 class="code"> H檔 class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private: // User declarations int index; TList *formlist; public: // User declarations __fastcall TForm1(TComponent* Owner); void __fastcall CloseFunc(TObject* Sender, TCloseAction &Action); void __fastcall ArrangeArray(int which); }; CPP檔 void __fastcall TForm1::ArrangeArray(int which) {//管理陣列,將執行關閉之後的form往前一個位置存取 for (int i=which ; iItems[i])->Caption = ((TForm *)formlist->Items[i])->Caption.ToInt()-1; } //--------------------------------------------------------------------------- void __fastcall TForm1::CloseFunc(TObject* Sender, TCloseAction &Action) { int which = ((TForm *)Sender)->Caption.ToInt(); //由Sender得知哪個form關閉 delete (TForm *)formlist->Items[which]; formlist->Delete(which); index--; ArrangeArray(which); } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { index = 0; formlist = new TList; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TForm *form = new TForm(Application); formlist->Add(form); form->OnClose = CloseFunc; //動態事件 form->Caption = index; //由Caption得知該form位於陣列的位置 form->Show(); index ; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { delete formlist; } 紅色部分是與陣列宣告及使用上不同之處,參考看看 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-02 02:00:00 IP:203.70.xxx.xxx 未訂閱
ENIX007您好 經過你的一番教導後我的程式已經大致上完成了... 可是我又延伸出一些小問題...想在請教您 希望您別介意.. >
ENIX007
高階會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-02 08:59:04 IP:203.70.xxx.xxx 未訂閱
phorn您好 1.您所謂動態元件是用new來產生的嗎?只要是new產生的,就一定要呼叫delete 來釋放它... 2.寫成一個函式的意思是???基本上小弟的程式只有ButtonClick()那幾行... 動態事件本來就必須獨立出來,至於ArrangeArray()要把它併入CloseFunc() 也行... 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-08-02 10:55:51 IP:203.70.xxx.xxx 未訂閱
ENIX007您好 為什麼我照之前的方法,來釋放其他動態的元件,會出現錯誤ㄚ 紅色部分是我增加的,能麻煩你幫我看錯在哪嗎?謝謝!! H檔 class TForm1 : public TForm { __published:        // IDE-managed Components     TButton *Button1;   void __fastcall Button1Click(TObject *Sender);   void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private:        // User declarations     int index;     TList *formlist;     TList *GaryChartList; TList *SeriesList; public: // User declarations __fastcall TForm1(TComponent* Owner); void __fastcall CloseFunc(TObject* Sender, TCloseAction &Action); void __fastcall ArrangeArray(int which); }; CPP檔 void __fastcall TForm1::ArrangeArray(int which) {//管理陣列,將執行關閉之後的form往前一個位置存取 for (int i=which ; iItems[i])->Caption = ((TForm *)formlist->Items[i])->Caption.ToInt()-1; } } //--------------------------------------------------------------------------- void __fastcall TForm1::CloseFunc(TObject* Sender, TCloseAction &Action) { int which = ((TForm *)Sender)->Caption.ToInt(); //由Sender得知哪個form關閉 delete (TForm *)formlist->Items[which]; formlist->Delete(which); delete (TChart *)GaryChartList->Items[which];//這一行就出現錯誤了 GaryChartList->Delete(which); delete (TBarSeries *)SeriesList->Items[which]; SeriesList->Delete(which); index--; ArrangeArray(which); } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { index = 0; formlist = new TList; GaryChartList = new TList; SeriesList = new TList; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TForm *form = new TForm(Application); formlist->Add(form); form->OnClose = CloseFunc; //動態事件 form->Caption = index; //由Caption得知該form位於陣列的位置 form->Show(); TChart *GaryChart=new TChart(form); GaryChartList->Add(GaryChart); TBarSeries *Series=new TBarSeries(GaryChart); SeriesList->Add(Series); index ; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { delete formlist,GaryChartList,SeriesList; }
ENIX007
高階會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-08-02 11:09:36 IP:203.70.xxx.xxx 未訂閱
phorn您好 我想是您delete的順序錯了... 因為TBarSeries的Owner是TChart,TChart的Owner是TForm,釋放時應該是 delete TBarSeries; delete TChart; delete TForm; 請試試看,還有問題的話請說明錯誤訊息為何  程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
bass15
高階會員


發表:24
回覆:171
積分:119
註冊:2003-10-27

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-08-02 11:11:56 IP:219.84.xxx.xxx 未訂閱
void __fastcall TForm1::CloseFunc(TObject* Sender, TCloseAction &Action) {   int which = ((TForm *)Sender)->Caption.ToInt(); //由Sender得知哪個form關閉   delete (TBarSeries *)SeriesList->Items[which];   SeriesList->Delete(which);      delete (TChart *)GaryChartList->Items[which];   GaryChartList->Delete(which);      delete (TForm *)formlist->Items[which];   formlist->Delete(which);      index--;   ArrangeArray(which); } 你把delete 的順序改成上面的看看
phorn
一般會員


發表:28
回覆:60
積分:17
註冊:2004-03-03

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-08-02 11:27:49 IP:203.70.xxx.xxx 未訂閱
ENIX007您好 哈哈!!程式可以了...您真是太強了 解題效率真快...< > 多謝你這幾天的教導...ㄚ哩阿豆< > 那我想再問最後一個問題< >< > 那就是您為什麼可以這麼強ㄚ< >有秘方嗎< > bass15也謝謝你ㄚ
ENIX007
高階會員


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-08-02 12:01:53 IP:203.70.xxx.xxx 未訂閱
phorn您好  
引言: 那我想再問最後一個問題 那就是您為什麼可以這麼強ㄚ有秘方嗎
呃...請別這麼說,會笑掉這裡很多大大的牙齒的< > 其實只是我比您早遇過這些問題而已... 何況我也學到不少,比如您提到動態事件時,我也愣住了< > 這時候趕快從K.TOP搜尋"動態事件",才解決了這個問題... 我想學程式沒有捷徑,也是多看多學多聽而已... 有這樣一個好的討論環境,讓我們有彼此教學相長的機會, 這都要感謝站長及眾位版主辛勞無私的付出... 空閒時多上來看看一些問題及答覆,大大們發表的作品等等, 都是很有幫助的 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
系統時間:2024-06-28 5:32:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!