Graphic / Stream, nach dem 2ten mal kaput
-
Hallo, und danke schonmal für Eure Hilfe.
Folgender Ablauf: Der Benutzer drückt auf einen Button, es öffnet sich ein "Datei öffnen"-Dialog. Der Benutzer wählt eine XML-Datei aus. Diese wird geparst und alle Werte werden den jeweiligen Feldern zugewiesen. In der XML-Datei ist auch ein base64 kodiertes Bild. Dies wird beim ersten öffnen der Datei auch richtig eingelesen und angezeigt. Beim zweiten mal gibt es folgende Fehlermeldung "Im Projekt dateiname.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00426D6B in Modul 'dateiname.exe'. Lesen von Adresse 66AEB5FE'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen."
Hier der Abschnitt bei dem der Fehler auftritt, ohne den kann die Datei mehrmals eingelesen werden:
if (XML->DocumentElement->ChildNodes->FindNode("eventpicture") && XML->DocumentElement->ChildNodes->FindNode("eventpicture")->NodeValue.Type() > 1) { TStringStream *picturedata = new TStringStream(""); picturedata->WriteString(MimeDecodeString(XML->DocumentElement->ChildNodes->FindNode("eventpicture")->NodeValue)); picturedata->Seek(0, soFromBeginning); if ((AnsiString)XML->DocumentElement->ChildNodes->FindNode("eventpicture")->AttributeNodes->FindNode("type")->NodeValue == "gif") { TGIFImage *graphic = new TGIFImage; graphic->LoadFromStream(picturedata); delete step4eventimage->Picture->Graphic; step4eventimage->Picture->Graphic = graphic; delete graphic; } delete picturedata; }
Gruß
Enrico[ Dieser Beitrag wurde am 30.06.2003 um 08:57 Uhr von Enrico Stahn editiert. ]
-
Ich würd' mir das hier nochmal genau überlegen:
delete step4eventimage->Picture->Graphic; step4eventimage->Picture->Graphic = graphic; delete graphic;
Gruss
Gast
-
Also ich seh da keinen Fehler, zumindest nicht mit meinem momentanen Wissen
Edit:
Zitate bitte auf das Notwendigste beschränken. Danke![ Dieser Beitrag wurde am 30.06.2003 um 15:18 Uhr von Jansen editiert. ]
-
Original erstellt von Enrico Stahn:
Also ich seh da keinen Fehler, zumindest nicht mit meinem momentanen WissenIch glaube er findet es net so toll, dass du mit delete eine Variable freigibst ihr dann aber wieder etwas zuweist... *hint*
Edit:
Zitate bitte auf das Notwendigste beschränken. Danke![ Dieser Beitrag wurde am 30.06.2003 um 15:18 Uhr von Jansen editiert. ]
Edit: Sorry Jansen
[ Dieser Beitrag wurde am 30.06.2003 um 15:33 Uhr von MikeSPK editiert. ]
-
Wenn ich das nicht freigebe bevor ich es neu belege, geht der Speicher verloren, oder etwa nicht? *confused*
[ Dieser Beitrag wurde am 30.06.2003 um 15:20 Uhr von Enrico Stahn editiert. ]
-
Wenn, dann müsstest du mit new vor der neuen Zuweisung auch wieder neuen Speicher reservieren.
Üblicherweise verwalten VCL-Komponenten den benötigten Speicher aber selbst, so dass du dich nicht darum kümmern musst.
-
Wie war das noch gleich mit dem "Wald vor lauter Bäumen"
Nachdem ich das mit delete ... auskommentiert habe, gings auch mehrmals.Gibt es jetzt noch irgendeine Clear() Methode mit der ich eine Grafik aus einem TImage-Objekt löschen kann? Da ja vielleicht in der 2ten XML-Datei kein Bild drin ist usw.
-
FAQ, unter "Grafik"!?
-
Danke.