AnsiString类

2016-02-19 17:18 17 1 收藏

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

【 tulaoshi.com - 编程语言 】

  介绍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 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 将字串变成小写

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

  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(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:mystuffmydata.dat";

  FileName.UpperCase();

  不可以,因为UpperCase()方法返回新字串,而不是作用于字串本身。正确的方法如下:

  FileName= FileName.UpperCase();

  使用AnsiString方法前,先从联机帮助看看这些方法如何操作。另外,记住双反斜杠。另一个AnsiString方法是我所不喜欢的,Format()方法可以象Sprintf()函数一样用变量建立字串。

  Sprintf()函数的例子:

  char buff[20];

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

  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];

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

  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++编程老手头痛一阵子.

来源:http://www.tulaoshi.com/n/20160219/1614883.html

延伸阅读
标签: Web开发
     在Javascript中,一切都是对象,包括函数。在Javascript中并没有真正的类,不能像C#,PHP等语言中用 class xxx来定义。但Javascript中提供了一种折中的方案:把对象定义描述为对象的配方(先看一下例子会比较容易理解)。      定义类的方法有很多种,这里有两中较为通用的方法,大家参考一下。 ...
tcp一般用于维持一个可信任的连接,比起udp更为安全可靠,在vs.net,分别有tcpclient和udpclient以及tcplistener,一般开发中基本可以满足需要,但是这个有个很大的弊端,对于维持一个时间较长的,相互交互的来说,数据处理不是很明朗,vs/net中还有一个socket类,用他来做一个客户/服务器段,同时在接发数据的时候,能相互独立,这需要一个异步通讯...
在面向对象的程序设计中,有经常接触类、对象等专业名词;到底什么是类、什么是对象呢?在程序又是怎样运用呢?类是面向对象程序设计的核心,它实际是一种新的数据类型,也是实现抽象类型的工具,因为类是通过抽象数据类型的方法来实现的一种数据类型。类是对某一类对象的抽象;而对象是某一种类的实例,因此,类和对象是密切相关的。没有...
标签: Web开发
% '转发时请保留此声明信息,这段声明不并会影响你的速度! '**************************   Ver2005  最终版******************************** '作者:孙立宇、apollosun、ezhonghua '改进者:arllic ' '官方网站:http://www.lkstar.com   技术支持论坛:http://bbs.lkstar.com '电子邮件:kickball@netease.com &...
标签: PHP
  原来写的IPwhois类  <?php /* * * Class : IP Whois Verson 1.0 * Info : Get IP's information form 4 whois server * Author : PhpUp Studio * Date : 12/12/2004 * www.knowsky.com * */ class IPWhois {         var $server = 'whois.arin.net';      &nbs...

经验教程

825

收藏

20
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部