XML问题:TXMLDocument.Active自动变成False,操作还没结束,对象已自动销毁

shadowstar 2008-12-03 12:57:50

procedure TForm1.Button1Click(Sender: TObject);
var
doc: TXMLDocument;
begin
doc := TXMLDocument.Create(nil); //nil改成Self运行正常
doc.XML := Memo1.Lines;
doc.Active := True;
ShowMessage(BoolToStr(doc.Active, True)); //True
Memo1.Lines := doc.XML;
doc.DocumentElement.Attributes['b'] := 1;
ShowMessage(BoolToStr(doc.Active, True)); //False
Memo1.Lines := doc.XML; // 这句出错:Invalid pointer operation
end;
...全文
338 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowstar 2008-12-03
  • 打赏
  • 举报
回复
难道是TXMLDocument的BUG?
shadowstar 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 unsigned 的回复:]
doc.XML := Memo1.Lines;
改为
doc.XML.Text := Memo1.Lines.Text;
[/Quote]

和这个没有关系,应该是TXMLDocument的BUG。

不过已经找到解决的办法:

给TXMLDocument一个Owner,或者用IXMLDocument接口。
僵哥 2008-12-03
  • 打赏
  • 举报
回复
doc.XML := Memo1.Lines;
改为
doc.XML.Text := Memo1.Lines.Text;
var
DOC: IXMLDocument;
begin
Doc := TXMLDocument.Create(NIL);

Doc.XML.Text := '<?xml version="1.0" encoding="UTF-8"?><Root><Host><Host1 IP="192.168.10.110" Port="7779"><CPU>1.7Ghz</CPU><Mem>2GB</Mem><MOList/></Host1></Host><Interface/><View/></Root>';
DOC.Active := true;
ShowMessage(doc.DocumentElement.NodeName);

end;
shadowstar 2008-12-03
  • 打赏
  • 举报
回复

procedure TForm1.Button1Click(Sender: TObject);
var
doc: IXMLDocument; //TXMLDocument改成IXMLDocument后正常动行
begin
doc := TXMLDocument.Create(nil); //nil改成Self运行正常
doc.XML := Memo1.Lines;
doc.Active := True; //上移一行Active在给XML赋值后变为False
ShowMessage(BoolToStr(doc.Active, True)); //True
Memo1.Lines := doc.XML;
doc.DocumentElement.Attributes['b'] := 1; //Exception: No active document
ShowMessage(BoolToStr(doc.Active, True)); //False
Memo1.Lines := doc.XML; //Exception:Invalid pointer operation
end;
shadowstar 2008-12-03
  • 打赏
  • 举报
回复
如果换过来的话,第一个更早出错。

procedure TForm1.Button1Click(Sender: TObject);
var
doc: TXMLDocument;
begin
doc := TXMLDocument.Create(nil); //nil改成Self运行正常
doc.Active := True;
doc.XML := Memo1.Lines;
ShowMessage(BoolToStr(doc.Active, True)); //True
Memo1.Lines := doc.XML;
doc.DocumentElement.Attributes['b'] := 1; //Exception: No active document
ShowMessage(BoolToStr(doc.Active, True)); //False
Memo1.Lines := doc.XML; //Exception:Invalid pointer operation
end;
僵哥 2008-12-03
  • 打赏
  • 举报
回复
doc.XML := Memo1.Lines;
doc.Active := True;
这两行换一下位置.

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧