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
[48482] Re:Re:델파이 소스가 있긴한데..제가 델파이를 잘몰라서..
아루스 [tinydew4] 1998 읽음    2007-03-20 23:16
한글 및 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;

+ -

관련 글 리스트
48474 Virtual Treeview Load/Save에 대한 질문..도와주세요 또아리 1205 2007/03/20
48481     Re:Virtual Treeview Load/Save에 대한 질문..도와주세요 (추가) 아루스 1210 2007/03/20
48490         Re:Re:감사합니다(냉무) 또아리 1057 2007/03/21
48476     Re:델파이 소스가 있긴한데..제가 델파이를 잘몰라서.. 또아리 1384 2007/03/20
48482         Re:Re:델파이 소스가 있긴한데..제가 델파이를 잘몰라서.. 아루스 1998 2007/03/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.