I'm creating an instance of TXMLDocument at runtime, to load and parse a XML file. You can check the code below:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls; type Txml = class(TForm) // XMLDocument1: TXMLDocument; Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var xml: Txml; implementation {$R *.dfm} procedure Txml.FormCreate(Sender: TObject); var i,j:integer; aNode:IXMLNode; ws:String; XMLDocument1:TXMLDocument; begin Memo1.Lines.Clear; XMLDocument1 := TXMLDocument.Create(nil); try XMLDocument1.LoadFromFile('C:\a.xml'); XMLDocument1.Active := true; aNode := XMLDocument1.ChildNodes.First; while aNode<>nil do begin for i := 0 to aNode.ChildNodes.Count-1 do begin if aNode.ChildNodes[i].NodeName = 'Role' then begin Memo1.Lines.Add('Tag - '+aNode.ChildNodes[i].ChildNodes['Tag'].Text); for j := 0 to aNode.ChildNodes[i].ChildNodes.Count-1 do if aNode.ChildNodes[i].ChildNodes[j].HasChildNodes then begin ws := VarToStr(aNode.ChildNodes[i].ChildNodes[j].ChildValues['Tag']); if trim(ws)<>'' then Memo1.Lines.Add(ws); ws := VarToStr(aNode.ChildNodes[i].ChildNodes[j].ChildValues['Value']); if trim(ws)<>'' then Memo1.Lines.Add(ws); end; end; end; aNode := aNode.NextSibling; end; XMLDocument1.Active := false; finally FreeAndNil(XMLDocument1); end; end; end.
The problem is that this is generating an AV. As you probably have seen, before the component was on the form (// XMLDocument1: TXMLDocument;).
Why when the component was on the form the code was working, but when I'm creating it at run-time it generates AV?
LE: solution: based on the answers/comments and Delphi Help:
XMLDocument1 : IXMLDocument; //not TXMLDocument XMLDocument1 := LoadXMLDocument(...); FreeAndNil;// must be deleted