2011-09-12 5 views
3

私はVirtualStringTreeコンポーネントを使用して簡単な連絡先マネージャを実装しようとしています。データ構造についてsvTreeデータ構造を保存して読み込むにはどうしたらいいですか?

Layout

、私は別のスタックで言及されたリナ、によってsvTreeを使用しています:私はそれがすべてのテキストが含まれています唯一の3つの列とリストビューコンポーネントのように見えるように設定していますオーバーフローの質問。

私はこのようなレコードを宣言している:私はこのようなTEditsからデータを追加してい

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    MyTree := TSVTree<TMainData>.Create(False); 
    MyTree.VirtualTree := vst1; 
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; 
を私はこれを持っているフォームのOnCreateイベントで

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

これをストリームまたはロードするファイルに保存するにはどうすればよいですか?私はMyTree.SaveToFile('C:/Test.dat')MyTree.LoadFromFile('C:/Test.dat')を使用しようとしましたが、ロードされたときにツリービューにデータが含まれず、空の行のみが含まれています。

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

あなたはTSVTreeためOnLoadNodeとOnSaveNode手順を設定し、ここにあなたのロジックを実装する必要があります:あなたはOnSaveNodeとOnLoadNodeイベントを実装する必要があるよう

+0

ありがとうございました、私は今働いており、私は何が欠けていたかを見ています。私はそれを "親切"にしようとしていましたが、 'Stream.WriteString'の部分で+演算子を使ってそれらをすべて組み合わせました!ドゥー! - 私があなたの答えを使用していた唯一の問題は、互換性のない型: 'Assigned(Node.FValue)then'ですが、この部分を削除するとコンパイルされて動作します。これが必要なのですか、省略された場合はさらに問題を引き起こしますか? – Shambhala

+0

データ構造を入力した場合やレコードを使用している場合は、この行は必要ありません。基本的には、VirtualStringTreeを使って作業するときにこれを書いています。 – Linas

+0

ご協力いただきありがとうございます。 – Shambhala

1

が見えます。 Demosフォルダの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')を呼び出すことができます。私のデモとこの例では、より多くのオブジェクト指向ストリームのサポートのためにTStreamヘルパーを実装する別のユニット(uSvHelpers)を使用しました。もちろん、独自の方法でデータ情報をストリームに書き込むことができます。

関連する問題