Also mich wundert da gerade etwas. Ein dynamisches Array ist doch eigentlich auch nichts anderes als ein Pointer. Somit hast du lediglich den Pointer des Bitmaps gegen einen Anderen ausgetauscht. Und eigentlich müssen die Records auch immer die gleiche Größe haben wenn ich mich recht entsinne. Und wenn du variable Speicherbereiche (Bitmaps) hast lässt sich so etwas nur schwer realisieren.
Ich würde dir da besser empfehlen, dass du es eher folgendermaßen erledigst. Lass das File of und benutzt die Klasse TStream. Für Dateien dann die Ableitung TFileStream. Zu mal du dann auch das Bitmap direkt laden kannst. Bzw könnte der Stream dann auch woanders herkommen. Zum Beispiel
Indy, Memorystream etc.
Delphi-Quellcode:
Type
TNetDeviceInfo = packed record
Typ,
PositionX,
PositionY : integer;
BitmapLength: Cardinal;
Bitmap: TBitmap;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
ND: TNetDeviceInfo;
FS: TFileStream;
begin
FS := TFileStream.Create('test.dat', fmOpenRead);
try
// Hier wichtig. Beschreibung siehe unten.
FS.Read(ND, SizeOf(ND) - SizeOf(TBitmap));
ND.Bitmap := TBitmap.Create;
ND.Bitmap.LoadFromStream(FS);
finally
FS.Free;
end;
end;
Das Bitmap hängt nur im Record, da es mit dazu gehört. Es soll aber nicht in die Datei geschrieben oder aus ihr gelesen werden. Evtl. würde ich da überlegen das TNetDeviceInfo noch mal zu kappseln und das record jetzt als Header zu sehen. Sonst kann es schnell mal passieren, dass du den Pointer des Bitmaps doch mal mit schreibst. Ist nur für die Sicherheit.
Beim Schreiben solltest du das Bitmap aber trotzdem noch in einen MemoryStream packen, da du die Größe wahrscheinlich benötigen wirst. Ansonsten weißt du nicht an welche Stelle du hingehen müsstest um das nächste Record zu lesen ohne, dass du das Bitmap komplett einlesen lässt. So kannst du es einfach überspringen.
Bei Records die mit Dateien oder Speicherblöcken zu tun haben solltest du immer packed benutzen. Das sorgt dafür, dass Delphi das Record nicht automatisch erweitert. Sonst kann es passieren, dass du nicht benutzten Speicher in der Datei hast der so nicht beabsichtig ist. Wenn sich dann jemand anderes ausversehen genau an die Spezifikation hält geht es nicht mehr.