2

浏览我的一些较旧的 Delphi 项目并将它们升级到 D2009,因为我发现这个版本对所有以前的版本都有很大的改进(Generics.Collections - wow!;)),我遇到了各种问题。我设法解决了这个问题,但解决方案似乎没有我认为的那么优雅。(注意,我已经有大约三年没有编写 Delphi 代码了,即使在那时,它也只是业余的黑客行为,而不是对正在发生的事情的深入理解)。

我的代码将有一个 TFileStream 并从中读取。这些文件以前是由我的旧 Delphi 应用程序编写的,文件中的前三个字符将是 CTR,以将文件类型识别为有效。阅读器会将前三个字节读入一个字符数组(这就是问题所在,现在 sizeof(char) 是 2 个字节),然后将此数组视为字符串以查看它是否读取“CTR”。

var ...
buffer: array[0..2] of char;
begin
...
InStream.read(buffer, 3);
if buffer <>'CTR' then begin ShowMessage('Not a valid file!'); exit; end;
...

这将编译并且它曾经可以工作,但现在缓冲区实际上是 6 个字节长,因此永远不等于“CTR” 。

我通过将缓冲区更改为来解决此问题,array[0..2] of byte并引入了更多局部变量来执行以下操作:

for b in buffer do s := s + chr(b); //notice the for..in loop now available in D2009
if s<>'CTR'...

所以基本上我将单个字节转换为字符串,然后进行比较,但必须有更直接的方法来做到这一点。你能解释一下这个问题吗?

4

1 回答 1

13

您可以将缓冲区设置为

var
  buffer: array[0..2] of AnsiChar;

你会读到和以前一样的东西。

于 2009-05-04T21:49:02.857 回答