Einzelnen Beitrag anzeigen

Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#9

Re: Bitmap speichern mit File of MyRecord

  Alt 12. Okt 2007, 08:35
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.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat