AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Dekomprimierung eines Streams

Ein Thema von GreenHorn3600 · begonnen am 23. Aug 2009 · letzter Beitrag vom 24. Aug 2009
Antwort Antwort
Seite 2 von 3     12 3   
Muetze1
(Gast)

n/a Beiträge
 
#11

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 18:32
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...
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#12

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 18:34
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#13

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 18:39
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...
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#14

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 18:42
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#15

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 18:45
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#16

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 18:54
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#17

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 19:01
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#18

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 19:05
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

Seit wann (Delphiversion) gibt es denn TZCompressionStream?
Anstatt da statisch nur auf die beiden Versionen einzugehn, würde ich einfach ab dieser Version umschalten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#19

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 19:15
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

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#20

Re: Dekomprimierung eines Streams

  Alt 23. Aug 2009, 19:19
hmmm, sehr eigenartig

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}
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:19 Uhr.
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