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

C++빌더 Q&A
C++Builder Programming Q&A
[45607] Re:VirtualStringTree->SaveToFile() 과 LoadFromFile()에 대한 질문입니다.
장성호 [nasilso] 1363 읽음    2006-07-10 17:13
코딩에 문제가 있네요..

sizeof 함수의 결과를 확인해 보세요
node_name 의 string이 길든 짧든  항상 8 이 나올겁니다.
왜 size가 8이 나오냐면 AnsiString으로 선언한 node_name가  포인터 크기(4Byte)만 계산되기 때문이죠

그렇다면 저장도 제대로 되지 않을것이고
읽어오기 node_name의 길이를 알수가 없겠죠?

AnsiString 변수인 node_name의 길이를 정확히 알아서


Stream->Write( pNodeData.node_name.c_str(),pNodeData.node_name.Length());
Stream->Write( pNodeData.ImageIndex,4);
이렇게 저장하면되려나?

제대로 저장 하더라도
읽어올때 node_name의 길이가 가변적이 다면 문제가 되겠죠?

정확하게 node_name 의 길이를 파악해서 size를 정해줘야 될것 같은데....

=========================================================
해결 방법 1

고정 Size구조체를 하나 정의해서 저장하거나 읽어올때
그 구조체를 이용하세요
아래에 tempdata구조체를 하나 선언했습니다.

(단 node_name은 tempdata에 선언한 Size보다 크면 안되겠죠,충분히 크게 정의하도록....)

typedef struct _tempdata {
      char node_name[128];
      int ImageIndex;
}tempdate;


위와같이 할 경우 읽거나 쓸때 항상 132Byte(128+4)씩 하게 되므로
제대로 읽고 제대로 쓸수 있을 겁니다.

//LoadNode 이벤트 ...
void __fastcall TForm1::VSTLoadNode(TBaseVirtualTree *Sender, PVirtualNode Node,
       TStream *Stream)
{

    tempdata tdata;
    mysql_nodedata *pNodeData, *pSubNodeData;
    pNodeData = (mysql_nodedata*)Form1->VST->GetNodeData(Node);
    Stream->Read(tdata, sizeof(tdata));

    pNodeData->node_name.SetLength(128);
    strcpy(pNodeData->node_name.c_str(),&tdata.node_name[0]);  //뭐 이런식으로하면 되나?
    pNodeData->ImageIndex=tdata.ImageIndex;

}










zepirox 님이 쓰신 글 :
: VirtualStringTree->SaveToFile()을 호출하면 OnSaveNode 이벤트가 발생하고,
: VirTualStringTree->LoadFromFile()을 호출하면 OnLoadNode 이벤트가 발생하더군요.
:
: 그래서 다음과 같이 코딩을 해 봤습니다.
: 아래코드중 mysql_nodedata 는 아래와 같이 정의했습니다.
:
: typedef struct mysql_db_nodedata {
:      AnsiString node_name;
:      int ImageIndex;
: } mysql_nodedata;
:
: 여러군데 찾아보다가 델파이 코드 밖에 없어서,
: 델파이 코드를 C++ Builder로 바꾼건데요..
:
: SaveNode 이벤트
: void __fastcall TForm1::VSTSaveNode(TBaseVirtualTree *Sender, PVirtualNode Node,
:       TStream *Stream)
: {
:   PVirtualNode root_Node, temp_node;
:   mysql_nodedata *pNodeData, *pSubNodeData;
:   pNodeData = (mysql_nodedata*)Form1->VST->GetNodeData(Node);
:   Stream->Write( pNodeData,sizeof(pNodeData));
:
: }
:
:
:
: SaveNode 이벤트에서 Node 정보를 갖구 오고..
: SaveToFile()을 호출하면 저장은 됩니다.
: 문제는 제대로 저장되는것인지 모르겠네요.
: LoadFromFile()로 단순히 불러왔을때 트리의 노드가 표시되고 Caption은 표시가 되지 않습니다.
:
: 그래서 LoadNode이벤트에 아래와 같은 코드를 추가해 봤습니다.
:
: //LoadNode 이벤트
: void __fastcall TForm1::VSTLoadNode(TBaseVirtualTree *Sender, PVirtualNode Node,
:       TStream *Stream)
: {
:    mysql_nodedata *pNodeData, *pSubNodeData;
:    pNodeData = (mysql_nodedata*)Form1->VST->GetNodeData(Node);
:    Stream->Read(pNodeData, sizeof(pNodeData));
: }
:
: 그랬더니, Node로부터 얻은 pNodeData ->node_name이 NULL로 표시되더군요.
: 저장될때는 node_name이 저장됩니다.
:
: 여기까지가 제가 해본 건데요...
:
: 뭘 더 해줘야 하나요?
:
: 혹시 아시는 분이 있으시면 설명부탁드리구요.
:
: 빌더코드로 된 간단한 예제라도 올려주시면 감사하겠습니다.
:
: 좋은 하루되세요~~~

+ -

관련 글 리스트
45605 VirtualStringTree->SaveToFile() 과 LoadFromFile()에 대한 질문입니다. zepirox 1710 2006/07/10
45607     Re:VirtualStringTree->SaveToFile() 과 LoadFromFile()에 대한 질문입니다. 장성호 1363 2006/07/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.