C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[982] TXMLDocument를 폼에 떨어뜨리지 않고 동적으로 생성해서 사용하기
xiles [xiles] 9979 읽음    2010-04-30 02:49
VCL에 XML를 다룰 수 있는 TXMLDocument가 있다.
그런데 얘는 기본적으로 폼에 떨궈서 사용하게 되어 있고, 생성자도 TXMLDocument(TComponent *Owner) 로 Owner를 요구한다.

그럼 폼에 올리지 않고 그냥 어디선가 동적으로 생성해서 사용하려면 어찌해야할까?
Owner 를 그냥 NULL로 하면되지 않을까?   안된다...;;;

응? 생성자가 또 있네 TXMLDocument(String FileName)
그럼 파일이름을 빈 문자열로 줘서 하면? 안된다...;;;

둘 다 모두 사용하려고 하면 Invalid Pointer 어쩌구 저쩌구를 뱉어낸다.

그럼 방법이 없나? 있다!!
생성할 때 TXMLDocument* 대신 _di_IXMLDocument를 사용하고, NewXMLDocument(); 함수를 이용해서 생성하면 된다.

_di_IXMLDocument xml = NewXMLDocument();

// xml 가지고 할일 하기

xml->Release();
xml = NULL;


* 메모리 해제시키는 부분은 아직 확실하지가 않네요;;;
delete xml; delete를 이용하면 오류가 생깁니다.
망치 [mangchy]   2010-04-30 07:52 X
저두 dll에서 xml을 넣을때 이것때문에 고생하다가 결국 안보이는 폼에 xml컴포넌튼 올리고 썼었습니다.
그때 아무리 구글링해도 해답은 안나오더라구요...이런 방법이 있었군요...
Lyn [tohnokanna]   2010-04-30 21:53 X
TXMLDocument* X = new TXMLDocument(Application);

는 안되나요?
김태선 [cppbuilder]   2010-05-05 21:03 X
TXMLDocument* x = new TXMLDocument("");
;;;
delete x;
그냥 이렇게 생성하면 안되는가요?
컴파일은 이상없이 되는데.
헤더 파일쪽에
#include <msxmldom.hpp>
#include <XMLDoc.hpp>
#include <xmldom.hpp>
#include <XMLIntf.hpp>
포함해 주고.

그냥 컴파일이 되는지만 실험해 봤습니다.
xiles [xiles]   2010-05-06 23:41 X
Lyn님/Application을 넘길 수 있으면 Application도 사용할 수 있는 것 같습니다.
태선님/ 컴파일은 되는데 실질적으로 사용을 하려고 하면 오류가 발생해서 사용할 수가 없습니다.
김태선 [cppbuilder]   2010-05-12 12:46 X
잠시 시간이 나서 연구해 봤습니다.

빌더에서 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;
}

김태선 [cppbuilder]   2010-05-12 12:52 X
위 내용은 빌더 6.0에서의 결과이고,
다른 버전은 해보지 않았습니다.
장성호 [nasilso]   2010-05-13 15:57 X
오..
"C빌더쪽 TXMLDocument 처리를 완결하지 못한데서 생기는 것이 아닌가..."  이런 문제가 있을수 있군요~!

감사합니다.
시간될때 한번 테스트 해봐야겠네요...

김태선 [cppbuilder]   2010-05-16 09:35 X
그렇네요. 오늘 빌더 6 보다 상위 에디션에서
    TXMLDocument* x = new TXMLDocument(this);
를 해보니 잘되네요.
빌더6에서 구현을 완결하지 못해서 생긴 문제가 맞네요.
김태선 [cppbuilder]   2010-05-17 12:40 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);
            }
        }
    }

+ -

관련 글 리스트
982 TXMLDocument를 폼에 떨어뜨리지 않고 동적으로 생성해서 사용하기 xiles 9979 2010/04/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.