Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Instanz von TXMLDocument zur Laufzeit Erstellen und Benutzen (https://www.delphipraxis.net/40869-instanz-von-txmldocument-zur-laufzeit-erstellen-und-benutzen.html)

Kedariodakon 22. Feb 2005 12:18


Instanz von TXMLDocument zur Laufzeit Erstellen und Benutzen
 
Dazu habe ich ein Problem! :wink:

Das ist erstmal mein Code:
Delphi-Quellcode:
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;
Problem ist nun, das es beim setzen vom Active-Wert zu einer Zugriffsverletzung kommt, aber nicht immer, aber spätestens beim auslesen einer Eigenschaft...
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

himitsu 22. Feb 2005 12:32

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;

Kedariodakon 22. Feb 2005 12:45

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:
constructor Create(const AFileName: DOMString); reintroduce; overload;
constructor Create(AOwner: TComponent); overload; override;
[/oh]

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

Stevie 22. Feb 2005 12:53

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;

himitsu 22. Feb 2005 12:56

Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
 
Delphi-Quellcode:
DOMString); reintroduce; overload;
Component); overload; [b]override; [/b]
vieleicht liegts am override?

Versuch mal bei beiden die selben Angaben zu machen
Delphi-Quellcode:
DOMString); reintroduce; overload;
Component); reintroduce; overload;
oder
Delphi-Quellcode:
DOMString); overload;
Component); overload;



[add]
@Stevie
Delphi-Quellcode:
XML := nil; // <-- wird nicht über Free gemacht
Und wer gibt den Speicher wieder frei? (so wird ja nur der Zeiger darauf gelöscht)

Kedariodakon 22. Feb 2005 13:08

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:
//...
TXMLDocument = class(TComponent, IInterface, IXMLDocument, IXMLDocumentAccess)
//...
Die Komponente auf der Form heißt aber auch TXMLDocument :duck:
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

Kedariodakon 22. Feb 2005 13:12

Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
DOMString); reintroduce; overload;
Component); overload; [b]override; [/b]
vieleicht liegts am override?

Das hab ich ja nicht da hin gemacht, das ist doch Delphi-Source...


Zitat:

Zitat von himitsu
Delphi-Quellcode:
XML := nil; // <-- wird nicht über Free gemacht
Und wer gibt den Speicher wieder frei? (so wird ja nur der Zeiger darauf gelöscht) ?

hmm liegt das net daran, das er mit einem IXMLDocument (Interface) statt einem TXMLDocument(Object) arbeitet?

Wie gesagt, kenne mich mit Interfaces und Interfaceinstanzen nicht aus...


bye

Stevie 22. Feb 2005 13:15

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 großen Orakel bin ich auf diese Lösung gekommen.

mirage228 22. Feb 2005 17:22

Re: Instanz von TXMLDocument zur Laufzeit Erstellen und Benu
 
Hi,

das besagte Verhalten ist wahrscheinlich ein Bug in der TXMLDocument Komponente.

Hier hatte ich auch diese Lösung für das Problem erhalten.

Ich arbeite bisher ohne Probleme mit IXMLDocument.

mfG
mirage228


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:38 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