hallo,
ich möchte in einen Filestream meine Daten schreiben, darunter wie der Titel schon sagt auch Bilder.
Um die Größe der Datei zu verringern verwende ich die ZLibEx-
Unit (
Zlib 1.2.3). Wenn ich meine Daten ohne Bilder speichere und dann lade, funktioniert das ganze.
Wenn ich jetzt aber auch Bilder speichere, dann kommt beim Laden immer eine
AV! Ich hab hier im Forum nur den Hinweis gelesen, dass angeblich LoadFromStream bis zum Ende des Streams ließt. Wenn dem so wäre, ist natürlich klar worans liegt
...
hier mal mein Code:
Delphi-Quellcode:
procedure Speichere(const DateiName: string);
var
Datei: TFileStream;
Zipper: TZCompressionStream;
Grafik: TGraphic;
begin
//... Fehlerüberprüfungen
try
//Datei erzeugen, bzw. leeren
Datei := TFileStream.Create(Dateiname, fmCreate, fmShareExclusive)
//Zipper erzeugen und mit "Datei" verknüpfen
Zipper := TZCompressionStream.Create(Datei, zcMax);
try
//... Infos und Anzahl der gespeicherten Bilder schreiben
for b := 1 to AnzahlBilder do
try
Grafik := TBitmap.Create;
with Grafik as TBitmap do
begin
LoadFromFile(GrafikPfad[b - 1]);
SaveToStream(Zipper);
end;
finally
FreeAndNil(Grafik);
end;
except
//... Fehlerbehandlung
end;
finally
//Zipper wieder freigeben
FreeAndNil(Zipper);
//Datei wieder freigeben
FreeAndNil(Datei);
end;
end;
procedure Lade(const DateiName: string);
var
Datei: TFileStream;
EntZipper: TZDecompressionStream;
begin
try
//Datei zum Lesen öffnen
Datei := TFileStream.Create(Dateiname, fmOpenRead, fmShareExclusive)
//EntZipper erzeugen und mit "Datei" verknüpfen
EntZipper := TZDecompressionStream.Create(Datei);
try
//... Infos und Anzahl der gespeicherten Bilder auslesen
for b := 1 to AnzahlBilder do
begin
Grafiken[b - 1] := TBitmap.Create;
with (Grafiken[b - 1] as TBitmap) do
LoadFromStream(EntZipper); //<--- HIER DER FEHLER!!!
end;
except
//... Fehlerbehandlung
end;
finally
//EntZipper wieder freigeben
FreeAndNil(EntZipper);
//Datei wieder freigeben
FreeAndNil(Datei);
end;
end;
end.
ps: ich hab den code auf das Wesentliche reduziert, das sollte auch die case-schleife und die
Verwendung von TGraphic statt TBitmap erklären...
pps: die anderen Werte schreibe ich mit Zipper.Read(Variable, SizeOf(Variable)) und lese sie so auch
wieder