?? ansistringapplicationmethod.txt
字號:
AnsiString類
VCL大量利用Pascal長字串數(shù)據(jù)類型,幾乎所有基于文本的VCL屬性都采用Pascal長字串。例如,Text、Name和Caption屬性都是Pascal長字串屬性。VCL的許多構(gòu)件方法和事件處理函數(shù)也采用Pascal長字串。
關(guān)于Pascal長字串數(shù)據(jù)類型要注意兩點。第一,Pascal長字串是真正的語言數(shù)據(jù)類型,而不象C/C++中一樣只是個字符數(shù)組。第二,C++內(nèi)部沒有Pascal長字串的對等類型。由于VCL大量使用Pascal長字串,而C++ Builder使用Pascal VCL,所以Borland生成一個C++類來近似Pascal長字串,這個類就是AnsiString類,可以代替Pascal長字串。
AnsiString類的類名不易理解,你要在SYSDEFS.H中采用如下語句:
typedef AnsiString String;這樣就可以在聲明AnsiString類的實例時用名稱String而不用正式類名AnsiString類:
由于String是AnsiString類的別名,所以不必在C++ Builder程序中再用AnsiString類名(當然,還可以這么用)。為了清晰起見,我在
文本中使用AnsiString類名,而在代碼例子中使用縮略形式String。
AnsiString類是功能很強的字串類。AnsiString類構(gòu)造器可以從Char、Char*、int或double生成AnsiString類對象。這些構(gòu)造器很容易
將直接字串賦予AnsiString類并將整數(shù)或浮點數(shù)變成字串。下列例子顯式或隱式使用AnsiString類構(gòu)造器:
String FloatString = 127.123;
String AnotherFloatString(0.999);
String IntString = 49;
String CharString = 'A';
Labell>Caption = "This is a test";
double d = 3.14 * 20;
Edit1>Text = d;
也許你對細節(jié)不感興趣,但需要直接賦值時,C++編譯器在后臺采用相應(yīng)的AnsiString構(gòu)造器。以下列語句為例:
String S = 127.123; // create an AnsiString from a double
編譯器在后臺產(chǎn)生如下語句:
String S = String((double)127.123;
因此,AnsiString構(gòu)造器在直接賦值時要進行換算。上述代碼可以工作的另一原因是AnsiString類重載了賦值操作符(=)。AnsiString還重載了接合(+操作符)和測試等式(==操作符)等操作符,從而簡化工作。AnsiString類和其它C++類一樣,有許多使字串操作更方便。
下表列出幾個最常用的AnsiString方法,如果需要AnsiString方法的完整清單,請看C++ Builder聯(lián)機幫助。
C_str 返回字串的數(shù)據(jù)的指針(char*)
Delete 刪除字串的一部分 Delete(1,2) 從第一位開始,刪除連續(xù)兩個字符
Insert 在現(xiàn)有字串的指定位置插入文本
Length 返回字串長度,不包括終止NULL
LowerCase 將字串變成小寫
Pos 返回搜索字串在字串中的位置
SubString 返回字串中從指定位置開始、指定長度的子串
ToDouble 將字串變成浮點數(shù),如果無法將字串變成浮點數(shù),則扔出異常
ToInt 將字串變成整數(shù),如果無法將字串變成整數(shù),則扔出異常
ToIntDef 將字串變成整數(shù)并在不能換算時提供缺省值而不扔出異常
Trim 刪除字串前后的空格
UpperCase 將字串變成大寫
其中幾個方法需要特別說明。一個是c_str()方法,這個奇怪的方法名用于要取得AnsiString的字串緩沖區(qū)指針時。為什么要這么干呢?有些
Windows API函數(shù)需要char*參數(shù)。AnsiString是個類,不能直接將AnsiString傳遞給需要字符數(shù)組指針的函數(shù)。例如,如果使用Windows API函數(shù)DrawText(),則要用如下代碼:
RECT R
Rect(0,0,100,20);// first,the C waychar
buff[]="This is a test";
DrawText(Canvas>Handle,buff,1,&R,DT_SINGLELINE);
// now the VCL way
String S ="This is a test";
DrawText(Canvas>Handle,S.c_str(),1,&R,DT_SINGLELINE);
DrawText()函數(shù)的第二個參數(shù)需要字串緩沖區(qū)指針,這就要靠c_str()方法提供。如果不理解,可以等以后再回頭理解。
目前不必對DrawText()太費心。這個例子說明VCL將你從WindowsAPI函數(shù)隔離開,而又還能使用Windows API函數(shù)。深入Windows編程時,有時會需要Windows API函數(shù),這時Windows API函數(shù)很有現(xiàn)成。
另一個AnsiString方法是ToInt()。這個方法將字串變成整數(shù)。假設(shè)窗體上有個編輯構(gòu)件要向用戶取整數(shù)值,由于編輯構(gòu)件只能放文本,所以需要將字串變成整數(shù)。方法如下:
int value = Edit1>Text.ToInt();
ToDouble()方法的用法也一樣。注意,如果不能換算,這兩個方法都會扔出異常。
有幾個AnsiString方法不是作用于字串本身,而是返回新的字串。以UpperCase()方法為例,可以用下列代碼將字串變成大寫嗎?
String FileName = "c:\mystuff\mydata.dat";
FileName.UpperCase();
不可以,因為UpperCase()方法返回新字串,而不是作用于字串本身。正確的方法如下:
FileName= FileName.UpperCase();
使用AnsiString方法前,先從聯(lián)機幫助看看這些方法如何操作。另外,記住雙反斜杠。另一個AnsiString方法是我所不喜歡的,F(xiàn)ormat()方法可以象Sprintf()函數(shù)一樣用變量建立字串。
Sprintf()函數(shù)的例子:
char buff[20];
int x = 10 * 20;
sprintf(buff, "The result is: %d",x);
這個代碼建立內(nèi)容為"The result is:200"的字串。
這個工作也可以用AnsiString方法Format()完成:
String s;
int x = 10 * 20;
S = S.Format( "The result is: %d",OPENARRAY(TVarRec,(x)));
夠難看的。這個函數(shù)有其存在的原因,但我從來不用Format()方法,一個原因是我記不住這古怪的語法,另一原因是Sprintf()函數(shù)更方便。AnsiString格式化的方法如下:
int x = 10 * 20;
char buff[20];
sprintf(buff, "The result is: %d",x);
String S= buff;
顯然,這個方法并不優(yōu)雅,但Format()也好不到哪里,讀者可以自選其中一個方法。
AnsiString類還一個怪事值得一提。索引操作符([])可以引用字串的特定元素:
String S = "Hello World!";
Label1>Caption = S[7];
這個代碼將字符W賦予標題構(gòu)件的Caption屬性。這里要指出的是,字串的第一個元素在數(shù)組索引1處,而不象其它C++數(shù)組一樣在數(shù)組索引0處.基數(shù)為1的索引主要是為了與Delphi兼容。這一次也許會讓C++編程老手頭痛一陣子.
AnsiString類是BCB中最常見類之一,了解它對以后深入學(xué)習(xí)BCB大有幫助原來關(guān)于這個類的提出的問題有很多,現(xiàn)總結(jié)如下。加上我個人的經(jīng)驗,湊出了一篇關(guān)于這個類的最常用方法屬性的介紹,希望能對各位有所幫助
常用方法:
1. char* c_str()
返回一個字符串指針,他指向的內(nèi)容和AnsiString中包含的字符串的內(nèi)容一致(BCB幫助中就是是這樣解釋這個方法的,關(guān)于它更詳細的討論見后文)
Example:
AnsiString str = "Hello World!";
MessageBox(NULL,str.c_str(),"",MB_OK); //顯示一個消息框
2.AnsiCompare(AnsiString& rhs)
operator == (AnsiString& rhs)
都用來比較兩個AnsiString的內(nèi)容是否相同,兩者的區(qū)別在于當內(nèi)容相等的時候前者返回0,而后者返回true
3.int Length()
很簡單,返回字符串長度
4.char & operator [](const int idx)
返回字符串中第idx個字符
注意:這個地方不知道BCB怎么想的,可能是為了照顧Delphi程序員的習(xí)慣吧卻給C程序員造成了一點小小的麻煩:和C中數(shù)組的用法不兼容,也就是說當idx為0的時候,BCB會拋出一個異常,而不是返回第一個字符!要得到第一個字符,idx應(yīng)該為1
Example:
AnsiString str = "Hello World!";
char byte = str[2];
//byte等于'e' 而 不等于'l'
ps.下面的介紹,只要是關(guān)于第X個字符的,都和這里一樣,不再重復(fù)
5.AnsiString SubString(int index, int count)
返回從第index個字符開始,長度為count子串
Example:
AnsiString str = "Hello World!";
MessageBox(NULL,str.SubString(7,5).c_str(),"",MB_OK); //顯示內(nèi)容為 World
6.int Pos(AnsiString& subStr)
查找內(nèi)容為subStr的字串,如果有,返回字串的第一個字符位置 如果沒有,返回0
7.int ToInt()
int ToIntDef(int defaultValue)
返回當前字符串轉(zhuǎn)化為整數(shù)的結(jié)果,不同點在于,當不能轉(zhuǎn)化時,前者拋出一個異常,而后者返回defaultValue,嘿嘿,偶喜歡后者
8.AnsiString LowerCase()
AnsiString UpperCase()
返回當前字符串轉(zhuǎn)化為小寫/大寫的結(jié)果
注意,它們只是返回一個新的AnsiString,原來字符串的內(nèi)容沒有變化
9.AnsiString& sprintf(char *, ...)
利用sprintf強大功能格式化當前字符串,詳細用法請參考sprintf或者printf
其它一些操作符:+ += >= > < <= !=
這些不用解釋了吧……
深入探討:
1.關(guān)于c_str()的返回值問題.
能否用這個返回值訪問/修改字符串中的內(nèi)容?
Example:
AnsiString a = "I want to modify this using pointer";
char *p = a.c_str();
p[0] = 'i';
........ //指針操作
ShowMessage(a);
雖然BCB的幫助表明 c_str()這個函數(shù)的返回值(char*)只在它所在表達式內(nèi)有效,
但是以上代碼有時候卻可以完成預(yù)期的目的
個人極力反對用這種方法來改變字符串的內(nèi)容,因為AnsiString自帶的方法已經(jīng)能夠十
分有效的完成指針操作
比如上面的例子中 p[0] 可以用 a[1] 來代替
合并字符串可以用 + 或者 += 來替代
還有查找,插入,刪除等,都可以在幫助中找到AnsiString類中對應(yīng)的方法來實現(xiàn)
2.Unicode的支持
由于AnsiString非模板類
除了WideChar方法外,AnsiString好像不支持Unicode
但是不知道為什么里面會有ByteType這個方法
3.很有意思的方法
Unique()
LastDelimiter()
不常用,但是我覺得是十分有意思的函數(shù)
怎么用,可以參考幫助
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -