|
NewTreeNode->Data 는, 실질적으로 참고할 수 있는 메모리의 주소를 연결시켜 주는 역할에
불과합니다. 그래서, 해당 메모리 크기를 기억해야 하고, 메모리가 없어지지 않도록 관리를 해 주어야 하는
역할이 필요합니다.
NewTreeNode->Data=AttrNode->GetText().Copy();
이렇게 해 주셨을때, Data 는 AttrNode->GetText().Copy()의 메모리 주소를 참조하게 되지만,
해당 파싱 루틴이 끝나고, 더블클릭으로 들어간다든지의 작업을 하게 되어 해당 파싱 함수의 역할이
끝나고 지역 변수가 초기화 되고, 새로운 메모리가 들어와서 (운좋으면 다른 주소에 쓰게 되어
가끔 한번씩 제대로 결과값이 나올수는 있지만요) NewTreeNode->Data 는 그 새로운 값을
참조하게 됩니다.
또한, _di_IXMLNode의 GetText().Copy() 라는 메소드가 어떻게 넘겨주는지는 잘 모르겠으나,
뒤에 \0 을 자동으로 붙여주지 않는다면, 캐릭터로 캐스팅시, 정확한 캐릭터의 끝이 없기 때문에
글자가 깨져서 나온다든지 할 수 있습니다. 이 경우 \0 을 붙여서 메모리에 기억하거나,
메모리 크기까지 기억을 해서 두는 것이 좋습니다.
그래서, 만약, "JE_A_A8^5_001_000011:JE_A_A8^5_001_000272=Y"; 을 기억하고 싶으시다면
Data가 아닌, 전역변수나 기타 어떤 곳에 "JE_A_A8^5_001_000011:JE_A_A8^5_001_000272=Y"; 을 먼저
적재한 후. Data가 참고할 수 있도록 하셔야 합니다.
아래는 그러한 간단한 예제입니다.
cuperido
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char NAME[2][256];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TTreeNode *NewTreeNode;
NewTreeNode = TreeView1->Items->AddChild(TreeView1->Items->Item[0], "TEST1");
strcpy(NAME[0], "JE_A_A8^5_001_000011:JE_A_A8^5_001_000272=Y");
NewTreeNode->Data = NAME[0];
NewTreeNode = TreeView1->Items->AddChild(TreeView1->Items->Item[0], "TEST2");
strcpy(NAME[1], "JE_A_A8^5_002_0000281:JE_A_A8^5_002_000302=N");
NewTreeNode->Data = NAME[1];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1DblClick(TObject *Sender)
{
Memo1->Lines->Add((char *)TreeView1->Selected->Data);
}
//---------------------------------------------------------------------------
이건식 님이 쓰신 글 :
: 유영인씨
: 염치 불구하고 다시 질문드립니다.
:
: Unicode XML문서를 파싱해서
: 유니코드 컨트롤인 TntTreeView에 데이터를 적재하였습니다.
: 유니코드 xml 문서는 다음과 같습니다.
:
: <?xml version="1.0" encoding="UTF-8"?>
: <DIRECTORY TITLE="孝經諺解" CODE="JE_A_A8^5_001_000011:JE_A_A8^5_001_000272=N">
: <DIRECTORY TITLE="孝經諺解 v1" CODE="JE_A_A8^5_001_000011:JE_A_A8^5_001_000272=Y">
: </DIRECTORY>
: <DIRECTORY TITLE="孝經諺解 v2" CODE="JE_A_A8^5_002_0000281:JE_A_A8^5_002_000302=N">
: </DIRECTORY>
: </DIRECTORY>
:
: 적재 로직은 다음과 같습니다.
: void __fastcall TForm1::UniFullDomToTree(_di_IXMLNode XmlNode,TTntTreeView *TntTreeView1,TTntTreeNode *TreeNode)
: {
: int i;
: TTntTreeNode *NewTreeNode;
: AnsiString NodeText;
: WideString NodeTextW;
: wchar_t wnodetemp[5000],wtemp[5000];
: char knodetemp[10000],ktemp[10000];
: AnsiString Temp;
: WideString TempW;
: Variant OtempW;
: _di_IXMLNode AttrNode;
:
: for(i=0; i<XmlNode->AttributeNodes->Count; i++) {
: AttrNode = XmlNode->AttributeNodes->Nodes[i];
: if(AttrNode->NodeName==(WideString)"TITLE"){
: OtempW=AttrNode->Text;
: wcscpy(wtemp,OtempW);
: //노드 캡션
: NewTreeNode=TntTreeView1->Items->AddChild(TreeNode,wtemp);
: }
: if(AttrNode->NodeName==(WideString)"CODE"){
: // 이 부분이 촛점임
: NewTreeNode->Data=AttrNode->GetText().Copy();
: }
: }
: if(XmlNode->HasChildNodes) {
: for(i=0;i<XmlNode->ChildNodes->Count; i++) {
: UniFullDomToTree(XmlNode->ChildNodes->Nodes[i],TntTreeView1,NewTreeNode);
: }
: }
: }
:
: NewTreeNode->Data=AttrNode->GetText().Copy(); 로 적재하고
:
: 트리뷰 더블클릭시
: 이 적재된 데이터를
: WideString Wstr=(wchar_t *)(TreeView1->Selected->Data)
: ShowMessage((AnsiString)Wstr)로 했더니;
:
: 'JE_A_A8^5_001_000011:JE_A_A8^5_001_000272=N'로 나타났다가
: 다른 데를 클릭하고 동일 부분을 클릭하면
: 'JE_A_A8^5_001_000011:JE_A_A8^5_001_000272'로 잘려서 나타나고
: 또 정상적으로 나타나기도 합니다
: "="문자, 형변환 등의 문제는 아닌 것 같습니다.
:
: WideString Wstr=(wchar_t *)(TreeView1->Selected->Data)에서
: Wstr에 TreeView1->Selected->Data의 모든 문자열들이 적재되지 못하는 것 같습니다.
: 문제가 무엇일까요 어떻게 처리해야 하나요?
: 답변 부탁드립니다.
:
: 유영인 Cuperido 님이 쓰신 글 :
: : Data 프로퍼티를 사용하셔야 한다면,
: : AddObject 시에 정의된 형태로 다시 재 변환하신 뒤,
: : 이 형태를 토대로 다시 문자열로 꺼내와야 할 것 같습니다.
: : (정의된 형태를 몰라, 정확한 답변을 드리기가 어려울 것 같습니다)
: :
: : 정의되어 있는 형태가 char* 형이 아니었는데,
: : char*로 강제 형 변환을 하니, \0 등의 기호가 맞지 않고
: : 또한 메모리 사이즈도 맞지 않아서 오류를 일으키는 것 같습니다.
: :
: : P.S : 저.. 선생님.. 아닙니다.... (__)a
: :
: :
: : cuperido
: :
: : 이건식 님이 쓰신 글 :
: : : 유영인 선생님
: : : 답변 주셔서 고맙습니다.
: : :
: : : TreeView1->Selected->Text는
: : : Node의 Caption입니다.
: : :
: : : TreeView1->Selected->Data는
: : : void 포인터로 캡션과 다릅니다.
: : :
: : : TreeView1->Selected->Data 의 값이
: : : 잘렷다가 다시 안 잘렸다가 다시 잘리는
: : : 현상을 어떻게 처리해야 하는가요
: : :
: : :
: : : 유영인 Cuperido 님이 쓰신 글 :
: : : : 단순 텍스트식 표기방법이라면,
: : : :
: : : : AnsiString Str = TreeView1->Selected->Text;
: : : : ShowMessage(Str);
: : : :
: : : : 이렇게 해보시는것은 어떨까요?
: : : :
: : : :
: : : : cuperido
: : : :
: : : :
: : : : 이건식 님이 쓰신 글 :
: : : : : 트리뷰에서 더블 클릭했을 때
: : : : :
: : : : : TreeView1->Selected->Data 값을(가령 "1234=n")
: : : : : 표시하기 위해 다음과 같이 했습니다
: : : : :
: : : : : AnsiString Str=(char *)(TreeView1->Selected->Data)
: : : : : ShowMessage(Str) 했더니
: : : : :
: : : : : 1234=n , 1233, Null로 나타나는데 이유가 무엇일까요
|