![]() |
Instanz von TXMLDocument zur Laufzeit Erstellen und Benutzen
Dazu habe ich ein Problem! :wink:
Das ist erstmal mein Code:
Delphi-Quellcode:
Problem ist nun, das es beim setzen vom Active-Wert zu einer Zugriffsverletzung kommt, aber nicht immer, aber spätestens beim auslesen einer Eigenschaft...
Procedure TForm1.cmd1Click( Sender: TObject );
Var XML: TXMLDocument; Begin XML := Nil; { odFile == TOpenDialog } If odFile.Execute Then Begin Try XML := TXMLDocument.Create( Nil ); XML.LoadFromFile( odFile.FileName ); XML.Active; { txtOut == TMemo } txtOut.Lines.Append( 'Version:'#9#9 + XML.Version ); txtOut.Lines.Append( 'Encoding:'#9 + XML.Encoding ); txtOut.Lines.Append( 'StandAlone:'#9 + XML.StandAlone ); txtOut.Lines.Append( 'NamespaceURI:'#9 + XML.DocumentElement.NamespaceURI ); txtOut.Lines.Append( 'LocalName:'#9 + XML.DocumentElement.LocalName ); Finally If Assigned( XML ) Then FreeAndNil( XML ); End; End; End; Das Dokument was ich lade ist IO, wenn ich das TXMLDocument zur Entwicklungszeit auf die Form schieb und benutz funzt es ja... Wo is der plöde Fehler? :gruebel: Bye |
Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
Hab zwar von XML kaum Ahnung, abere schon mal so versucht?
Delphi-Quellcode:
Procedure TForm1.cmd1Click( Sender: TObject );
Var XML: TXMLDocument; Begin If odFile.Execute Then Begin XML := TXMLDocument.Create( Form1 ); // oder wie es bei dir heißt Try XML.LoadFromFile( odFile.FileName ); XML.Active; txtOut.Lines.Append( 'Version:'#9#9 + XML.Version ); txtOut.Lines.Append( 'Encoding:'#9 + XML.Encoding ); txtOut.Lines.Append( 'StandAlone:'#9 + XML.StandAlone ); txtOut.Lines.Append( 'NamespaceURI:'#9 + XML.DocumentElement.NamespaceURI ); txtOut.Lines.Append( 'LocalName:'#9 + XML.DocumentElement.LocalName ); XML.Inactive; // hab gerade keine Plan, wie diese Funktion // wirklich heißt. (halt das Gegenteil von XML.Active) Finally If Assigned( XML ) Then FreeAndNil( XML ); End; End; End; |
Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
Hmm damit geht es, warum auch immer...
Aber der Constructor ist überladen, sprich es gibt noch eine andere Art ihn aufzurufen: [oh]
Delphi-Quellcode:
[/oh]
constructor Create(const AFileName: DOMString); reintroduce; overload;
constructor Create(AOwner: TComponent); overload; override; Wenn ich ihn so aufrufe, passiert das selbe wie wenn ich ihn mit Nil aufrufe und die Dateilade und die Form auf Active setze... Aber warum? Fehlt mir noch was? Bye |
Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
Hi,
der Umgang mit TXMLDocument ist gelinde gesagt, ganz großer Schrott!!! :kotz: Ich hab erst kürzlich damit gearbeitet, und genau diesen Fehler gehabt. Versuch es mal so (bei dem Teil muss man mit Interface-Instanzen arbeiten, aber frag mich nicht, warum):
Delphi-Quellcode:
Procedure TForm1.cmd1Click( Sender: TObject );
Var XML: IXMLDocument; // <-- Interface!!! Begin XML := Nil; { odFile == TOpenDialog } If odFile.Execute Then Begin Try XML := TXMLDocument.Create(odFile.FileName); { txtOut == TMemo } txtOut.Lines.Append( 'Version:'#9#9 + XML.Version ); txtOut.Lines.Append( 'Encoding:'#9 + XML.Encoding ); txtOut.Lines.Append( 'StandAlone:'#9 + XML.StandAlone ); txtOut.Lines.Append( 'NamespaceURI:'#9 + XML.DocumentElement.NamespaceURI ); txtOut.Lines.Append( 'LocalName:'#9 + XML.DocumentElement.LocalName ); Finally XML := nil; // <-- wird nicht über Free gemacht End; End; End; |
Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
Delphi-Quellcode:
vieleicht liegts am override?
DOMString); reintroduce; overload;
Component); overload; [b]override; [/b] Versuch mal bei beiden die selben Angaben zu machen
Delphi-Quellcode:
oder
DOMString); reintroduce; overload;
Component); reintroduce; overload;
Delphi-Quellcode:
DOMString); overload;
Component); overload; [add] @Stevie
Delphi-Quellcode:
Und wer gibt den Speicher wieder frei? (so wird ja nur der Zeiger darauf gelöscht)
XML := nil; // <-- wird nicht über Free gemacht
|
Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
:wiejetzt: Öhm So geht es schon einmal aber verstehen tu ich nu gar nichts mehr...
Mit Interfaces hab ich noch nie gearbeitet... Hab auch keinen Plan wie das geht aber: IXMLDocument ist doch was ganz anderes als TXMLDocument, aber IXMLDocument ist ein Interface von TXMLDocument richtig ? :cyclops:
Delphi-Quellcode:
Die Komponente auf der Form heißt aber auch TXMLDocument :duck:
//...
TXMLDocument = class(TComponent, IInterface, IXMLDocument, IXMLDocumentAccess) //... Und wenn ich TXMLDocument.Create mit einem Owner aufrufe läuft es ja auch, aber warum nicht ohne? :gruebel: Irgendwie bedarf das noch ein wenig Erklärung... Bye |
Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
Zitat:
Zitat:
Wie gesagt, kenne mich mit Interfaces und Interfaceinstanzen nicht aus... bye |
Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
Also, erstmal: entweder erstellst du dynamisch die Komponente, so wie oben oder du benutzt die Komponente und dann raus mit dem Create aus deinem Source! ;-)
Mehr kann ich dir leider auch nicht dazu sagen, leider scheint das Teil sehr buggy zu sein, und andererseits unkommentiert und dokumentiert. Aber es gibt auch gute freie XML-Komponenten, die du benutzen kannst. Wie gesagt, durch eigenes Rumprobieren und stöbern beim ![]() |
Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
Hi,
das besagte Verhalten ist wahrscheinlich ein Bug in der TXMLDocument Komponente. ![]() Ich arbeite bisher ohne Probleme mit IXMLDocument. mfG mirage228 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 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