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