Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 将Delphi 3迁移到Delphi 2010时出现的字符串问题_String_Delphi_Delphi 2010_Code Migration - Fatal编程技术网

String 将Delphi 3迁移到Delphi 2010时出现的字符串问题

String 将Delphi 3迁移到Delphi 2010时出现的字符串问题,string,delphi,delphi-2010,code-migration,String,Delphi,Delphi 2010,Code Migration,我得到了一个老项目的来源,不得不改变一些小事情,但我遇到了大麻烦,因为只有Delphi2010可以做到这一点 定义了一个记录: bbil = record path : string; pos: byte; nr: Word; end; 稍后,此定义用于从文件中读取: b_bil: file of bbil; pbbil: ^bbil; l_bil : tlist; while not(eof(b_bil)) do begin new(pbbil); read

我得到了一个老项目的来源,不得不改变一些小事情,但我遇到了大麻烦,因为只有Delphi2010可以做到这一点

定义了一个记录:

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;
稍后,此定义用于从文件中读取:

b_bil: file of bbil;
pbbil: ^bbil;
l_bil : tlist;

while not(eof(b_bil)) do
  begin
    new(pbbil);
    read(b_bil, pbbil^);
    l_bil.add(pbbil);
  end
主要问题是,编译器不接受记录中的“string”类型,因为他需要“finalization”。 所以我尝试将“string”改为“string[255]”或“shortstring”。执行此操作时,应用程序正在读取文件,但内容错误

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


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

Eek!看起来您的代码不是早于日期,就是没有使用长字符串。如果希望获得与旧Delphi中相同的行为,则需要将
string
替换为
ShortString

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

@LU RD在评论中提出了一个很好的观点,即Delphi版本之间的记录布局可能有所不同,因为您没有使用压缩的数组。您可以使用手头的两个Delphi版本来研究记录布局。您需要安排记录的大小在版本之间匹配,并且字段的偏移量也匹配

根据下面的注释,在pos和nr之间添加一个填充字节将解决您的问题

bbil = record
  path : string;
  pos: byte;
  _pad: byte;
  nr: Word;
end;
您还可以通过将编译器选项设置为
{$ALIGN ON}
来实现相同的效果,我想这就是我应该做的事情

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

记住:

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

在旧的DOS/Turbo Pascal时代,“字符串”实际上被限制为255个字符。很大程度上是因为第一个字节包含字符串长度,一个字节的值只能介于0和255之间

在当代版本的Delphi中,这不再是一个问题

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

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

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

本文将更详细地解释:

附言:
考虑使用“siZeof(BBIL)”和“”用于二进制记录。

< P>也许我忽略了一些东西,但是,在我看来,你的Delphi 3代码也被破坏了。尝试确定记录的大小:

bbil = record
  path : string;
  pos: byte;
  nr: Word;
end;
路径(介于1和256之间的任何内容-长度为1字节,数据为剩余字节)、位置(1字节)、nr(2字节),使您的记录数据大小从1+1+2=4字节到256+1+2=259字节不等。在这种情况下,在任何情况下,您都会从文件中获取垃圾,因为在实际读取数据之前,您的程序现在无法读取多少字节。我建议您修改记录,使字符串具有固定大小,如:

path : ShortString[255];

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

在记录定义中使用AnsiString也会导致编译器错误:“需要完成bbil”。以这种方式缩短这些AnsiString“pfad:AnsiString[255];”也不起作用:“预期但[found]。我可能需要的是一个ShortAnsiString?在我看来,您的代码也不应该在Delphi 3中编译;请尝试`path:array[0..N]AnsiChar;`,其中N是某个常量,可能是255。按照David所说的,将字符串声明为
ShortString
。要对齐记录,请尝试packed record指令(如果有帮助的话)。要使此代码在D3中工作,{$H-}指令必须已被使用。@user539484如果您使用
ansisting
,那么
读取
如何工作?另一方面,唯一有意义的解释是,
短字符串
显然也失败了。您好,我将提到的代码与2007年的备份进行了比较-记录定义和读取文件的过程是与这里提到的完全相同。David,我认为
ShortString
建议是正确的,只需要匹配记录的大小。对齐指令可以解决此问题,或者可能解决打包记录声明问题。只需将类型声明为
packed record
,而不是
record
。这将删除公司进行的对齐要查看记录的大小,请尝试使用
SizeOf(bbil)
。请记住,自D2009以来,Char中有两个字节。然后在pos后添加一个垃圾字节,这样应该可以正常工作。因为编译器可以在偶数地址上对齐字节值,为下一个参数留出空间。甚至可以让编译器在四元地址上对齐。因此,在IO期间处理记录时,将它们保留为decl在德尔福,你被包装好了