|
한글 및 C++Builder 로 변환
검증율 : 0% (-_-)
트리를 저장하기 위한 프로시저
TBaseVirtualTree.SaveToFile(const FileName: TFileName); 프로시저가 호출되었다.
그것으로 트리의 구조는 자동적으로 저장되었다.
추가적인 데이터를 저장하기 위한 제공된 스트림에 간단하게 데이터를 기록할 수 있는 OnSaveNode 이벤트가 있다.
__property TVTSaveNodeEvent OnSaveNode={ read = FOnSaveNode, write = FOnSaveNode };
OnSaveNode 가 발생하면 부분 노드 클래스의 SaveNode 메소드가 호출될 것이다.
void __fastcall TMyTreeSaveNode( TBaseVirtualTree *Sender, PVirtualNode Node, TStream *Stream )
{
dynamic_cast<PTreeData>( Sender->GetNodeData( Node ) )->BasicND->SaveToFile( Stream );
}
클래스의 SaveNode 메쏘드에서 트리의 노드이름, 이미지인덱스, 등과 같은 필드들이 저장된다.
//-------------------------------------------------------------------Save Node
void __fastcall TBasicNodeData::SaveNode( TStream *Stream )
{
int size;
// 노드의 형태를 저장
Stream->Write( Art, sizeof( Art ) );
// cName 저장
Size = cName.Length() + 1;
Stream->Write( Size, sizeof( Size ) ); // 문자열의 길이를 저장
Stream->Write( cName.c_str(), Size ); // 문자열 저장
// cImageIndex 저장
Stream->Write( cImageIndex, sizeof( cImageIndex ) );
// cImageIndexFocus 저장
Stream->Write( cImageIndexFocus, sizeof( cImageIndexFocus ) );
/* Virtual Treeview step by step Virtual Treeview */
// cChildrenAllowed 저장
Stream->Write( cChildrenAllowed, sizeof( cChildrenAllowed ) );
}
//---------------------------------------------------------------------Load
// 이부분 이상하네요..소스짤린 듯
try
{
// 트리 불러오기
MyTree->LoadFromFile( MainControlForm->Filename );
}
catch ( Exception &E )
{
Application->MessageBox( E.Message.c_str(), "Error while loading.", MB_OK );
MainControlForm->FileName = "";
// 최상위 노드로 트리 만들기 (로딩실패이후로)
Node = MyTree->AddChild( NULL );
NodeD = MyTree->GetNodeData( Node );
NodeD->BasicND = new TBasicNodeData( "new project" );
}
}
//------------------------------------------------------------------------------OnLoadNode Event
LoadFromFile 을 호출함으로 OnLoadNode 이벤트가 발생하고 결과적으로 LoadNode 메소드가 호출된다.
void __fastcall TBasicNodeData::LoadNode( TStream *Stream )
{
int Size;
char *StrBuffer;
// cName 불러오기
Stream->Read( Size, sizeof( Size ) ); // 글자 길이
StrBuffer = new char( Size ); // 임시 버퍼 생성
Stream->Read( StrBuffer, Size ); // 문자열 읽기
cName = StrBuffer;
delete StrBuffer;
// cImageIndex 불러오기
Stream->Read( cImageIndex, sizeof( cImageIndex ) );
// cImageIndexFocus 불러오기
Stream->Read( cImageIndexFocus, sizeof( cImageIndexFocus ) );
// cChildrenAllowed 불러오기
Stream->Read( cChildrenAllowed, sizeof( cChildrenAllowed ) );
}
또아리 님이 쓰신 글 :
: Help에 있는 부분을 발취한건데요...이해가 잘 가지 않네요..
:
: For saving the tree the procedure
: procedure TBaseVirtualTree.SaveToFile(const FileName: TFileName);
: is called. Thereby the structure of the tree is automatically stored. In order to save our additional data there is an event
: OnSaveNode where we can simply store our data into the provided stream.
: property OnSaveNode: TVTSaveNodeEvent read FOnSaveNode write FOnSaveNode;
: If OnSaveNode is triggered then the method SaveNode of the particular node class will be called:
: procedure TMyForm.MyTreeSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
: begin
: PTreeData(Sender.GetNodeData(Node)).BasicND.SaveToFile(Stream);
: end;
: In the SaveNode method of the class fields like node name, image index etc. are stored in the tree:
:
: //-------------------------------------------------------------------Save Node
: procedure TBasicNodeData.SaveNode(Stream: TStream);
: var
: size: Integer;
: begin
: // save type of the node
: Stream.Write(Art, SizeOf(Art));
: // store cName
: Size := Length(cName) + 1; // include terminating #0
: Stream.Write(Size, SizeOf(Size)); // store length of the string
: Stream.Write(PChar(cName)^, Size); // now the string itself
: // store cImageIndex
: Stream.Write(cImageIndex, SizeOf(cImageIndex));
: // store cImageIndexFocus
: Stream.Write(cImageIndexFocus, SizeOf(cImageIndexFocus));
: Virtual Treeview step by step Virtual Treeview
:
: // store cChildrenAllowed
: Stream.Write(cChildrenAllowed, SizeOf(cChildrenAllowed));
: end;
:
: //---------------------------------------------------------------------Load
: try
: // load tree
: MyTree.LoadFromFile(MainControlForm.Filename);
: except
: on E: Exception do
: begin
: Application.MessageBox(PChar(E.Message), PChar('Error while loading.'), MB_OK);
: MainControlForm.Filename := '';
: // create tree with top level node (since loading failed)
: Node := MyTree.AddChild(nil);
: NodeD := MyTree.GetNodeData(Node);
: NodeD.BasicND := TBasicNodeData.Create('new project');
: end;
: end;
: //------------------------------------------------------------------------------OnLoadNode Event
: By the call of LoadFromFile the event OnLoadNode will be triggered and consequently the method LoadNode:
: procedure TBasicNodeData.LoadNode(Stream: TStream);
: var
: Size: Integer;
: StrBuffer: PChar;
: begin
: // load cName
: Stream.Read(Size, SizeOf(Size)); // length of the string
: StrBuffer := AllocMem(Size); // get temporary memory
: Stream.Read(StrBuffer^, Size); // read the string
: cName := StrBuffer;
: FreeMem(StrBuffer);
: // Alternatively you can simply use:
: // SetLength(cName, Size);
: // Stream.Read(PChar(cName)^, Size);
: // load cImageIndex
: Stream.Read(cImageIndex, SizeOf(cImageIndex));
: // load cImageIndexFocus
: Stream.Read(cImageIndexFocus, SizeOf(cImageIndexFocus));
: // load cChildrenAllowed
: Stream.Read(cChildrenAllowed, SizeOf(cChildrenAllowed));
: end;
|