Delphi中使用TXMLDocument控件应注意的问题
今天写了一个类,其中用到了TXMLDocument控件。这个控件我是要动态生成的。
但是却遇到了非常奇怪的问题,下面分享一下
procedure TMainForm.Button1Click(Sender:TObject);
Var
XML:TXMLDocument;
I:Integer;
begin
XML:=TXMLDocument.Create(nil);
XML.LoadFromFile(ExtractFilePath(Application.ExeName)+'demo.xml');
XML.Active:=True;
For I:=0 to XML.DocumentElement.ChildNodes.Count-1 do
begin
//do something
end;
XML.Free;
end;
问题就出现在了For 循环上,当点击按钮后 程序执行到For循环就卡死,没有错误提示,没有任何征兆。debug跟踪结果就是执行到这里后就停止不动了。曾经也用过很多次TXMLDocument控件,但都是直接拖动一个控件到窗体上,从来没有发生过这种事情,就为了解决这个问题我花了一上午的时间。后来吃完饭之后一个意外改动,解决了这个问题。
原来,问题并不出在任何语法错误,而是在TXMLDocument实例进行初始化构造的时候,参数错了。应该将参数设置为Application或者Self,这样就可以顺利执行了。在Delphi中很多控件的AOwer参数都是可以为nil的,不知道为什么TXMLDocument在这个参数上这么特殊。
如果确实要将TXMLDocument控件应用于单元,也可以这样来解决,就是通过传递参数的方法
首先要引用Classes,xmldom, XMLIntf, msxmldom, XMLDoc
然后在自定义类的构造函数中加一个AOwer:TComponent参数 形如
type
TMyClass=Class(TObject)
public
constructor Create(AOwer:TComponent);OverLoad;
end;
implementation
constructor TMyClass.Create(AOwer:TComponent;ConfigFile:WideString);
begin
XML:=TXMLDocument.Create(AOwer);// 重点就在这
XML.LoadFromFile(ConfigFile);
// do something
XML.Free;
end;
在调用这个类类时这样写
procedure TMainForm.Button1Click(Sender:TObject);
Var
MyObject:TMyClass;
begin
MyObject:=TMyClass.Create(self,ExtractFilePath(Application.ExeName)+'demo.xml')
//do something
MyObject.Free;
end;
所用版本:Delphi 2007 Architect(with December 2007 update)
http://blog.csdn.net/chaijunkun/article/details/5407793
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2015-06-16 似乎有必要每天备份源代码
2013-06-16 MIS数据库系统结构设计心得