Record alignment, Delphi 4 vs Delphi 5

I wrote to a file in Delphi 4 using the following record structure:

TRouteFileHeader = record      // 40 in Delphi 5, 32 in Delphi 4
  HRouteId: string[8];              // 9
  HRouteVersion: string[5];     // 6
  HOperationCount: Integer;  // 4
  HLoadDate: TDateTime;       // 8
  HFileVersion: string[2];        // 3
end;

I recompiled in Delphi 5 and tried to read the same file. The first three fields were okay, but the last two were not. When I did a sizeof on the record, it was 40 bytes. In Delphi 4 it was only 32 bytes (which seems about right).

I think this may have something to do with aligning records on 32 bit boundries. I tried to change that setting, and it did make a difference. I couldn't get the Delphi 5 program to correctly read the file though.

My question is, is there a setting in Delphi 5 that will allow it to correctly read this file as written in Delphi 4?
LVL 1
wipnavAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
rwilson032697Connect With a Mentor Commented:
The answer is no, there is not setting (sorry). You need to declare your record like this if the D4 record size was 32:

TRouteFileHeader = packed record
  HRouteId: string[8];            
  Dummy1 : Byte;
  HRouteVersion: string[5];    
  Dummy2 : Byte;
  HOperationCount: Integer;  
  HLoadDate: TDateTime;      
  HFileVersion: string[2];      
end;

In general, any record that you write to a file should be declared as 'packed'

Cheers,

Raymond.
0
 
wipnavAuthor Commented:
Thanks for your help. I will try that.
0
 
rwilson032697Commented:
Your welcome.

As a general rule experts here do not mind if you verify an answer works for you before grading.

Let me know how it goes.

Cheers,

Raymond.
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
wipnavAuthor Commented:
Raymond,

I tried it today and didn't work. I think using a packed record made things worse. I didn't get a chance to document exactly what I got, but it didn't look too good. I still wonder what they changed in Delphi 5 to cause this problem.

Regards,

Bill
0
 
rwilson032697Commented:
I found the definitive guide in section 18-7 of the D3 Object Pascal Guide. According to that, the record should look like this (sorry for the incorrect initial answer):

TRouteFileHeader = packed record
  HRouteId: string[8];            
  HRouteVersion: string[5];  
  Dummy1 : Byte;    
  HOperationCount: Integer;  
  HLoadDate: TDateTime;        
  HFileVersion: string[2];        
  Dummy2 : Byte;
end;

I don't think there were changes between D3 and D4, though there have been for D4 to D5.

Cheers,

Raymond.
0
 
wipnavAuthor Commented:
Raymond,

The second answer worked. Thanks for your help. My initial grade stands.

Regards,

Bill
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.