delphi-実行時に作成されたtxmldocumentはAVを生成し、フォームのコンポーネントが機能しています
-
28-10-2019 - |
質問
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を提供する必要があります Owner
に TXMLDocument
実行時に作成するとき。
XMLDocument1 := TXMLDocument.Create(xml);
所属していません StackOverflow