一各种字符串
字符串是Object Pascal所有数据类型中最有用的类型许多函数以字符串为传递参数由于在Delphi中字符串的定义和使用有各种方式包括Pascal中典型的字符串(String)Delphi支持的长字符串(ANSIString)类似于C语言的字符数组(Array of Char)指向字符的指针(Pchar)等下面的文章就跟谈谈这些类型在定义和应用中的区别和注意事项
. 传统的Pascal字符串
在Pascal中典型的字符串是一定长度的字符序列每一字符串有一设定的长度(缺省值为)下面是一个例子 Var Address:String; Code:String[]; Address是一长度为的字符串Code的最大长度为 传统的Pascal字符串长度不能超过 可以用字符串连接操作+把字符串连接在一起 Result:=String+String;
. Delphi中的长字符串
Delphi除了支持传统的Pascal短字符串还支持长字符串长字符称为ANSIString长字符串动态分配内存即用字符串时才分配字符串所需内存所以其长度不受限制在Delphi中你如果用String:String作类型说明则String既可能是短字符串也可能是长字符串这取决于编译器中$H开关的设置默认值为$H+代表ANSI长字符串VCL中的组件使用ANSI长字符串长字符串以null结束这就说明长字符串与C语言中的以null结束的字符串完全兼容 可以通过SetLength函数设置字符串的最大长度 SetLength(String);用TrimLeftTrimRight和Trim函数分别来消除字符串开头结尾和首尾的空白区
. 类似于C的字符数组
可以用以为起点的数组来存储以null结束的字符串如下定义 Var Name:Array[] of Char;
. Pchar指针
如果Delphi中的Exended Syntax 已经设置(缺省值)以为起点的字符数组就和指向字符的指针Pchar完全兼容因为以为起点的字符数组名即指向该字符数组首字符的指针可以将字符串直接付值给Pchar指针例如 var P: PChar; begin P := Hello world; end;
这样P就指向存储字符串Hello world并以null结束的一块内存 许多Windows的应用程序接口API函数要求用Pchar类型作参数Pchar指针在使用是首先用GetMem(var P: Pointer; Size: Integer)函数申请分配内存程序结束时用FreeMem(var P: Pointer[; Size: Integer])函数释放内存例如 Var WinDirSysDir:Pchar; Begin GetMem(WinDir);{为指针分配内存} GetWindowsDirectory(WinDir);{将Windows安装目录放至WinDir} ShowMessage(Windows directory is+WinDir);{显示结果} End;
二字符串转换
以上介绍了Delphi中的四类字符串的定义和使用由于各类函数对字符串参数类型要求不一这就需要进行字符串类型转换
. 可以用StrPas将以null结束的字符串转换为Pascal短字符串StrpCopy则完成相反的转换
. 因为长字符串以null结束所以可以用强制类型转换将长字符串转换成Pchar类型用法是Pchar(s)s是一个长字符串强制类型转换返回一个指向长字符串首字符的指针并且所指字符串以null 结束例如 Var CaptionMessage:string; Caption:=Hello World!; Mssage:=This is a test of long string; MessageBox(Pchar(Message)Pchar(Caption)MB_OK);
小结在使用Delphi中的字符串时要时刻清楚该字符串的类型以免引起混淆在理解字符串时要把字符串与指针内存分配联系起来加强理解