[英]Delphi - TXMLDocument created at run-time generates AV, with component on the form is working
我正在運行時創建一個TXMLDocument實例,以加載和解析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: 解決方案 :基於答案/評論和Delphi幫助:
XMLDocument1 : IXMLDocument; //not TXMLDocument
XMLDocument1 := LoadXMLDocument(...);
FreeAndNil;// must be deleted
據我所知,你應該使用接口IDoc: IXMLDocument;
代替。
來自docs:
在沒有所有者的情況下創建TXMLDocument時,它的行為類似於接口對象。 也就是說,當釋放對其接口的所有引用時,將自動釋放TXMLDocument實例。 但是,當使用所有者創建TXMLDocument時,它的行為與任何其他組件一樣,並由其所有者釋放。
換句話說,在使用nil
Owner創建TXMLDocument
實例時, 不要在實例上調用Free()
或FreeAndNil()
,並且必須將對象分配給IXMLDocument
變量,以便正確管理其現在活動的引用計數。
在運行時創建它時,您需要為TXMLDocument
提供Owner
。
XMLDocument1 := TXMLDocument.Create(xml);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.