Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dekomprimierung eines Streams (https://www.delphipraxis.net/139097-dekomprimierung-eines-streams.html)

Muetze1 23. Aug 2009 17:32

Re: Dekomprimierung eines Streams
 
1. TDecompressionStream gibt den im Constructor angegeben Stream nicht frei.
2. Der Fehler liegt einfach nur daran, dass du den als aStream übergebenen Stream mit TFileStream nur zum Lesen geöffnet hast und nun mit Size := 0 und CopyFrom() beschreiben willst, was dieser (aus verständlichen Gründen) verweigert...

GreenHorn3600 23. Aug 2009 17:34

Re: Dekomprimierung eines Streams
 
So, hab den Fehler nun gefunden. Der Quellstream (Filestream) war nur zum lesen geöffnet.

Delphi-Quellcode:
{Kompremiert den Stream}
PROCEDURE CompressStream(aStream: TStream);
VAR
 {$ifdef VER200} //Delphi 2009
  zc: TZCompressionStream;
 {$else}
  {$ifdef VER180} //Delphi 2006 or Turbo Delphi
   zc: TCompressionStream;
  {$endif}
 {$endif}
  ms: TMemoryStream;
BEGIN
  ms := TMemoryStream.Create;
  TRY
  {$ifdef VER200} //Delphi 2009
   zc := TZCompressionStream.Create(ms, zcMax);
  {$else}
   {$ifdef VER180} //Delphi 2006 or Turbo Delphi
    zc := TCompressionStream.Create(clMax, ms);
   {$endif}
  {$endif}
    TRY
      zc.CopyFrom(aStream, 0);
    FINALLY
      zc.Free;
    END;
    aStream.Size := 0;
    aStream.copyFrom(ms, 0);
  FINALLY
    ms.Free;
  END;
END;

{Dekompremiert den Stream}
PROCEDURE DecrompressStream(aStream: TStream);
VAR
 {$ifdef VER200} //Delphi 2009
  zc: TZDecompressionStream;
 {$else}
  {$ifdef VER180} //Delphi 2006 or Turbo Delphi
   zc: TDecompressionStream;
  {$endif}
 {$endif}
  ms: TMemoryStream;
BEGIN
  ms := TMemoryStream.Create;
  TRY
  {$ifdef VER200} //Delphi 2009
   zc := TZDecompressionStream.Create(aStream);
  {$else}
   {$ifdef VER180} //Delphi 2006 or Turbo Delphi
    zc := TDecompressionStream.Create(aStream);
   {$endif}
  {$endif}
    TRY
      ms.CopyFrom(zc, 0);
    FINALLY
      zc.Free;
    END;
    aStream.Size := 0;
    aStream.copyFrom(ms, 0);
  FINALLY
    ms.Free;
  END;
END;
Danke für Eure Hilfe.

Greeny
:cheers: :cheers:

Muetze1 23. Aug 2009 17:39

Re: Dekomprimierung eines Streams
 
Zitat:

Zitat von GreenHorn3600
So, hab den Fehler nun gefunden. Der Quellstream (Filestream) war nur zum lesen geöffnet.

Was man schon im 1. Post an der Meldung des TStreams gesehen hat. Aber die Glaskugeln sind hier wohl alle recht vereicht über die Zeit...

GreenHorn3600 23. Aug 2009 17:42

Re: Dekomprimierung eines Streams
 
Wenn man schon mal den Fehler hatte, lässt er sich sicher einfach lokalisieren. Aber scheint so, als ob nicht nur meine Glaskugel in den Urlaub ist.

Dank Euch
:cheers: :cheers:

Muetze1 23. Aug 2009 17:45

Re: Dekomprimierung eines Streams
 
Zitat:

Zitat von GreenHorn3600
Wenn man schon mal den Fehler hatte, ...

Hatte ich noch nie, ist aber ein dokumentiertes Verhalten von File Handles des WinAPI und somit von TStream Nachfahren. Ansonsten ist es auch durch den mir bekannten Quellcode von TStream eindeutig, da hier einfach nur eine WinAPI Meldung durchgereicht wird.

himitsu 23. Aug 2009 17:54

Re: Dekomprimierung eines Streams
 
PS: auch ohne es auszuprobieren, bin ich mir sicher, daß es, wenn für deinen QuellCode kein D2006 oder D2009 verwendet wird, es bei zc.CopyFrom(aStream, 0); einen Compilerfehler hageln wird, daß zc unbekannt ist, da es vorher nicht deklariert wurde.

[edit]
ja und nun bin ich mal neugierig, was da bei meinem TestCode falsch lief, da der verwendete MemoryStream ja sozusagen Lese- und Schreibrechte gewären sollte.

GreenHorn3600 23. Aug 2009 18:01

Re: Dekomprimierung eines Streams
 
Hallo himitsu,

da hast Du recht, der Code läuft aktuell nur auf D2006 und D2009. Eine Anpassung überlasse ich gerne den Freiwilligen, welche den WebUpdater verwenden möchten. Da ich mit beiden Entwicklungsumgebungen arbeite, ist es für mich derzeit gut so. Produktiv bin ich nur noch mit D2009 unterwegs.

Schau Dir mal in meinen Post, die Procedure zum Komprimieren eines Streams an. Mir scheint, daß hier (bei deiner Komprimierunsroutine) etwas im argen liegt.

Grüße
Greeny

himitsu 23. Aug 2009 18:05

Re: Dekomprimierung eines Streams
 
Also das Komprimieren hatte ich grad hinbekommen, aber das Dekomprimieren sieht genauso aus, wie bei dir und wie gesagt, ich verwende ja 'nen MemoryStream und da würde ich eigentlich kein Problem bezüglich nur Lesen sehen :gruebel:

Seit wann (Delphiversion) gibt es denn TZCompressionStream?
Anstatt da statisch nur auf die beiden Versionen einzugehn, würde ich einfach ab dieser Version umschalten.

GreenHorn3600 23. Aug 2009 18:15

Re: Dekomprimierung eines Streams
 
hallo himitsu,

wenn ich deinen Kode nehme, den Stream am Schluß wieder freigebe und meine beiden Routinen einsetze, scheint es zu funktionieren.

Wie macht man das denn, für alle Versionen darüber und darunter freizugeben? Ich bin ja nur ein GreenHorn :roll:

Den TZC../TCD.. gibts bei D2009 und dies ist halt meine hauptsächlich verwendete Version. Darunter sind diese nicht zu finden (hab auch nur in D2006 gesucht).

Noch einen schönen Sonntag
Greeny

himitsu 23. Aug 2009 18:19

Re: Dekomprimierung eines Streams
 
hmmm, sehr eigenartig :shock:

seit 'ner ganzen Weile können die Compiler das $IF und somit ist da soetwas möglich
> CompilerVersion ist eine virtuelle Konstante in der Unit System,
> welche aber in Wirklichkeit vom Compiler gesetzt wird
Delphi-Quellcode:
{$if CompilerVersion >= 20.0} // ab Delphi 2009
  zc: TZCompressionStream;
{$else}
  zc: TCompressionStream;
{$ifend}


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz