Delphi – 在运行时创建的TXMLDocument生成AV,表单上的组件正在
我正在运行时创建一个T
XMLDocument实例,以加载和解析XML文件.您可以查看以下代码:
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. 问题是这会产生AV.正如您可能已经看到的那样,组件在表单之前(// XMLDocument1:TXMLDocument;). 为什么当组件在代码工作的表单上时,但是当我在运行时创建它时它会生成AV? LE: XMLDocument1 : IXMLDocument; //not TXMLDocument XMLDocument1 := LoadXMLDocument(...); FreeAndNil;// must be deleted 解决方法
据我所知,你应该使用接口IDoc:IXMLDocument;代替.
来自docs:
换句话说,在使用nil Owner创建TXMLDocument实例时,不要在实例上调用Free()或FreeAndNil(),并且必须将对象分配给IXMLDocument变量,以便正确管理其现在活动的引用计数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |