Erstell dir eine Dummy-TComponent-Instanz die du dem constructor übergibst. So funktionierts nicht.
Doch, mit der letztgenannten Lösung funktioniert es tatsächlich: Ich weise dem Create der Klasseninstanz als Owner das aufrufende Formular zu und kann dann ohne Probleme diesen Owner auch der Instanz von TXmlDocument zuweisen.
Das Problem liegt in der gemischten Verwendung von Interfaces und der Klassen-Instanz.
Was meinst du damit genau? Wo verwende ich diese beiden gemischt? Der Fehler in der ersten Variante
XmlDok := TXmlDocument.Create(nil);
wird ja bereits beim Versuch, auf das Root-Element zuzugreifen, ausgelöst. Und
TXmlDocument.DocumentElement
ist doch eine Eigenschaft von
TXmlDocument
, oder etwa nicht?
Lösung: XmlDok:IXmlDocument;
, dann klappt es auch ohne Owner
Okay, das habe ich versucht. IXmlDocument kann nicht erzeugt werden, denn es verfügt nicht über eine Create-Methode.
Delphi-Quellcode:
procedure TFormMain.XMLfile_Open(const Datei: String);
Var
XmlDok : IXmlDocument;
Root : IXmlNode;
Txt : String;
begin
Try
XmlDok.LoadFromFile(Datei); // erzeugt Zugriffsverletzung
Root := XmlDok.DocumentElement;
If Root.HasChildNodes Then
Begin
Txt := Root.ChildNodes['rootfiles'].ChildNodes['rootfile'].AttributeNodes['full-path'].Text;
Memo1.Lines.Append(Txt);
End;
Finally
XmlDok := nil;
End;
end;
Der Versuch, ein
XML-Dokument zu laden, löst jedoch eine Zugriffsverletzung aus:
Im Projekt XMLTEST.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0047C70D in Modul 'XMLTEST.exe'. Lesen von Adresse 00000000' aufgetreten.