Главная страница | назад





Article #17798: Read and BlockRead file function failure in 32bit.

 Question and Answer Database

FAQ2798D.txt   Read and BlockRead file function failure in 32bit.
Category   :Object Pascal
Platform    :All
Product    :All 32 bit  

Question:
When I port my code from 16 bit Delphi to 32 bit Delphi, the read
and BlockRead function no longer seem to work correctly.
Is this a bug?


Answer:
No. In 32 bit environments, records are automatically aligned on
32 bit boundaries when the $A+ compiler directive is in effect. This
is done by padding the record so each record will be located on a 32
bit boundary. If you are reading in data from a file containing
non-aligned records, the data may not be read in correctly if you are
using automatic record alignment. To turn off automatic record
alignment for a given record type, use the "packed" record attribute.
Globally turning off record alignment with the $A- is not recommended,
as much of the system requires record alignment to be on. The
following example demonstrates the size difference of a packed and
unpacked record.

Example:

type TSomeRec = record
       w1 : word;
       b1 : byte;
       w2 : word;
     end;

type TSomePackedRec = packed record
       w1 : word;
       b1 : byte;
       w2 : word;
     end;

procedure TForm1.Button1Click(Sender: TObject);
var
  r : TSomeRec;
  s : TSomePackedRec;
begin
  ShowMessage(IntToStr(SizeOf(r))); {displays 6}
  ShowMessage(IntToStr(SizeOf(s))); {displays 5};
end;


7/16/98 4:31:28 PM
 

Last Modified: 01-SEP-99