PChar和AnsiString的区别?AnsiString和windeString的区别?
这是D5中的一段。我不明白PChar和AnsiString的区别是什么。为什么要调用PChar(S)?还要用RealizeLenght()该回来?
“注意在练习将一个字符串转换为PChar类型时要小心,因为字符串在超出其作用范围时有自动回收的功能,因此当进行P:=PChar(Str)的赋值时,P 的作用域(生存期)应当大于Str 的作用域。”
这段话是什么意思?P的作用域如果不大于Str回怎么样?
windeString中的每个字符是2个字节?AnsiString每个字符是1个字节那AnsiString和windeString的为什么可以直接转换。转换后的字节数是怎么定?
原文:
正如前面所提到,AnsiString 字符串总是null 结束的。因此,它能跟以null 结尾的字符串兼容,这
就使得调用Win32 API 函数或其他需要PChar 型字符串的函数变得容易了。只要把一个字符类型强制转
换为PChar 类型(在2 . 8 节“强制类型转换和类型约定”中将介绍强制类型转换)。下面的代码演示了怎
样调用Win32的GetWindowsDirectory( )函数,这个函数需要一个PChar类型的参数:
var
S:String;
begin
SetLength(S,256); //重要!首先给字符串分配空间
/ /调用A P I 函数,S 现在包含目录字符串
GetWindowsDirectory(PChar(S),256) ;
如果使用了将A n s i S t r i n g 字符串强制转换为PChar类型的函数和过程,在使用结束后,要手工把它
第2 章Object Pascal 语言2 7 下载
的长度恢复为原来以n u l l 结束的长度。STRUTILS单元中的RealizeLenght( )函数可以实现这一点:
procedure RealizeLength(var S:string);
b e g i n
SetLength(S,StrLen(PChar(S)));
e n d ;
调用ReallizeLength( ) :
var
S:string ;
begin
SetLength(S,256); //重要!首先给字符串分配空间
/ /调用函数,S 现在包含目录字符串
GetWindowDirectory(PChar(S),256) ;
RealizeLength(S); //设置S 的长度为n u l l 结束的长度
e n d ;
注意在练习将一个字符串转换为P C h a r 类型时要小心,因为字符串在超出其作用范围时有自动回收的功能,因此当进行P:=PChar(Str)的赋值时,P 的作用域(生存期)应当大于Str 的作用域。