![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
잠시 시간이 나서 연구해 봤습니다.
빌더에서 TXMLDocument를 폼에 떨어뜨리지 않고 사용할때 문제가 생기는 이유는, 폼에 떨어뜨린 TXMLDocument과 코딩으로 TXMLDocument* x = new TXMLDocument(""); 할때의 TXMLDocument 클래스가 서로 다르기 때문입니다. 즉 폼에 떨어뜨린 TXMLDocument은 델파이 폼 해석 모듈에서 처리하고 생성자의 Owner에 폼 자신을 대입합니다. 그러나 코딩으로 생성하는 TXMLDocument은 아예 Owner 지정이 불가능하게 되어 있습니다. C++Builder에서 쓰는 TXMLDocument과 폼에 떨어뜨린 콤포넌트를 해석하는 델파이 TXMLDocument 간에 미묘한 차이가 있는 것이죠. 아마도 이 문제는 C빌더쪽 TXMLDocument 처리를 완결하지 못한데서 생기는 것이 아닌가 싶습니다. 그러므로 이 문제는 델파이쪽 모듈에는 이상없으므로, pas 소스를 다음과 같이 만들어, TXMLDocument을 생성해주면 됩니다. unit uPas; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc; function new_TXMLDocument(): TXMLDocument; implementation function new_TXMLDocument(): TXMLDocument; begin result := TXMLDocument.Create(Application); end; end. 그리고 빌더에서는 #include "uPas.hpp" 해주고 그냥 코딩으로, 다음과 같이 임의로 생성해서 사용하는게 가능합니다. void __fastcall TForm1::Button1Click(TObject *Sender) { TXMLDocument* x = new_TXMLDocument(); x->DOMVendor = DOMVendors->Find("MSXML"); x->LoadFromFile("x.xml"); x->Active = true; Memo1->Lines = x->XML; TreeView1->Items->Clear(); DomToTree(x->DocumentElement, NULL); delete x; } void DomToTree(_di_IXMLNode XmlNode, TTreeView *TV, TTreeNode *TreeNode) { TTreeNode *NewTreeNode; AnsiString NodeText; _di_IXMLNode AttrNode; if(XmlNode->NodeType != ntElement) { return; } NodeText = XmlNode->NodeName; if(XmlNode->IsTextElement) { NodeText = NodeText+"="+XmlNode->NodeValue; } NewTreeNode = TV->Items->AddChild(TreeNode, NodeText); for(int i=0; i < XmlNode->AttributeNodes->Count; i++) { AttrNode = XmlNode->AttributeNodes->Nodes[i]; AnsiString Temp = AttrNode->NodeName + "[ "+AttrNode->Text+" ]"; TV->Items->AddChild(NewTreeNode, Temp); } if(XmlNode->HasChildNodes) { for(int i=0; i < XmlNode->ChildNodes->Count-1; i++) { DomToTree(XmlNode->ChildNodes->Nodes[i], TV, NewTreeNode); } } } 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |
그때 아무리 구글링해도 해답은 안나오더라구요...이런 방법이 있었군요...