2011-09-12 5 views
3

VirtualStringTree 구성 요소를 사용하여 간단한 연락처 관리자를 구현하려고합니다. 데이터 구조의 경우어떻게하면 svTree 데이터 구조를 저장하고로드 할 수 있습니까?

Layout

, 내가 다른 스택에 언급의 Linas에 의해 svTree을 사용하고 있습니다 : 나는 모든 텍스트를 포함 세 개의 열이있는 목록 뷰 구성 요소처럼 보이도록 설정해야 오버플로 질문.

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    MyTree := TSVTree<TMainData>.Create(False); 
    MyTree.VirtualTree := vst1; 
end; 

이 같은 TEdits에서 데이터를 추가하고 : :이이 폼의 한 OnCreate에서

type 
    TMainData = record 
    Name, Email, Password: string; 
    end; 

:

는 나는이 같은 기록을 선언 한

procedure TForm1.BuildStructure; 
var 
    svNode: TSVTreeNode<TMainData>; 
    Data: TMainData; 
begin 
    MyTree.BeginUpdate; 
    try 
    Data.Name := edtname.Text; 
    Data.Email := edtEmail.Text; 
    Data.Password := edtPassword.Text; 
    svNode := MyTree.AddChild(nil, Data); 
    finally 
    MyTree.EndUpdate; 
    end; 
    Label1.Caption := 'Count: '+IntToStr(MyTree.TotalCount); 
end; 

이 내용을 다시로드 할 스트림이나 파일에 저장하려면 어떻게해야합니까? MyTree.SaveToFile('C:/Test.dat')MyTree.LoadFromFile('C:/Test.dat')을 사용해 보았습니다.하지만 다시로드 된 경우 트리보기에는 데이터가없고 빈 행만 표시됩니다. 당신은 OnLoadNode하고 TSVTree에 대한 OnSaveNode 절차를 설정하고 여기 로직을 ​​구현해야

procedure TForm.VTLoadNode(Sender: TBaseVirtualTree; 
    Node: PVirtualNode; Stream: TStream); 
begin 
    // Load Node Data record from the stream 
end; 

procedure TForm.VTSaveNode(Sender: TBaseVirtualTree; 
    Node: PVirtualNode; Stream: TStream); 
begin 
    // Save Node Data record to the stream 
end; 

답변

3

: 당신이 OnSaveNode 및 OnLoadNode 이벤트를 구현해야처럼

+0

정말 고마워요, 지금 작동하고있어 내가 무엇을 놓쳤는 지 봅니다. 그런 식으로 "친절"하려고했지만'Stream.WriteString' 부분에서 + 연산자를 사용하여 모두 결합했습니다! doh! - 당신의 대답을 사용하는 유일한 문제는 호환되지 않는 Types with :'Assigned (Node.FValue) then'입니다.하지만이 부분을 제거하면 컴파일되고 작동합니다. 이걸 필요로합니까, 아니면 생략하면 더 이상 문제가 발생할 것입니까? – Shambhala

+0

데이터 구조를 채우거나 레코드를 사용하는 경우이 줄이 필요하지 않습니다. 기본적으로 VirtualStringTree로 작업 할 때이 글을 쓰곤합니다. – Linas

+0

그 부분을 다시 설명해 주셔서 감사합니다. – Shambhala

1

보인다. 데모 폴더에서 Project2를 볼 수 있습니다. 예컨대 : 그 후

uses 
    uSvHelpers; 

MyTree.OnSaveNode := DoSave; 
MyTree.OnLoadNode := DoLoad; 

procedure TForm1.DoLoad(Sender: TSVTree<TMainData>; Node: TSVTreeNode<TMainData>; Stream: TStream); 
var 
    obj: TMainData; 
begin 
    // 
    if Assigned(Node) then 
    begin 
    //read from stream 
    //read in correct order 
    obj.Name := Stream.AsString; 
    obj.Email := Stream.AsString; 
    obj.Password := Stream.AsString; 
    Node.FValue := obj; 
    end; 
end; 

procedure TForm1.DoSave(Sender: TSVTree<TMainData>; Node: TSVTreeNode<TMainData>; Stream: TStream); 
begin 
    if Assigned(Node) then 
    begin 
    //read from stream 
    Stream.WriteString(Node.FValue.Name); 
    Stream.WriteString(Node.FValue.Email); 
    Stream.WriteString(Node.FValue.Password); 
    end; 
end; 

당신은 MyTree.SaveToFile('C:/Test.dat') 또는 MyTree.LoadFromFile('C:/Test.dat')를 호출 할 수 있습니다. 내 데모 및이 예제에서는 더 많은 OO 스트림 지원을 위해 TStream 도우미를 구현하는 다른 장치 (uSvHelpers)를 사용했습니다. 물론 자신 만의 방식으로 데이터 정보를 스트리밍하도록 작성할 수 있습니다.

관련 문제