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

AnsiString 和 Label1->Caption 不同?

尚未結案
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-28 16:04:13 IP:218.160.xxx.xxx 未訂閱
Label1->Caption 也是 AnsiString,為何會有兩種結果? char *p; AnsiString ss = "AAAAA"; p = ss.c_str(); *p = 'B'; // 有效,可以把 ss 改成 "BAAAA" p = Label1->Caption.c_str(); *p = 'B'; // 無效,Label1->Caption依然是 Label1. 該如何修改才對,考慮速度,我不想用 Label1->Caption = "B...";
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-28 16:18:44 IP:221.169.xxx.xxx 未訂閱
試試看下面的程式碼吧
String ss = Lable1->Caption;
ss[1] = 'B';
ShowMessage (ss);
========================= 大家一起快樂寫程式
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-28 18:30:40 IP:218.160.xxx.xxx 未訂閱
引言: 試試看下面的程式碼吧
String ss = Lable1->Caption;
ss[1] = 'B';
ShowMessage (ss);
不好意思 lu 大大,你誤會我的意思了,我只是想把: Label1->Caption = "Label1"; 改成 Label1->Caption = "Babel1"; 但我又不想用 Label1->Caption = "B"+Label1->Caption.SubString(2,Label1->Caption.Length()-1);如此大費周章. 因為我只要改一大長串字串裡的幾個字元而己,假如用指標(char *p)去指到Label1->Caption 的字串位置,我要改哪個字元,就方便多了,不必複製整個字串,只要考慮會不會超出範圍就好了.
ubong
一般會員


發表:2
回覆:42
積分:23
註冊:2002-10-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-28 22:43:05 IP:218.163.xxx.xxx 未訂閱
char *p是C的字串,應用strcpy(p,Label1->Caption.c_str());
用p=Label1->Caption.c_str(); 是語法錯誤。
ubong
------
ubong
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-29 00:48:10 IP:218.174.xxx.xxx 未訂閱
你好! 請參考TLabel的Caption最原始的定義如下… 這一段是從TControl定義的 void __fastcall SetText(const AnsiString Value); AnsiString __fastcall GetText(); _property AnsiString Caption = {read=GetText, write=SetText, stored=IsCaptionStored}; 因此Label1->Caption.c_str()所回傳的位址,並不是直接指Label的Caption.
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-30 10:35:54 IP:61.228.xxx.xxx 未訂閱
如同liangent所說的Label1->Caption.c_str()所回傳的位址,並不是直接指向Label的Caption. 據我的了解他所回傳的是AnsiString類別中的buffer位址,所以如果你要用指標方式修改字串的話,我的做法會如下 char *p; p=Label1->Caption.c_str(); *p='B'; //or *(p ...)='B'; Label1->Caption=p;
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-04 14:04:32 IP:218.160.xxx.xxx 未訂閱
非常感謝各位大大的幫忙,問題己解決了. Label1->Caption.c_str()所回傳的位址,的確不是直接指向Label的Caption,而是WindowText,但WindowText又不能直接用,只好再多設一個ATLabel,才可把WindowText的位置傳出來.     
 
  class ATLabel : public TLabel
  {
    public:
        __fastcall ATLabel(TComponent* Owner): TLabel(Owner){};
        char *pChar()
        {
          return WindowText;
        }
  };      char *p = ((ATLabel*)Label1)->pChar();
  p[0] = 'A';
  Label1->Repaint();
ccobj
一般會員


發表:6
回覆:27
積分:21
註冊:2003-12-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-04 14:58:45 IP:218.172.xxx.xxx 未訂閱
相較之下
Label1->Caption = "B"+Label1->Caption.SubString(2,Label1->Caption.Length()-1);
不會大費周章了吧 ^^. 發表人 - ccobj 於 2005/04/04 15:18:49
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-04 19:41:49 IP:218.160.xxx.xxx 未訂閱
引言: 相較之下
Label1->Caption = "B"+Label1->Caption.SubString(2,Label1->Caption.Length()-1);
不會大費周章了吧 ^^. 發表人 - ccobj 於 2005/04/04 15:18:49
的確,1個的話是如此,但是要改10個Label,且每個要改幾個字元的時候,如第2,7,9,12的時候,就會想想其他的方法來試試.
系統時間:2024-05-19 14:19:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!