今天寫了一個類,其中用到了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