元件在自訂函式中無法使用 |
答題得分者是:herbert2
|
maplefog
一般會員 發表:16 回覆:24 積分:13 註冊:2008-11-08 發送簡訊給我 |
在buttonclick裡面,我自己寫了一個function
function會用到StringGrid元件,但是會出現未定義的錯誤,如右所示:Undefined symbol 'StringGrid1' 請問要怎麼定義,function才會知道StringGrid這個元件,謝謝 以下為程式碼: [code cpp] void __fastcall TForm1::Button3Click(TObject *Sender) { void functiona(); } //--------------------------------------------------------------------------- void functiona() { int data[]={1,2,3,4,5,6,7,8,9}; int n=0; for(int i=1;i<=3;i ) for(int j=1;j<=3;j ) { StringGrid1->Cells[i][j]=data[n]; n =1; } } [/code] |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
===================引 用 maplefog 文 章=================== 在buttonclick裡面,我自己寫了一個function function會用到StringGrid元件,但是會出現未定義的錯誤,如右所示:Undefined symbol 'StringGrid1' 請問要怎麼定義,function才會知道StringGrid這個元件,謝謝 以下為程式碼: [code cpp] void __fastcall TForm1::Button3Click(TObject *Sender) { void functiona(); } //--------------------------------------------------------------------------- void functiona() { int data[]={1,2,3,4,5,6,7,8,9}; int n=0; for(int i=1;i<=3;i ) for(int j=1;j<=3;j ) { StringGrid1=TForm1; // 您的 TStringGrid 怎麼會是 TForm ? StringGrid1->Cells[i][j]=data[n]; n =1; } } [/code] |
maplefog
一般會員 發表:16 回覆:24 積分:13 註冊:2008-11-08 發送簡訊給我 |
我重新改了一下程式碼
程式碼可以執行了,但是我按了button但是沒有反應,好像沒有執行到function? [code cpp] void __fastcall TForm1::Button3Click(TObject *Sender) { void functiona(); } //--------------------------------------------------------------------------- void functiona() { int data[]={1,2,3,4,5,6,7,8,9}; int n=0; for(int i=1;i<=3;i ) for(int j=1;j<=3;j ) { Form1->StringGrid1->Cells[i][j]=data[n]; n =1; } } [/code] |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
您的 void functiona() 與 Form1 不屬於同一個 Form 嗎?
為何不是 "void __fastcall TForm1::functiona()" ? 填完後加 Application->ProcessMessages(); 讓畫面更新一下應就 OK. 若擔心 functiona() 未啟動, 在 functiona() 首句加: ShowMessage("Start"); 便可 Check.
編輯記錄
herbert2 重新編輯於 2008-11-08 20:10:24, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你的寫法非常的c語言。
1/ 建議你把functiona改成 TForm1裡面的一個法方menthod,這樣與vcl物件導向較配! 2/ 若你不想改,那你的程式碼就要改成 void __fastcall TForm1::Button3Click(TObject *Sender) { void functiona(); void functiona(); // 要多這一行,你知道為什麼嗎? 是個很重要的概念,你先想想吧~~好題目喔 } ===================引 用 maplefog 文 章=================== 我重新改了一下程式碼 程式碼可以執行了,但是我按了button但是沒有反應,好像沒有執行到function? [code cpp] void __fastcall TForm1::Button3Click(TObject *Sender) { void functiona(); } //--------------------------------------------------------------------------- void functiona() { int data[]={1,2,3,4,5,6,7,8,9}; int n=0; for(int i=1;i<=3;i ) for(int j=1;j<=3;j ) { Form1->StringGrid1->Cells[i][j]=data[n]; n =1; } } [/code]
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
maplefog
一般會員 發表:16 回覆:24 積分:13 註冊:2008-11-08 發送簡訊給我 |
感謝二位的幫忙
我C寫的比較習慣,C 都不會了 把function改成TForm1的method,就可以顯示了,再次感謝 以下為最後結果 [code cpp] void __fastcall TForm1::Button3Click(TObject *Sender) { //ShowMessage("Start"); functiona(); //Application->ProcessMessages(); } //--------------------------------------------------------------------------- void __fastcall TForm1::functiona() { int data[]={1,2,3,4,5,6,7,8,9}; int n=0; for(int i=1;i<=3;i ) for(int j=1;j<=3;j ) { Form1->StringGrid1->Cells[i][j]=data[n]; n =1; } } [/code] |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
為什麼要多那一行?大大講解一下吧!感謝你
===================引 用 aftcast 文 章=================== 你的寫法非常的c語言。 1/ 建議你把functiona改成 TForm1裡面的一個法方menthod,這樣與vcl物件導向較配! 2/ 若你不想改,那你的程式碼就要改成 void __fastcall TForm1::Button3Click(TObject *Sender) { void functiona(); void functiona(); // 要多這一行,你知道為什麼嗎? 是個很重要的概念,你先想想吧~~好題目喔 } ===================引 用 maplefog 文 章=================== 我重新改了一下程式碼 程式碼可以執行了,但是我按了button但是沒有反應,好像沒有執行到function? [code cpp] void __fastcall TForm1::Button3Click(TObject *Sender) { void functiona(); } //--------------------------------------------------------------------------- void functiona() { int data[]={1,2,3,4,5,6,7,8,9}; int n=0; for(int i=1;i<=3;i ) for(int j=1;j<=3;j ) { Form1->StringGrid1->Cells[i][j]=data[n]; n =1; } } [/code] |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
先補充一下提問者最後的程式問題(如果結案後還有回來看,就注意一下)
void __fastcall TForm1::functiona() { int data[]={1,2,3,4,5,6,7,8,9}; int n=0; for(int i=1;i<=3;i ) for(int j=1;j<=3;j ) { Form1->StringGrid1->Cells[i][j]=data[n]; //在方法裡使用全域的變數Form1是非常非常不好的! 或說是"錯"的觀念 //你可以用this->StringGrid1->Cells[i][j]=data[n]; 或是StringGrid1->Cells[i][j]=data[n]; // 想想你此時在定義TForm1時,Form1這個實體都還沒出生,沒出生你就用? 要說的很清楚需要寫更多的文,這和先有雞先有蛋的想法是一樣的 // 你可以做一個實驗,照你現在的做法,然後把unit1.cpp 裡的TForm1 *Form1; 這行刪了,你的程式就錯了。 //但若改成this->StringGrid1->Cells[i][j]=data[n]; 或是StringGrid1->Cells[i][j]=data[n]; //刪了那行也是沒有關係 //此外,當你若動態的 create form,比如 TForm1 *testForm = new TForm1(0); //testForm->Position = poScreenCenter; testForm->Show(); //也會出錯 n =1; } } syntax兄你太客氣了,我都不好意思 ,不過只好回囉! (是不是考我啊?) void functiona(); //這一行宣告 (void) functiona(); // 這行才是執行程式…上篇我筆誤沒加上( ) 補充: function(不是menthod喔)其實就是一種全域變數,任何的地方可以使用它,但用它之前要先宣告或是定義,這與全域變數都是一樣的! 在類別裡,當然也可以隨時使用函數。但以此例來說,我看到他的函數宣告才能使用。 而提問者原來就單寫一行 void functiona(); //這是宣告而不是執行 當然不會有任何的動作! 我而請他加入 (void) functiona(); 才是真的有執行! 此外,還有三個重點: 1/ (void) functiona(); 的這種寫法是最標準的ANSI C寫法。在不標準的c語法或是c 中,其實都是寫成 functiona(); 2/ 其實我講到函數也是全域變數時,也代表 extern void functiona(); //這樣宣告也是對的,就如同extern int a 一樣 然而,一般的情形要,函數的宣告是不加extern的。因為沒有一個函數是非全域的 所以預設就是extern,寫了只是多寫! (有加static時是全域但限在單一檔案可用) 3/ 在函數中若要使用類別的東西,當然也只能靠一個全域的class instance來間作操作類別的資料,以此例來說就是Form1這個instance。 ===================引 用 syntax 文 章=================== 為什麼要多那一行?大大講解一下吧!感謝你
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |