关于字符串。(20分)

  • 主题发起人 主题发起人 kenmen
  • 开始时间 开始时间
K

kenmen

Unregistered / Unconfirmed
GUEST, unregistred user!
请问PCHAR是啥?和DELPHI中的字符串一样吗?
我在某书上看到这个程序:

procedure TForm1.Button2Click(Sender: TObject);
var
S1: String;
begin
SetLength (S1, 100);
GetWindowText (Handle, PChar (S1), Length (S1));
S1 := S1 + ' is the title'
//this won't work
Button2.Caption := S1;
end;
这个程序是将FORM1中的CAPTION读给S1,再读给“Button2.Caption”,
但“S1 := S1 + ' is the title';”这时出错了,实现不了,要这样该:

“GetWindowText (Handle, PChar (S1), Length (S1));
S1 := String (PChar (S1));
S1 := S1 + ' is the title';”
请问为啥?
还有,不加“SetLength (S1, 100);”这句可以吗?有啥用?
我试过不加这句,结果很齐怪。
 
PChar=字符序列+'/0'组成
String=字符序列+<CR>组成
在GetWindowText中,那样的用法是不对的,应使用PChar to String的转换函数转换
一下方可使用!
 
PChar是以#0结尾的字符串(为了和C兼容)
GetWindowText之后S1的内容是这样的Form1#0...........就是说这个字符串
到Form1之后就结束了,而' is the title'被加在了最后
所以' is the title'就相当于没有加上,当然显示不出来
你也可以这样
S1 := String (PChar (S1)) + ' is the title';
^^^^^^^^^^^^^^^^^^转换成Pascal字符串
或者用StrPas(PChar(S1))都是一样的
 
那请问unreal,GetWindowText之后S1是啥类形?
若是PCHAR,为啥还要PChar (S1)?
还有,我最后的问题还有谁可回答。。。。。。。。
 
GetWindowText(
hWnd: HWND
{a handle to a window}
lpString: <font colo=red>PChar</font>
{a pointer to a buffer to receive the string}
nMaxCount: Integer {the maximum number of characters to copy}
): Integer; {returns the length of the copied string}
所以,GetWindowText之后S1是PChar类型。

不加“SetLength (S1, 100);”这句是绝对不可以的,你的S1又没有赋初值,所以要给它
分配空间。
 
那请问wjiachun,既然是PCHAR类型,为啥还要PCHAR()???
 
>>所以,GetWindowText之后S1是PChar类型。
我说之后是PChar类型!之前不是声明S1: String;了么?
 
procedure TForm1.Button2Click(Sender: TObject);
var
temp:array of char;
begin
SetLength (temp, 100);
GetWindowText (Handle, temp, Length (temp));
Button2.Caption := strpas(temp)+ ' is the title'
//this will work correctly
end;
pchar是#0结束的字符串。一般在API中处理字符串时都是用这种格式。
 
wjiachun,我是问既然GetWindowText之后S1是PChar类型,
那么为啥要加S1 := String (PChar (S1))这一句?
 
GetWindowText之后s1是发/0结尾的
但s1:string!!!
所以要用Pchar()!!!
 
也就是说S1虽是以/0结尾,
但由于s1:string,在类型上有了冲突,就要再来一次Pchar()。
是吗?
 
kenmen:这个问题还没有结束?
GetWindowText之后S1是PChar类型,但是你下面要用S1 := S1 + ' is the title';
而PChar类型是以零终止符结束的,既然结束了就不能在后面加任何东西。所以要
给它转化为string才可以。

但是,如果直接用 S1:=String(S1),系统一定会忽略这句,因为S1本来就声明为
String类型,把数据类型转换为自己将被编译器认为是无效的操作,所以只好用
S1 := String (PChar (S1));

不知道是否说清楚了?
 
多人接受答案了。
 
后退
顶部