将代码从Delphi 7转换到2010时,我遇到了一个奇怪的问题.它与记录有关.下面定义的记录,在D7中的大小为432字节,在D2009(和2010)中为496.我知道,一个简单的解决方案是使其成为打包记录,然后所有版本都达到426字节……但是,我们将数据存储在流式传输记录的位置,现在我们正在尝试使用更新的语言读取这些流.
TToTry = Record a,b,c,d : Extended; e,f,g,h : Extended; i : String[15]; j,k,l,m,n,o,p,q,r,s,t : Array[1..3] of Extended; End;
在调查这个问题时,我创建了另一条记录,无论出于何种原因,大小都是一样的?记录较小,但它具有相同的数据类型.但它在所有版本的语言中都有相同的大小.
TMyRecord = Record Ext1 : Extended; Ext2 : Extended; Ext3 : Extended; Ext4 : Extended; Ext5 : Extended; Ext6 : Extended; Int1 : Integer; Int2 : Integer; char1 : AnsiChar; char2 : AnsiChar; MyString : String[15]; Arr1 : Array[1..3] of Extended; Arr2 : Array[1..3] of Extended; end;
任何人都知道为什么一个记录如此不同,另一个是相同的?有些与Delphi中的字节边界对齐有关.但是从一个版本到另一个版本的变化如此之大?
解决方法
那么,第一个问题是您将非打包记录存储到磁盘.允许字段和数组打包在产品版本之间进行更改,因为通常内存中的布局在进程外部不可见.你违反了这个规则.
如果Delphi 7和Delphi 2009之间的字节填充默认值发生了变化,请找出D7中的默认值,并在Delphi 2009中将默认值设置为相同.
还要检查阵列打包默认值.我不记得是否有单独的设置.
在调试内存视图中查看Delphi 2009中的记录结构.部分或全部附加大小可能是由于记录本身的填充(不是其中的字段),因此当在阵列中使用记录时,阵列元素处于快速的机器边界上.
如果这些都没有帮助,请在D2009中创建临时打包记录类型,并在实际数据字段之间手动插入字节填充字段,直到记录大小和字段对齐与D7布局匹配.它不仅仅是尺寸,而是场地对齐.使用此临时打包记录读取旧数据文件.然后按字段将数据字段传输到D2009中的“实际”记录类型并写出新文件.
当你在它的时候,在D2009中打包记录类型,这样就不会再发生了.