2013-07-13 65 views
0

我嘗試開發一個幫助程序來讀/寫並控制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); 
+0

沒有'Xml'在'過程xmlWriteProyectoNode'的參數。那麼 - 它從哪裏來?在過程開始時'XML'的價值是什麼。將'procedure xmlWriteProyectoNode'的第一行添加爲ShowMessage(IntToStr(Integer(Pointer(XML))));' –

+0

同時顯示創建'TXMLDocument'的代碼!這個班有一些陷阱,你如何創建它就是其中之一!順便說一句,「與訪問衝突錯誤」總比沒有好,但比德爾福告訴你的要少。請在這裏複製確切的錯誤信息。 –

+0

'root:= Xml.xmlFile.DocumentElement;'是複雜的行。 「複雜」與「含糊」相同。將其拆分爲更簡單的線條。 'tempvar:= Xml.xmlfile; root:= tempvar.DocumentElement;' –

回答

3
+0

謝謝!現在與業主創建TXMLDocument並且工作! – ramiromd

+0

或者你可以使用'newXml'類型'iXMLDocument'來代替文檔顯示和其他變量。這是一個非常陷阱的班級,所以如果你想使用它 - 你必須閱讀手冊,真的必須。 –