Hallo,
ich habe ein Problem mit der ZLib-Komponente. Das Komprimieren klappt anstandslos, aber mit dem Dekomprimieren gibt es ein großes Problem. Beim Lesen aus dem dekomprimierten Stream (ZStream) (Feld aus IB-Datenbank) mit der festen Buffer-Größe 4096 wird als Ergebnis aus dem Read-Aufruf (<B>Count := ZStream.Read(ZLibBuffer, ZLibBufferSize)</B>) immer die ZLibBufferSize zurückgegeben.
Auch wenn die Daten vollständig dekomprimiert worden sind (die Datei ist korrekt auf der Festplatte und auch lesbar), bricht die Schleife nicht ab.
Was soll ich machen? Hat jemand eine Idee? Ist vielleicht irgendwas mit dem BlobStream falsch? Ich benutze D5Pro UpdatePack 1 deutsch, IB 5, Win2000 Prof..
Lars
Hier kommt der Code-Ausschnitt:
<pre>
implementation
const
ZLibBufferSize = 4096;
var
ZLibBuffer: array[0..ZLibBufferSize - 1] of Byte;
procedure LoadPicture(ID: Integer; var Pic: TPicture);
var
InFile : TStream;
OutFile : TStream;
TextStream : TMemoryStream;
ZStream : TCustomZLibStream;
Count : Integer;
Reading : Boolean;
begin
with DM.qryTemp do begin
Close;
SQL.Clear;
SQL.Add('SELECT ' + fldPicMainPic + ' FROM ' + tblPic);
SQL.Add('WHERE ' + fldPicPicID + '=' + IntToStr(ID));
Open;
InFile := CreateBlobStream(FieldByName(fldPicMainPic), bmRead);
end;//with
if InFile.Size = 0 then begin
InFile.Free;
ShowMessage('Keine Bilddaten in der Datenbank vorhanden');
Exit;
end;
try
OutFile := TFileStream.Create('bild' + IntToStr(ID), fmCreate or fmOpenWrite);
// OutFile := TMemoryStream.Create;
try
ZStream := TDecompressionStream.Create(InFile);
try
Reading := True;
while Reading do begin
Count := ZStream.Read(ZLibBuffer, ZLibBufferSize);
if Count <> 0 then
OutFile.WriteBuffer(ZLibBuffer, Count)
else
Reading := False;
end;//while
finally
ZStream.Free;
end;
// Pic.Bitmap.LoadFromStream(OutFile);
finally
OutFile.Free;
end;
finally
InFile.Free;
end;
end;
</pre>
ich habe ein Problem mit der ZLib-Komponente. Das Komprimieren klappt anstandslos, aber mit dem Dekomprimieren gibt es ein großes Problem. Beim Lesen aus dem dekomprimierten Stream (ZStream) (Feld aus IB-Datenbank) mit der festen Buffer-Größe 4096 wird als Ergebnis aus dem Read-Aufruf (<B>Count := ZStream.Read(ZLibBuffer, ZLibBufferSize)</B>) immer die ZLibBufferSize zurückgegeben.
Auch wenn die Daten vollständig dekomprimiert worden sind (die Datei ist korrekt auf der Festplatte und auch lesbar), bricht die Schleife nicht ab.
Was soll ich machen? Hat jemand eine Idee? Ist vielleicht irgendwas mit dem BlobStream falsch? Ich benutze D5Pro UpdatePack 1 deutsch, IB 5, Win2000 Prof..
Lars
Hier kommt der Code-Ausschnitt:
<pre>
implementation
const
ZLibBufferSize = 4096;
var
ZLibBuffer: array[0..ZLibBufferSize - 1] of Byte;
procedure LoadPicture(ID: Integer; var Pic: TPicture);
var
InFile : TStream;
OutFile : TStream;
TextStream : TMemoryStream;
ZStream : TCustomZLibStream;
Count : Integer;
Reading : Boolean;
begin
with DM.qryTemp do begin
Close;
SQL.Clear;
SQL.Add('SELECT ' + fldPicMainPic + ' FROM ' + tblPic);
SQL.Add('WHERE ' + fldPicPicID + '=' + IntToStr(ID));
Open;
InFile := CreateBlobStream(FieldByName(fldPicMainPic), bmRead);
end;//with
if InFile.Size = 0 then begin
InFile.Free;
ShowMessage('Keine Bilddaten in der Datenbank vorhanden');
Exit;
end;
try
OutFile := TFileStream.Create('bild' + IntToStr(ID), fmCreate or fmOpenWrite);
// OutFile := TMemoryStream.Create;
try
ZStream := TDecompressionStream.Create(InFile);
try
Reading := True;
while Reading do begin
Count := ZStream.Read(ZLibBuffer, ZLibBufferSize);
if Count <> 0 then
OutFile.WriteBuffer(ZLibBuffer, Count)
else
Reading := False;
end;//while
finally
ZStream.Free;
end;
// Pic.Bitmap.LoadFromStream(OutFile);
finally
OutFile.Free;
end;
finally
InFile.Free;
end;
end;
</pre>
Comment