Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Ordentliche Komprimierungsunit

  Alt 16. Aug 2009, 11:35
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

"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat