wie gesagt, erstmal müßte man wissen in welchem Format du die Arraydaten (in dem Stream) speichern willst und dann könnte man auch vorausberechnen welche Größe das ergibt.
aber mal zu den Typen...
zwecks der Speicherung macht es sich bestimmt besser auf feste Typengrößen zu setzen und die Speicherausrichtung zu eliminieren
(z.B. kan man die Speicherausrichtung änder und Integer war unter Delphi 1 16 Bit, jetzt ist es 32 Bit und in einem 64-Bit-Delphi wird es wohl 64 Bit sein)
und da Delphi ja bei seinen Arrays die Größe mit speichert, is es da nötig dieses nochmals im Record anzugeben.
(ok, so kann man aunfach auf TCalibData.NoOfRegItems, statt auf Length(TCalibData.RegItems) zugreifen)
und sind diese Werte immer identisch? (bräuchte man nur NoOf.. speichern ung könnte Length(array) einfach ignorieren)
Delphi-Quellcode:
TCalibPoint = packed Record
Active : Boolean;
x, y : Single;
end;
TCalibArray = packed Array of TCalibPoint;
TCalibData = packed Record
//NoOfRegItems : LongInt; entspricht doch Length(TCalibData.RegItems)
RegItems : packed Array of Double;
//NoOfCItems : LongInt; entspricht doch Length(TCalibData.CalibArray)
CalibArray : TCalibArray;
end;
TCalibrationArray = packed Array of TCalibData;
wenn ich jetzt einfach mal ignorieren, daß die Arraylänge schon im Record (NoOf...) gespeichert ist, dann so ... incl. der Längenangaben der Array's (je ein LongInt)
Delphi-Quellcode:
type TCalibPoint = packed Record
Active : Boolean;
x, y : Single;
end;
TCalibArray = packed Array of TCalibPoint;
TCalibData = packed Record
NoOfRegItems : LongInt;
RegItems : packed Array of Double;
NoOfCItems : LongInt;
CalibArray : TCalibArray;
end;
TCalibrationArray = packed Array of TCalibData;
var CalibrationArray: TCalibrationArray;
Size, i, i2: LongInt;
// Length(CalibrationArray)
// CalibrationArray[i].NoOfRegItems CalibrationArray[i].NoOfCItems
Size := SizeOf(LongInt)
+ Length(CalibrationArray) * 2 * SizeOf(LongInt);
for i := 0 to High(CalibrationArray) do begin
// Length(CalibrationArray[i].RegItems)
Inc(Size, SizeOf(LongInt));
// CalibrationArray[i].RegItems
Inc(Size, Length(CalibrationArray[i].RegItems) * SizeOf(Double));
// Length(CalibrationArray[i].CalibArray)
Inc(Size, SizeOf(LongInt));
for i2 := 0 to High(CalibrationArray[i].CalibArray) do begin
// Length(CalibrationArray[i].CalibArray[i2])
Inc(Size, SizeOf(LongInt));
// CalibrationArray[i].CalibArray[i2]
Inc(Size, Length(CalibrationArray[i].CalibArray[i2]) * SizeOf(TCalibPoint));
end;
end;