delphi-実行時に作成されたtxmldocumentはAVを生成し、フォームのコンポーネントが機能しています

StackOverflow https://stackoverflow.com/questions/8398703

質問

XMLファイルをロードして解析するために、実行時にtxmldocumentのインスタンスを作成しています。以下のコードを確認できます。

    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; 代わりは。

ドキュメントから:

txmldocumentが所有者なしで作成されると、インターフェースのオブジェクトのように動作します。つまり、そのインターフェイスへのすべての参照がリリースされると、txmldocumentインスタンスが自動的に解放されます。ただし、txmldocumentが所有者と一緒に作成されると、他のコンポーネントと同様に動作し、所有者によって解放されます。

言い換えれば、aを作成するとき TXMLDocument でインスタンス nil オーナー、 しない 電話 Free() また FreeAndNil() インスタンス、そしてあなた しなければならない オブジェクトをanに割り当てます IXMLDocument 変数して、その現在活動的な参照カウントは適切に管理されます。

他のヒント

あなたはanを提供する必要があります OwnerTXMLDocument 実行時に作成するとき。

XMLDocument1 := TXMLDocument.Create(xml);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top