請問有關指標(^)的問題 |
答題得分者是:pedro
|
Charlies Chang
一般會員 ![]() ![]() 發表:3 回覆:9 積分:7 註冊:2003-05-09 發送簡訊給我 |
我想測試以下的功能
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 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
指標玩的上手就想一直用指標? 在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 發送簡訊給我 |
|
roviury
一般會員 ![]() ![]() 發表:3 回覆:49 積分:15 註冊:2008-08-28 發送簡訊給我 |
指針的使用是需要考慮情況的
例如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) |
Charlies Chang
一般會員 ![]() ![]() 發表:3 回覆:9 積分:7 註冊:2003-05-09 發送簡訊給我 |
最後我用這樣的方法達成原來的目標:
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, 註解 無‧ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |