Thema: Delphi Abbrevia mit streams

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Abbrevia mit streams

  Alt 28. Jul 2006, 11:01
Hi,
du gibst recht wenig Code für dieses Beispiel an. An sich gibt es mehrere Gründe, warum deine EAccessViolation auftritt. Ist denn dein zip auch irgendwann mit Create angelegt wurden? Oder ist es automatisch von Delphi erzeugt (zur Designzeit auf dem Formular platziert)?
Dann fehlt natürlich der obligatorische Ressourcenschutzblock
Delphi-Quellcode:
ts := TMemoryStream.Create;
try
  CDStest.SaveToStream(ts,dfXMLUTF8);
  zip.AddFromStream('neuername',ts);
finally
  ts.Free;
end;
Und zu guter Letzt, wie oft hast du denn schon mit Streams gearbeitet? Die Dinger sind sehr sehr einfach aufgebaut. Sehr vereinfacht hast du einfach ein Unendliches Feld (nur durch den verfügbaren Speicher begrenzt), die verwendetet Größe und einen Zeiger auf die aktuelle Position.
Legst du ein neuen Stream an, zeigt der Zeiger auf die erste freie Zelle (also den Anfang des Feldes). Schreibst du x Bytes, so wandert der Zeiger mit und zeigt auf die jetzt aktuelle erste freie Zelle (also x+1). Wenn du jetzt AddFromStream aufrufst, hast du das Problem, dass der Zeiger schon auf das Ende des Feldes zeigt. Hier kannst du kein einziges Byte mehr lesen.
Du solltest also erst den Zeiger schön auf den Anfang setzen und dann lesen:
Delphi-Quellcode:
ts := TMemoryStream.Create;
try
  CDStest.SaveToStream(ts,dfXMLUTF8);
  // <- hier ist ts.Position = dfXMLUTF8
  ts.Position := 0; // <- jetzt wieder auf den Anfang gesetzt
  zip.AddFromStream('neuername',ts);
finally
  ts.Free;
end;
Gruß Der Unwissende
  Mit Zitat antworten Zitat