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





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