右上方的縮小、放大、關閉,不見了 |
尚未結案
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
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 發送簡訊給我 |
phorn您好
既然副程式沒有Form,那它是一個怎樣的class呢?
因為Form這個class所定義的建構子
__fastcall TForm1(TComponent* Owner);
必須傳入一個符合TComponent型態的指標,也就是VCL元件型態...
如果您副程式所定義的class不是這種型態就會有問題...
建議您改成這樣試試看 TForm *Form2 = new TForm(Application); 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
引言: 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 發送簡訊給我 |
引言: 為何改成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 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
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 ; i
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
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 ; i
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
phorn
一般會員 發表:28 回覆:60 積分:17 註冊:2004-03-03 發送簡訊給我 |
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 ; i
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
|
bass15
高階會員 發表:24 回覆:171 積分:119 註冊:2003-10-27 發送簡訊給我 |
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 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
phorn您好
引言: 那我想再問最後一個問題 那就是您為什麼可以這麼強ㄚ有秘方嗎呃...請別這麼說,會笑掉這裡很多大大的牙齒的< > 其實只是我比您早遇過這些問題而已... 何況我也學到不少,比如您提到動態事件時,我也愣住了< > 這時候趕快從K.TOP搜尋"動態事件",才解決了這個問題... 我想學程式沒有捷徑,也是多看多學多聽而已... 有這樣一個好的討論環境,讓我們有彼此教學相長的機會, 這都要感謝站長及眾位版主辛勞無私的付出... 空閒時多上來看看一些問題及答覆,大大們發表的作品等等, 都是很有幫助的 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |