Hallo allerseits,
Ich steh vor einem Problem und weiß nicht, wie ich es lösen könnte, da immer beim Dimensionieren ein Fehler auftritt, vielleicht kann mir wer weiterhelfen:
Ich möchte ein File als stream einlesen, das zuerst aus einem statischen Header besteht, dann aber je nach Inhalt dynamisch wird:
type TFileHeader = packed record
FileCode :LongInt;
[...]
end; // ist 100 Bytes groß
nach diesem statischen Header kommt immer ein Record Header mit folgender Struktur:
type TRecordHeader = packed record
ID : LongInt; // Big Endian 4 Byte
Laenge : LongInt; // Big Endian 4 Byte
end;
ID zählt einfach beginnend von 1 hinauf, Laenge gibt die Größe des nachfolgenden Records an.
danach kommt eben der Objekt-Record, der je nach Wert einer bestimmten Variable im FileHeader eine andere Struktur hat (es handelt sich hierbei um .shp - ESRI Shapefiles):
Mein Problem taucht bei folgender Struktur auf:
type TObjektRecord = packed record
ShapeType : LongInt;
Box : TBox; // ist x1,y1,x2,y2 of Double = Rechteck
NumParts : LongInt;
NumPoints : LongInt;
Parts : Array of LongInt;
Points : Array of TPunktXY; // ist X,Y : Double
end;
NumParts sagt mir, wie viele Elemente im Array Parts sind.
NumPoints sagt mir, wie viele Elemente im Array Points sind.
Wenn ich jetzt eben hergehe und sage:
var Strom : TFileStream;
try
Strom:=TFileStream.Create(Dateiname, fmOpenRead);
Strom.Read(FileHeader, SizeOf(FileHeader));
except
[...]
end;
alles kein Problem, jedoch
repeat
// RecordHeader einlesen
Strom.Read(RecordHeader, SizeOf(RecordHeader));
Strom.Read(varShapeType, SizeOf(varShapeType));
Strom.Read(varBox, SizeOf(varBox));
Strom.Read(varNumParts, SizeOf(NumParts));
Strom.Read(varNumPoints, SizeOf(NumPoints));
SetLength(varParts, NumParts); <--------------- Hier kommt dann spätestens die
AV, Programmabbruch
SetLength(varPoints, NumPoints);
Strom.Read(varParts, SizeOf(varParts));
Strom.Read(varPoints, SizeOf(varPoints));
until (Strom.Position>FileHeader.FileLen);
Was mache ich falsch, wo ist mein Denkfehler drin?
Vielen Dank im Voraus!!
LG Alex