⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ansistringapplicationmethod.txt

📁 AnsiString的各种使用方法和详细说明
💻 TXT
字号:
AnsiString类 

VCL大量利用Pascal长字串数据类型,几乎所有基于文本的VCL属性都采用Pascal长字串。例如,Text、Name和Caption属性都是Pascal长字串属性。VCL的许多构件方法和事件处理函数也采用Pascal长字串。
关于Pascal长字串数据类型要注意两点。第一,Pascal长字串是真正的语言数据类型,而不象C/C++中一样只是个字符数组。第二,C++内部没有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类构造器可以从Char、Char*、int或double生成AnsiString类对象。这些构造器很容易
将直接字串赋予AnsiString类并将整数或浮点数变成字串。下列例子显式或隐式使用AnsiString类构造器:
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;
也许你对细节不感兴趣,但需要直接赋值时,C++编译器在后台采用相应的AnsiString构造器。以下列语句为例:
String S = 127.123; // create an AnsiString from a double
编译器在后台产生如下语句:
String S = String((double)127.123;
因此,AnsiString构造器在直接赋值时要进行换算。上述代码可以工作的另一原因是AnsiString类重载了赋值操作符(=)。AnsiString还重载了接合(+操作符)和测试等式(==操作符)等操作符,从而简化工作。AnsiString类和其它C++类一样,有许多使字串操作更方便。
下表列出几个最常用的AnsiString方法,如果需要AnsiString方法的完整清单,请看C++ Builder联机帮助。
C_str 返回字串的数据的指针(char*)
Delete 删除字串的一部分  Delete(1,2)  从第一位开始,删除连续两个字符
Insert 在现有字串的指定位置插入文本
Length 返回字串长度,不包括终止NULL
LowerCase 将字串变成小写
Pos 返回搜索字串在字串中的位置
SubString 返回字串中从指定位置开始、指定长度的子串
ToDouble 将字串变成浮点数,如果无法将字串变成浮点数,则扔出异常
ToInt 将字串变成整数,如果无法将字串变成整数,则扔出异常
ToIntDef 将字串变成整数并在不能换算时提供缺省值而不扔出异常
Trim 删除字串前后的空格
UpperCase 将字串变成大写
   其中几个方法需要特别说明。一个是c_str()方法,这个奇怪的方法名用于要取得AnsiString的字串缓冲区指针时。为什么要这么干呢?有些
Windows API函数需要char*参数。AnsiString是个类,不能直接将AnsiString传递给需要字符数组指针的函数。例如,如果使用Windows API函数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()函数的第二个参数需要字串缓冲区指针,这就要靠c_str()方法提供。如果不理解,可以等以后再回头理解。
目前不必对DrawText()太费心。这个例子说明VCL将你从WindowsAPI函数隔离开,而又还能使用Windows API函数。深入Windows编程时,有时会需要Windows API函数,这时Windows API函数很有现成。
另一个AnsiString方法是ToInt()。这个方法将字串变成整数。假设窗体上有个编辑构件要向用户取整数值,由于编辑构件只能放文本,所以需要将字串变成整数。方法如下:
int value = Edit1>Text.ToInt();
ToDouble()方法的用法也一样。注意,如果不能换算,这两个方法都会扔出异常。
有几个AnsiString方法不是作用于字串本身,而是返回新的字串。以UpperCase()方法为例,可以用下列代码将字串变成大写吗?
String FileName = "c:\mystuff\mydata.dat";
FileName.UpperCase();
不可以,因为UpperCase()方法返回新字串,而不是作用于字串本身。正确的方法如下:
FileName= FileName.UpperCase();
使用AnsiString方法前,先从联机帮助看看这些方法如何操作。另外,记住双反斜杠。另一个AnsiString方法是我所不喜欢的,Format()方法可以象Sprintf()函数一样用变量建立字串。
Sprintf()函数的例子:
char buff[20];
int x = 10 * 20;
sprintf(buff, "The result is: %d",x);
这个代码建立内容为"The result is:200"的字串。
这个工作也可以用AnsiString方法Format()完成:
String s;
int x = 10 * 20;
S = S.Format( "The result is: %d",OPENARRAY(TVarRec,(x)));
够难看的。这个函数有其存在的原因,但我从来不用Format()方法,一个原因是我记不住这古怪的语法,另一原因是Sprintf()函数更方便。AnsiString格式化的方法如下:
int x = 10 * 20;
char buff[20];
sprintf(buff, "The result is: %d",x);
String S= buff;
显然,这个方法并不优雅,但Format()也好不到哪里,读者可以自选其中一个方法。
AnsiString类还一个怪事值得一提。索引操作符([])可以引用字串的特定元素:
String S = "Hello World!";
Label1>Caption = S[7];
这个代码将字符W赋予标题构件的Caption属性。这里要指出的是,字串的第一个元素在数组索引1处,而不象其它C++数组一样在数组索引0处.基数为1的索引主要是为了与Delphi兼容。这一次也许会让C++编程老手头痛一阵子.  

AnsiString类是BCB中最常见类之一,了解它对以后深入学习BCB大有帮助原来关于这个类的提出的问题有很多,现总结如下。加上我个人的经验,凑出了一篇关于这个类的最常用方法属性的介绍,希望能对各位有所帮助

常用方法:
  1. char* c_str()
  返回一个字符串指针,他指向的内容和AnsiString中包含的字符串的内容一致(BCB帮助中就是是这样解释这个方法的,关于它更详细的讨论见后文)
  Example:
  AnsiString str = "Hello World!";
  MessageBox(NULL,str.c_str(),"",MB_OK);   //显示一个消息框

  2.AnsiCompare(AnsiString& rhs)
    operator == (AnsiString& rhs)
  都用来比较两个AnsiString的内容是否相同,两者的区别在于当内容相等的时候前者返回0,而后者返回true

  3.int Length()
  很简单,返回字符串长度

  4.char & operator [](const int idx)
   返回字符串中第idx个字符
  注意:这个地方不知道BCB怎么想的,可能是为了照顾Delphi程序员的习惯吧却给C程序员造成了一点小小的麻烦:和C中数组的用法不兼容,也就是说当idx为0的时候,BCB会抛出一个异常,而不是返回第一个字符!要得到第一个字符,idx应该为1
  Example:
  AnsiString str = "Hello World!";
  char byte = str[2];
  //byte等于'e' 而 不等于'l'
  ps.下面的介绍,只要是关于第X个字符的,都和这里一样,不再重复
    
  5.AnsiString SubString(int index, int count)
  返回从第index个字符开始,长度为count子串
  Example:
  AnsiString str = "Hello World!";
  MessageBox(NULL,str.SubString(7,5).c_str(),"",MB_OK);  //显示内容为 World

  6.int Pos(AnsiString& subStr)
  查找内容为subStr的字串,如果有,返回字串的第一个字符位置 如果没有,返回0

  7.int ToInt()
    int ToIntDef(int defaultValue)
  返回当前字符串转化为整数的结果,不同点在于,当不能转化时,前者抛出一个异常,而后者返回defaultValue,嘿嘿,偶喜欢后者

  8.AnsiString LowerCase()
    AnsiString UpperCase()
  返回当前字符串转化为小写/大写的结果
  注意,它们只是返回一个新的AnsiString,原来字符串的内容没有变化

  9.AnsiString& sprintf(char *, ...)
  利用sprintf强大功能格式化当前字符串,详细用法请参考sprintf或者printf

  其它一些操作符:+  +=  >=  >  <  <=  !=
  这些不用解释了吧……


深入探讨:

  1.关于c_str()的返回值问题.
  能否用这个返回值访问/修改字符串中的内容?
  Example:
  AnsiString a = "I want to modify this using pointer";
  char *p = a.c_str();
  p[0] = 'i';
  ........           //指针操作
  ShowMessage(a);
  虽然BCB的帮助表明 c_str()这个函数的返回值(char*)只在它所在表达式内有效,
  但是以上代码有时候却可以完成预期的目的
  个人极力反对用这种方法来改变字符串的内容,因为AnsiString自带的方法已经能够十
分有效的完成指针操作
  比如上面的例子中 p[0] 可以用 a[1] 来代替
  合并字符串可以用 + 或者 += 来替代
  还有查找,插入,删除等,都可以在帮助中找到AnsiString类中对应的方法来实现

  2.Unicode的支持
  由于AnsiString非模板类
  除了WideChar方法外,AnsiString好像不支持Unicode
  但是不知道为什么里面会有ByteType这个方法

  3.很有意思的方法
  Unique()
  LastDelimiter()
  不常用,但是我觉得是十分有意思的函数
  怎么用,可以参考帮助

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -