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

元件在自訂函式中無法使用

答題得分者是:herbert2
maplefog
一般會員


發表:16
回覆:24
積分:13
註冊:2008-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-08 16:18:24 IP:140.118.xxx.xxx 訂閱
在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]
編輯記錄
maplefog 重新編輯於 2008-11-08 16:23:00, 註解 無‧
maplefog 重新編輯於 2008-11-08 19:40:59, 註解 無‧
herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-08 19:11:04 IP:211.72.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-08 19:38:56 IP:140.118.xxx.xxx 訂閱
我重新改了一下程式碼

程式碼可以執行了,但是我按了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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-08 20:07:35 IP:211.72.xxx.xxx 訂閱
您的 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-08 20:10:37 IP:59.112.xxx.xxx 訂閱
你的寫法非常的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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-08 21:06:33 IP:140.118.xxx.xxx 訂閱
感謝二位的幫忙

我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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-10 08:02:45 IP:59.125.xxx.xxx 訂閱
 為什麼要多那一行?大大講解一下吧!感謝你

===================引 用 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-11 08:26:32 IP:122.120.xxx.xxx 訂閱
先補充一下提問者最後的程式問題(如果結案後還有回來看,就注意一下)

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
編輯記錄
aftcast 重新編輯於 2008-11-11 08:44:03, 註解 無‧
aftcast 重新編輯於 2008-11-11 09:01:29, 註解 無‧
aftcast 重新編輯於 2008-11-11 09:04:52, 註解 無‧
系統時間:2024-05-07 17:45:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!