|
코딩에 문제가 있네요..
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이 저장됩니다.
:
: 여기까지가 제가 해본 건데요...
:
: 뭘 더 해줘야 하나요?
:
: 혹시 아시는 분이 있으시면 설명부탁드리구요.
:
: 빌더코드로 된 간단한 예제라도 올려주시면 감사하겠습니다.
:
: 좋은 하루되세요~~~
|