AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Abbrevia mit streams

Ein Thema von b01 · begonnen am 28. Jul 2006 · letzter Beitrag vom 30. Jan 2008
Antwort Antwort
b01

Registriert seit: 3. Jul 2006
26 Beiträge
 
#1

Abbrevia mit streams

  Alt 28. Jul 2006, 06:35
Folgendes Codefragment macht mir ärger
Delphi-Quellcode:
var ts:TMemoryStream;
...
ts:=TMemoryStream.Create;
CDStest.SaveToStream(ts,dfXMLUTF8);
zip.AddFromStream('neuername',ts);
Hierbei ist CDStest ein TClientDataSet und zip ein TAbZipKit. In der letzten Zeile kommt dann immer folgende unerfreuliche Meldung
Zitat:
... Exception der Klasse EAccessViolation ...
Was läuft da schief? Ist das ein Bug von Abbrevia? Falls ja, womit kann man denn sonst noch tar Archieve verwalten (inkl. Ordner) und streams benutzen?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Abbrevia mit streams

  Alt 28. Jul 2006, 08:22
Ist Dein ClientDataSet vielleicht noch geöffnet?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Abbrevia mit streams

  Alt 28. Jul 2006, 10: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
b01

Registriert seit: 3. Jul 2006
26 Beiträge
 
#4

Re: Abbrevia mit streams

  Alt 28. Jul 2006, 14:56
@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 ts.Position := 0; 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.
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Abbrevia mit streams

  Alt 28. Jul 2006, 15:06
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.
  Mit Zitat antworten Zitat
b01

Registriert seit: 3. Jul 2006
26 Beiträge
 
#6

Re: Abbrevia mit streams

  Alt 29. Jul 2006, 04:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von d1ng0d0gt0r
d1ng0d0gt0r

Registriert seit: 24. Jan 2008
23 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Abbrevia mit streams

  Alt 30. Jan 2008, 21:13
- Sry
44 65 66 2E 20 45 78 74 65 78 6F 3A 20 47 65 6C 64 20 61 62 6E 65 68 6D 65 6E 2C 20 62 65 74 72 FC 67 65 6E 2E
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:31 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