AnsiString类

麦吉卖

麦吉卖

2016-02-19 17:18

下面图老师小编跟大家分享AnsiString类,一起来学习下过程究竟如何进行吧!喜欢就赶紧收藏起来哦~

  介绍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类:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  String s = "This is a test";

  由于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';

  LabellCaption = "This is a test";

  double d = 3.14 * 20;

  Edit1Text = 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 删除字串的一部分

  Insert 在现有字串的指定位置插入文本

  Length 返回字串长度,不包括终止NULL

  LowerCase 将字串变成小写

  Pos 返回搜索字串在字串中的位置

  SubString 返回字串中从指定位置开始、指定长度的子串

  ToDouble 将字串变成浮点数,如果无法将字串变成浮点数,则扔出异常

  ToInt 将字串变成整数,如果无法将字串变成整数,则扔出异常

  ToIntDef 将字串变成整数并在不能换算时提供缺省值而不扔出异常

  Trim 删除字串前后的空格

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  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(CanvasHandle,buff,1,&R,DT_SINGLELINE);

  // now the VCL way

  String S ="This is a test";

  DrawText(CanvasHandle,S.c_str(),1,&R,DT_SINGLELINE);

  DrawText()函数的第二个参数需要字串缓冲区指针,这就要靠c_str()方法提供。如果不理解,可以等以后再回头理解。

  目前不必对DrawText()太费心。这个例子说明VCL将你从WindowsAPI函数隔离开,而又还能使用Windows API函数。深入Windows编程时,有时会需要Windows API函数,这时Windows API函数很有现成。

  另一个AnsiString方法是ToInt()。这个方法将字串变成整数。假设窗体上有个编辑构件要向用户取整数值,由于编辑构件只能放文本,所以需要将字串变成整数。方法如下:

  int value = Edit1Text.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!";

  Label1Caption = S[7];

  这个代码将字符W赋予标题构件的Caption属性。这里要指出的是,字串的第一个元素在数组索引1处,而不象其它C++数组一样在数组索引0处.基数为1的索引主要是为了与Delphi兼容。这一次也许会让C++编程老手头痛一阵子.

展开更多 50%)
分享

猜你喜欢

AnsiString类

编程语言 网络编程
AnsiString类

php基类 调试类 错误类

Web开发
php基类 调试类 错误类

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

分页类异常类

Web开发
分页类异常类

XMD(XML类)类的用法

Web开发
XMD(XML类)类的用法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

TPrinter类

编程语言 网络编程
TPrinter类

相册类

flash教程
相册类

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

XML入门指南(11)XML解析器

XML入门指南(11)XML解析器

TMouse

TMouse
下拉加载更多内容 ↓