![]() |
Abbrevia mit streams
Folgendes Codefragment macht mir ärger
Delphi-Quellcode:
Hierbei ist CDStest ein TClientDataSet und zip ein TAbZipKit. In der letzten Zeile kommt dann immer folgende unerfreuliche Meldung
var ts:TMemoryStream;
... ts:=TMemoryStream.Create; CDStest.SaveToStream(ts,dfXMLUTF8); zip.AddFromStream('neuername',ts); Zitat:
|
Re: Abbrevia mit streams
Ist Dein ClientDataSet vielleicht noch geöffnet?
|
Re: Abbrevia mit streams
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:
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.
ts := TMemoryStream.Create;
try CDStest.SaveToStream(ts,dfXMLUTF8); zip.AddFromStream('neuername',ts); finally ts.Free; end; 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:
Gruß Der Unwissende
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; |
Re: Abbrevia mit streams
@Union: Ich habe beide Möglichkeiten ausprobiert, der Fehler tritt jedoch immer auf.
@Der_Unwissende: Zip ist zur Designzeit auf dem Formular plaziert worden. Natürlich hast du mit dem Ressourcenschutzblock recht, da das am Fehler aber nichts ändert habe ich ihn hier weggelassen. An das
Delphi-Quellcode:
habe ich in der Tat nicht gedacht. Leider hat das einfügen dieser Codezeile den Fehler nicht verhindert. Da ts.position nach dem SaveToStream immer einen Wert größer 0 hat gehe ich mal davon aus das das ClientDataSet die Daten erfolgreich in den Stream geschrieben hat.
ts.Position := 0;
|
Re: Abbrevia mit streams
Ok, gut, dann gehen wir doch mal weitere typische Fehler durch:
Hast du denn einen Dateinamen angegeben? Der muss übringens auch eine gültige Erweiterung (z.B. .zip) aufweisen. Abbrevia orientiert sich echt an der Benennung! Ja, wenn die auf dem Formular platziert wurde, sollte es eine gültige Instanz geben. An sich wundert es mich, dass es zu einer EAccessViolation kommt. Also andere Fehler kann mir ja noch erklären, aber diesen... Ein anderer Punkt wäre noch self.zip zu verwenden. Ich meine ich kenne einfach nicht die ganze Mehthode, kann ja sein dass du versehentlich eine lokale Variable gleichen Typs hast, die dann natürlich verwendet wird. |
Re: Abbrevia mit streams
Danke für deine Hilfe.
Nach einer Langen Zeit erfolgloser try and error Versuche weiss ich jetzt das meine Delphi installation Schuld ist. Auf zwei anderen Systemen läuft der von dir gepostete Code Fehlerfrei. |
Re: Abbrevia mit streams
- Sry
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz