全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5162
推到 Plurk!
推到 Facebook!

請問有關指標(^)的問題

答題得分者是:pedro
Charlies Chang
一般會員


發表:3
回覆:9
積分:7
註冊:2003-05-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-21 11:23:34 IP:220.130.xxx.xxx 訂閱
我想測試以下的功能

procedure TForm1.Button1Click(Sender: TObject);
var
p:^String;
begin
p:=@(Edit1.Text);
p^:='TTTT';
end;

但是在 compiler 時( p:=@(Edit1.Text); 這一行)會出現:
Variable required (E2036) Variable required

Delphi 的解釋是:
(E2036) This error message occurs when you try to take the address of an expression or a constant. program Produce; var ...

(Edit1.Text)被當作一個符號或常數?


其實我希望是可以定義一指標陣列
分別指向不同的字串,
例如:
edit.text
combobox.text
labeledEdit.text
StringGrid1.cell(2,3)
memo1.text
...
有没有高手試過什麼方法可逹到相近的效果?

Thanks

Charlies Chang

pedro
尊榮會員


發表:152
回覆:1177
積分:865
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-21 16:47:51 IP:60.248.xxx.xxx 未訂閱
指標玩的上手就想一直用指標? 在delphi還是用delphi的思維方式或許比較不用花太多功?

p:=@(Edit1.Text); ==>Text是Edit的property,實際上它去呼叫Set及Get method



===================引 用 Charlies Chang 文 章===================
p:^String;
begin
p:=@(Edit1.Text);
p^:='TTTT';
end;
但是在 compiler 時( p:=@(Edit1.Text); 這一行)會出現:
Variable required (E2036) Variable required
Charlies Chang
一般會員


發表:3
回覆:9
積分:7
註冊:2003-05-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-22 10:48:36 IP:220.130.xxx.xxx 訂閱
謝謝,原來如此.

Charlies Chang
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-01-13 18:20:59 IP:203.186.xxx.xxx 訂閱
指針的使用是需要考慮情況的
例如tlist就是利用pointer能"強制轉換任何類型資料"的特性把資料存放
(而且不會複製資料,以節省記憶體)
而tform,tedit這些tobject本身就是pointer
如果要記錄到tlist中,是pointer(edit1)而不是@edit1

而且@xxxx必須是一個變數 只有變數才有pointer (所以沒有@1,@2,@3,@1213,@999,因為這些不是變數)
edit1.text不是一個變數,只是一個property
edit1.text真正所指的變數才有pointer,但由於這個變數存在於私有區,所以我們不會知道,不能隨意改變(否則出現error)



定義一指標陣列
分別指向不同的字串,
例如:
edit.text
combobox.text
labeledEdit.text
StringGrid1.cell(2,3)
memo1.text

字串方面,delphi提供了一個很好的記錄方法,他簡化了tlist的操作,tstringlist使用時不會用上pointer(其實string本身就是一個pointer,是記錄字串的第一個char的pointer)

[code delphi]
var mystrs:tstringlist; //可以簡化為tstrings,是一樣的
begin
mystrs:=tstringlist.create;//這裡不可簡化為tstrings.create
//mystrs從類中變成一個實際存在的物件變數
mystrs.add(edit.text);
mystrs.add(combobox.text);
mystrs.add(labeledEdit.text);
//....
//StringGrid1.cell(2,3)好像不是這樣存取字串的...或者我記錯了
showmessage(mystrs[0]); //edit.text
showmessage(mystrs[1]); //combobox.text
tstringlist.free;//改良版的destroy,有create就要有free,避免浪費資源
end;
[/code]

當然,由於tstringlist繼承tlist,所以tlist也可以記錄string,不過是非常煩瑣,工具可以用就行了
你也可以利用array of string記錄

[code delphi]
var mystrsb:array of string;//array[0..5-1] of string也可以
begin
setlength(mystrsb,5);//要先說明你要記錄的數目,類似create
mystrsb[0]:=edit.text;
mystrsb[1]:=combobox.text;
//....
showmessage(mystrsb[0]); //edit.text
showmessage(mystrsb[1]); //combobox.text
setlength(mystrsb,0);//好像還有另一個方法free,類似destory
end;
[/code]
但是array of string一定比tstringlist麻煩
因為要先設定數量(setlength)
然後要
mystrs[0]:=
mystrs[1]:=
而tstringlist一句mystrs.add就可以

刪除: mystrs.delect(0); (刪去edit.text,而mystrs[0]會變成combobox.text)
編輯記錄
roviury 重新編輯於 2009-01-13 18:33:35, 註解 無‧
roviury 重新編輯於 2009-01-13 18:37:17, 註解 無‧
Charlies Chang
一般會員


發表:3
回覆:9
積分:7
註冊:2003-05-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-07-02 11:37:01 IP:220.130.xxx.xxx 訂閱
最後我用這樣的方法達成原來的目標:

Delphi
function TSelectForm.SetReturnValue(fdName:String;placeobj:TObject):boolean;
var
st:string;
begin
result:=true;
if not varisnull(DBGrid2.DataSource.DataSet[fdName]) then st:=DBGrid2.DataSource.DataSet[fdName] else st:='';
if placeobj.ClassNameIs('TLabeledEdit') then (placeobj as TLabeledEdit).Text:=st
else if placeobj.ClassNameIs('TEdit') then (placeobj as TEdit).Text:=st
else if placeobj.ClassNameIs('TComboBox') then (placeobj as TComboBox).Text:=st
else if placeobj.ClassNameIs('TMemo') then (placeobj as TMemo).Text:=st
else
begin
showMessage( placeobj.ClassName ' Result Fault !');
result:=false;
end;
end;
編輯記錄
Charlies Chang 重新編輯於 2009-07-02 11:38:20, 註解 無‧
Charlies Chang 重新編輯於 2009-07-02 11:39:09, 註解 無‧
Charlies Chang 重新編輯於 2009-07-02 11:39:44, 註解 無‧
系統時間:2017-10-19 2:36:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!