P a s c a l类型有下列几种不同的字符串类型来满足程序的要求:
•
AnsiString 这是P a s c a l缺省的字符串类型,它由AnsiChar 字符组成,其长度没有限制,同时与
n u l l结束的字符串相兼容。
•
ShortString 保留该类型是为了向后兼容Delphi 1.0,它的长度限制在2 5 5个字符内。
•
WideString 功能上类似于A n s i S t r i n g,但它是由Wi d e C h a r字符组成的。
•
PChar 指向n u l l结束的C h a r字符串的指针,类似于C的char * 或l p s t r类型。
•
PAnsiChar 指向n u l l结束的A n s i C h a r字符串的指针。
•
PWideChar 指向n u l l结束的Wi d e C h a r字符串的指针。
缺省情况下,如果用如下的代码来定义字符串,编译器认为是AnsiString 字符串:
v a r
S:string;
//编译器认为S的类型是A n s i S t r i n g
v a r
S : S t r i n g ;
b e g i n
SetLength(S,256);
//重要!首先给字符串分配空间
/ /调用A P I函数,S 现在包含目录字符串
G e t Wi n d o w s D i r e c t o r y ( P C h a r ( S ) , 2 5 6 ) ;
如果使用了将A n s i S t r i n g字符串强制转换为P C h a r类型的函数和过程,在使用结束后,要手工把它
的长度恢复为原来以n u l l结束的长度。S T R U T I L S单元中的R e a l i z e L e n g h t ( )函数可以实现这一点:
procedure RealizeLength(var S:string);
b e g i n
S e t L e n g t h ( S , S t r L e n ( P C h a r ( S ) ) ) ;
e n d ;
调用R e a l l i z e L e n g t h ( ) :
v a r
S : s t r i n g ;
b e g i n
SetLength(S,256);
//重要!首先给字符串分配空间
/ /调用函数,S现在包含目录字符串
G e t Wi n d o w D i r e c t o r y ( P C h a r ( S ) , 2 5 6 ) ;
RealizeLength(S);
//设置S的长度为n u l l结束的长度
e n d ;
注意在练习将一个字符串转换为P C h a r类型时要小心,因为字符串在超出其作用范围时有自
动回收的功能,因此当进行P:=PChar(Str)的赋值时,P的作用域(生存期)应当大于Str的作用域。