我有一个较旧项目的源代码,不得不做些小改动,但是由于只有delphi 2010来做,所以我遇到了很大的麻烦。

有一条记录已定义: 通用标签

此定义后来用于从文件读取: 通用标签

主要问题是,编译器在记录中不接受类型“字符串”,因为他想要“定型”。 因此,我尝试将“字符串”更改为“字符串[255]”或“短字符串”。这样做,应用程序正在读取文件,但内容错误。

我的问题是如何在Delphi 2010中将用于写入文件的旧“字符串”类型转换为“新”类型。

我已经尝试了很多,例如“ {$ H-}”。在记录显示中仅再添加一个字符,该文件是正确的,因为读取文件几乎正确,但是每个数据集被截断了一个字符-长度字节+ 255个字符的长度似乎在定义上是正确的,但短字符串不匹配。>

有帮助吗?

解决方案

眼睛!看起来您的代码是早于日期或未使用长字符串的。如果您希望获得与旧版Delphi相同的行为,则需要将string替换为ShortString

我看到您已经尝试过了,并报告失败了。这实际上是对我有意义的唯一解释,因为所有其他字符串类型本质上都是指针,因此,read可能起作用的唯一方法是使用ShortString。您正在尝试进行的迁移是巨大的,并且您可能会遇到大量令人困惑的问题。

@LU RD在注释中很好地指出,由于您未使用packed数组,因此Delphi版本之间的记录布局可能有所不同。您可以使用手边的两个Delphi版本来研究记录的布局。您需要安排记录的大小在版本之间匹配,并且字段的偏移量也匹配。

根据下面的评论,在pos和nr之间添加一个填充字节将解决您的问题。 通用标签

您还可以通过设置 $ALIGN 编译器来达到相同的效果{$ALIGN ON}的选项,这就是我认为我会做的事情。

从长远来看,您确实应该摆脱短字符串,ANSI编码,内部记录与数据文件之间的直接映射等问题。在短期内,最好使用与构建和使用该代码相同的Delphi版本。我希望这个问题只是冰山一角。

其他提示

请记住:

“字符串” <>“字符串[255]” <>“短字符串” <> AnsiString

在旧的DOS / Turbo Pascal时代,“字符串”确实限制为255个字符。很大程度上是因为第一个字节包含字符串长度,并且一个字节只能具有0到255之间的值。

在现代版本的Delphi中,这不再是问题。

ShortString ”是旧DOS / Pascal的类型字符串类型。

“ LongString”很长时间以来一直是默认的字符串类型(包括我目前用于大多数生产工作的Borland Delphi 2006)。在Delphi 3 .. Delphi 2009中, LongStrings 包含8位字符,并且仅受可用内存的限制。在Delphi 3 .. Delphi 2009中,“ LongStrings”是“ AnsiStrings”的同义词。

Delphi的最新版本(Delphi 2009及更高版本,包括新的Delphi XE2)现在都默认为多字节Unicode“ WideString”字符串。与AnsiStrings一样, WideStrings 的最大长度实际上也是“无限的”。

本文详细介绍:

http://delphi.about.com/od/beginners/l/ aa071800a.htm

PS: 考虑对二进制记录使用“ sizeof(bbil)”和“ Packed

也许我正在忽略某些内容,但是从我的角度来看,您的delphi 3代码也已损坏。尝试确定记录的大小: 通用标签

path(长度在1到256之间的任何字符-长度为一个字节,其余为数据),pos(1个字节),nr(2个字节),使记录数据的大小从1 + 1 + 2= 4字节变为256+ 1 + 2= 259字节。在这种情况下,无论如何,您都会从文件中获取垃圾,因为您的程序现在无法在实际读取数据之前读取多少字节。建议您修正记录,使字符串的大小固定,例如: 通用标签

然后,您将能够在delphi 3和2010中很好地进行读写。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top