今天我偶然发现了一些神秘的东西。这行代码:
showmessage(menuMain.player[2] + ' ready!');
生成此消息(例如menuMain.player [2] = Player):
播放器
但如果我以这种方式放置代码(例如menuMain.player [2] = Player):
showmessage('Test: ' + menuMain.player[2]);
它将生成此消息:
测试:播放器
根据调试器,字符串(buffer := menuMain.player[2] + ' ready!')
的确切值是:
'玩家'#0#0#0#0#0#0#0#0'准备就绪!'
我确实相信这是一个编译器故障,因为我在另一个代码块中有 exact 相同的行,并且它可以完美地工作。
对我而言,现在最困难的部分是,我是愚蠢的,还是这确实是一个小故障?
答案 0 :(得分:6)
缓冲区字符串的确切值(buffer = menuMain.player [2] +' ready!'):'播放器'#0#0#0#0#0# 0#0#0' !准备好'
问题是嵌入的空字符(#0
)。这些字符充当字符串终止符,这意味着对于大多数WinAPI函数,包括那些输出或绘制文本的函数,字符串在该点停止处理。找到第一个#0
后,该字符串将被视为已结束。
您可以使用以下代码轻松地对此进行测试:
var
TestStr: string;
begin
TestStr := 'This is a test';
ShowMessage(TestStr); // Outputs This is a test
TestStr[5] := #0;
ShowMessage(TestStr); // Outputs This
end;
当然,剩下的问题是你是如何在一开始就使用嵌入式空值的?由于您尚未发布填充menuMain.player
的代码,因此无法说出,但这是您需要检查的区域,因为字符串数组元素在Delphi本身不包含空值。您也可以自己检查一下:
var
TestArr: array[1..2] of string;
begin
TestArr[1] := 'Player one';
TestArr[2] := 'Player two';
ShowMessage(TestArr[1] + ' defeated ' + TestArr[2]);
end;
所以问题的答案
对我而言,现在最困难的部分是,我是愚蠢的,还是这确实是一个小故障?
这是一个小故障,但故障是代码中的某个地方。它不是Delphi或其字符串中的小故障。