簡體   English   中英

Delphi - 在運行時創建的TXMLDocument生成AV,表單上的組件正在工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM