我嘗試開發一個幫助程序來讀/寫並控制TXMLDocument的一個實例。 我爲這項工作寫了一個簡單的單位。該單元具有將實例分配給全局變量的過程,併爲文檔控制設置了一些變量。 單位是:嘗試獲取xml節點時訪問衝突
unit Globals;
{ Variables globales de la aplicacion, con sus correspondientes accessors }
interface
uses
{ XML Helper }
xmldom, XMLIntf, msxmldom, XMLDoc, SysUtils, DateUtils;
type
XmlCheckPoint = Record
asociado: boolean;
xmlFile: TXMLDocument;
saved: boolean;
lastModification: TDateTime;
lastSave: TDateTime;
path: TFilename;
End;
{ Firmas }
procedure assignXml(var aXml: TXMLDocument);
procedure xmlWriteProyectoNode(obra,cliente,ubicacion,fecha,sondeo,estudio: String);
function existsXml(): boolean;
function xmlIsUpdated(): boolean;
var
Xml: XmlCheckPoint;
程序assignXml,做工精細:
procedure assignXml(var aXml: TXMLDocument);
begin
Xml.xmlFile := aXml;
Xml.asociado := true;
Xml.saved := false;
Xml.lastSave := Yesterday;
Xml.path := '';
{ Inserto el nodo raiz }
Xml.xmlFile.Active := true;
Xml.xmlFile.AddChild('raiz');
Xml.lastModification := Now();
end;
但是,xmlWriteProyectoNode(...)爆炸應用:
procedure xmlWriteProyectoNode(obra,cliente,ubicacion,fecha,sondeo,estudio: String);
var
root,meta,child: IXMLNode;
begin
Xml.xmlFile.Active := true;
root := Xml.xmlFile.DocumentElement;
meta := root.AddChild('proyecto');
child := meta.AddChild('obra');
child.Text := obra;
[...]
Xml.lastModification := Now();
end;
的應用程序崩潰時invoques writeXmlProyectoNode(...)與訪問衝突錯誤。在執行時間。 Embarcadero的debuger說,衝突的路線是:
root := Xml.xmlFile.DocumentElement;
我需要得到根元素,並被認爲這是正確的方式... 林最新的德爾福,任何想法? 謝謝!
編輯: 的XML創建(newXml
類型是TXMLDocument
)
newXml := TXMLDocument.Create(nil);
newXml.Options := [doNodeAutoIndent];
newXml.Active := true;
{ Asocio la instancia de XMLDocument a mi variable global newXml}
Globals.assignXml(newXml);
沒有'Xml'在'過程xmlWriteProyectoNode'的參數。那麼 - 它從哪裏來?在過程開始時'XML'的價值是什麼。將'procedure xmlWriteProyectoNode'的第一行添加爲ShowMessage(IntToStr(Integer(Pointer(XML))));' –
同時顯示創建'TXMLDocument'的代碼!這個班有一些陷阱,你如何創建它就是其中之一!順便說一句,「與訪問衝突錯誤」總比沒有好,但比德爾福告訴你的要少。請在這裏複製確切的錯誤信息。 –
'root:= Xml.xmlFile.DocumentElement;'是複雜的行。 「複雜」與「含糊」相同。將其拆分爲更簡單的線條。 'tempvar:= Xml.xmlfile; root:= tempvar.DocumentElement;' –