Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi TXMLDocument nicht als Componente (https://www.delphipraxis.net/91464-txmldocument-nicht-als-componente.html)

FrankBrin 5. Mai 2007 09:36


TXMLDocument nicht als Componente
 
Moin miteinander,
hab da ein Problem, wo ich trotz aller Suche kein zufriedenstellendes Ergebnis gefunden habe.

Ich habe mir zum Lesen und Schreiben einer XML Datei zuerst ein Form gebaut auf dem ich das TXMLDocument gezogen hatte. Bis hierher alles prima!

Nun ist die App ein bischen größer geworden und mir viel auf, das ich die Funktionalitäten, die direkt mit der XML-Datei arbeiten an vielen anderen Stellen auch benötige.
Also habe ich eine eigene Unit (TObject) draus gemacht. So und jetzt kommt ständig sobald ich auf einen Node zugreifen will ein

"Access Violation".

Der Zarko Gajic hat auf seiner About Seite so etwas schon angedeutet. Er sagt das man das Dokument jedesmal, wenn man mit arbeitet erst öffnen muss??? Das geht doch bestimmt einfacher.

Kann mir jemand hier weiterhelfen?

Gruß Frank

EConvertError 5. Mai 2007 11:51

Re: TXMLDocument nicht als Componente
 
Es ist ein bekannter Fehler, dass sich das TXMLDocument nicht dynamisch erstellen lässt.

Folgender Code umgeht das Problem:
Delphi-Quellcode:
uses xmldom, XMLIntf, msxmldom, XMLDoc;
...
var XMLDoc: IXMLDocument;
...
{ Create XML document }
 XMLDoc:= TXMLDocument.Create(nil);
  { Assign default values... }
  with XMLDoc do begin
    Options:= [doNodeAutoCreate, doNodeAutoIndent,doAttrNull,doAutoPrefix,doNamespaceDecl];
    ParseOptions:= [];
    NodeIndentStr:= ' ';
  end;

  XMLDoc.Active:= TRUE;

{ Destroy XML document }
XMLDoc:= nil;
Viel Spaß damit,
Andreas

FrankBrin 5. Mai 2007 12:01

Re: TXMLDocument nicht als Componente
 
Hallo Andreas,
soweit ist mir das ja auch schon klar! Ob das nun ein Fehler ist oder reiner Wille sei dahin gestellt!

Dein Codefragment sagt leider nix darüber aus, wie ich denn das XMLDocument über die Lebenszeit einer Klasse am Leben erhalte.

Gibt es da überhaupt eine Möglichkeit?

Gruß Frank

PS.: Derzeit habe ich das XMLDocu mit all seinen Funktionen mal in eine TDataModul Klasse gesetzt - gefällt mir nicht - tut aber!

EConvertError 5. Mai 2007 12:07

Re: TXMLDocument nicht als Componente
 
Zitat:

Dein Codefragment sagt leider nix darüber aus, wie ich denn das XMLDocument über die Lebenszeit einer Klasse am Leben erhalte.
Du kannst ja statt einer globalen Variable das XMLDoc als private-Feld einer Klasse deklarieren. Aber ich nehme an, du meinst Lebenszeit eines Objekts.

Delphi-Quellcode:
var XMLDoc: IXMLDocument;
Solange du XMLDoc nicht auf nil setzt, bleibt es im Speicher. Es gab sogar mal einen BDN-Artikel dazu, aber ich kann ihn nicht mehr finden.

mfg,
Andreas

FrankBrin 5. Mai 2007 12:14

Re: TXMLDocument nicht als Componente
 
Andreas,
ok, jetzt ist mir mein Fehler auch klar! Ich muss die Variable als IXMLDocument zugänglich deklarieren und mit Deinem CodeFragment dann zuweisen!

Werd's gleich mal einbauen!

Gruß und Danke
Frank

EConvertError 5. Mai 2007 12:19

Re: TXMLDocument nicht als Componente
 
Ja, man muss die Variable als IXMLDocument statt als TXMLDocument deklarieren. Die Lösung hat nur den einen Nachteil, dass man den DOM-Provider nicht auswählen kann.

Mir hat dieses Problem ebenfalls monatelange Sorgen bereitet.

mfg,
Andreas

FrankBrin 5. Mai 2007 12:23

Re: TXMLDocument nicht als Componente
 
Also daß funktioniert mittlerweile! Mit dem DOMVendor ist mir im Augenblick egal, da ich sowieso mit dem MSXML Parser arbeite und dieser ja hoffentlich voreingestellt ist.

Gruß Frank


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