अस्वीकरण: डी 2007 के साथ परीक्षण किया गया।
आपका कोड वास्तव में एक्सएमएल पैदा नहीं करता (<label/>
) इस संशोधित समारोह में दिखाया गया है:
function createXMLDocument(): TXMLDocument;
var
res: TXMLDocument;
rootNode: IXMLNode;
sl : TStringList;
begin
res := TXMLDocument.Create(nil);
res.Active := true;
rootNode := res.AddChild('label');
// create string for debug purposes
sl := TStringList.Create; // not needed
sl.Assign(res.XML); // Not true: sl is empty after this assignment
ShowMessage(sl.text);// sl is NOT empty!
sl.Free; // don't forget to free it! use try..finally.. to guarantee it!
//add more elements
// generateDOM(rootNode);
Result := res;
end;
लेकिन यह टिप्पणी के बहुत के लिए कहता है:
- आप एक की जरूरत नहीं है स्थानीय res वैरिएबल, बस परिणाम का उपयोग करें।
- आपको एक्सएमएल देखने के लिए अतिरिक्त स्ट्रिंगलिस्ट की आवश्यकता नहीं है: Result.Xml.Text
- स्ल स्ट्रिंगलिस्ट को भूलें यदि आप एक बनाते हैं।
- आपके द्वारा वापस किए गए XmlDocument फ़ंक्शन के बाहर अनुपयोगी है और यदि आप आज़माते हैं तो एवी देता है।
क्यों?
क्योंकि एक XmlDocument एक इंटरफ़ेस अन्यथा के रूप में, क्रम में अपनी जीवन प्रबंधन के लिए एक मालिक साथ के रूप में एक घटक इस्तेमाल किया जा करने का इरादा है, या यह है।
तथ्य यह है कि आप rootNode को पकड़ने के लिए इंटरफ़ेस का उपयोग करते हैं, इसे CreateXmlDocument फ़ंक्शन के अंत में नष्ट कर दिया जाता है। और यदि आप TXMLNode._Release
में कोड देखते हैं, तो आप देखेंगे कि यह TXMLDocument._Release
ट्रिगर्स करता है जो एक्सएमएल डॉक्यूमेंट (या इसके संदर्भ में एक इंटरफ़ेस रखने वाला इंटरफ़ेस) के मालिक होने तक नष्ट हो जाता है।
यही कारण है कि XMLDocument CreateXMLDocument फ़ंक्शन के अंदर मान्य और पॉप्युलेट किया गया है लेकिन इसके बाहर उपलब्ध नहीं है जब तक आप इंटरफ़ेस वापस नहीं करते हैं या कोई मालिक प्रदान नहीं करते हैं।
नीचे वैकल्पिक समाधान देखें: अगर आप डेल्फी संस्करण उपयोग कर रहे प्रदान की
function createXMLDocumentWithOwner(AOwner: TComponent): TXMLDocument;
var
rootNode: IXMLNode;
begin
Assert(AOwner <> nil, 'createXMLDocumentWithOwner cannot accept a nil Owner');
Result := TXMLDocument.Create(AOwner);
Result.Active := True;
rootNode := Result.AddChild('label');
OutputDebugString(PChar(Result.Xml.Text));
//add more elements
// generateDOM(rootNode);
end;
function createXMLDocumentInterface(): IXMLDocument;
var
rootNode: IXMLNode;
begin
Result := TXMLDocument.Create(nil);
Result.Active := True;
rootNode := Result.AddChild('label');
OutputDebugString(PChar(Result.Xml.Text));
//add more elements
// generateDOM(rootNode);
end;
procedure TForm7.Button1Click(Sender: TObject);
var
doc: TXmlDocument;
doc2: IXMLDocument;
begin
ReportMemoryLeaksOnShutdown := True;
doc := createXMLDocument;
// ShowMessage(doc.XML.Text); // cannot use it => AV !!!!
// already freed, cannot call doc.Free;
doc := createXMLDocumentWithOwner(self);
ShowMessage(doc.XML.Text);
doc2 := createXMLDocumentInterface;
ShowMessage(doc2.XML.Text);
end;
स्रोत
2009-10-08 00:32:42
अच्छा होगा। डी 2007 के मामले में मेरा जवाब देखें। –