Hi Greeny,
Für dich dürfte es keine geeignete Kompressions-
Unit geben. Du kannst nämlich mit egal welcher Klasse nicht richtig umgehen.
Bei mir funktioniert
ZLib ganz prächtig, aber ich weiss auch, wie man die Library verwenden muss. Der Hauptfehler befindet sich übrigens in 99% der Fälle ca. 80cm vom Bildschirm entfernt und zeigt mit dem Finger auf andere.
Hier eine dezent korrigierte Version, sowie eine Alternative, die etwas kompakter ist, da sie den zu komprimierenden Stream einfach per CopyFrom direkt in
ZLib reinbläst, anstatt sie in 2k-Happen zu komprimieren (Meine
Unit kennt übrigens kein TZCompressionStream, vielleicht liegt es auch daran):
Delphi-Quellcode:
procedure TForm2.Compress;
var
zc: TCompressionStream;
ms1: TMemoryStream;
buff: array[0..2048] of byte;
len: integer;
begin
ms1 := TMemoryStream.Create;
ms.position := 0; // 1.Fehler, ms war am Ende und u.g. 'read' lieferte 0 bytes.
try
zc := TCompressionStream.Create(clMax, ms1);
try
repeat
len := ms.Read(buff, 2048);
zc.Write(buff, len);
until len <> 2048;
lRateOfCompression.Caption := Format('%.3f', [zc.CompressionRate]);
finally
zc.free; // 2.Fehler: Der ZCompressionStream hat noch Einiges im Puffer
end;
ms.clear; // 3.Fehler: Alten Stream löschen
ms.CopyFrom(ms1, 0); // 4.Fehler: ms1 komplett von Anfang an kopieren
finally
ms1.Free;
end;
end;
procedure TForm2.Compress1;
var
zc: TCompressionStream;
ms1: TMemoryStream;
begin
ms1 := TMemoryStream.Create;
try
zc := TCompressionStream.Create(clMax, ms1);
try
zc.CopyFrom(ms, 0);
finally
zc.free;
end;
lRateOfCompression.Caption := Format('%.3f', [zc.CompressionRate]);
ms.clear;
ms.CopyFrom(ms1, 0);
finally
ms1.free;
end;
end;
Bevor Du dich über meine Sticheleien echauffierst, bedenke, das Du dich sehr weit aus dem Fenster gelehnt hast und offenbar über eine gehörige Portion Selbstbewustsein verfügst, denn sonst würdest Du nicht allen Ernstes als 'GreenHorn' eine dermaßen erprobte
Unit wie
ZLib in Frage stellen. Soviel Chuzpe muss man erstmal haben