2017-08-10 14 views
4

私はvirtualtreeコンポーネントとマニュアル "Virtual TreeView tutorial"をダウンロードしました。私はチュートリアルとステップごとにコーディングに従います。チュートリアルの機能のほとんどは、savetofileとloadfromfileが機能しないことを除いて、大丈夫です。Delphiを使用して仮想ツリーコンポーネントのファイルを保存/ロードする方法は?

マイノードデータは、

type 
    PMytreedata = ^TMYTreeData; 
    TMYTreeData = record 
    Column0: String; 
    Column1: String; 
    Column2: String; 
    end; 

質問が何か文字列がCOLUMN0に負けですがカラム1/2時にファイルからのロード。コードエラー

ずにノードのサイズを取得します

ファイルからファイルをロードするために

procedure TForm3.Button1Click(Sender: TObject); //CRETAE NEW NODE AND DATA 
begin 
    Randomize; 
    Rand := Random(99); 
    XNode := VST.AddChild(nil); 

    if VST.AbsoluteIndex(XNode) > -1 then 
    begin 
    Data := VST.GetNodeData(Xnode); 
    Data^.Column0 := IntToStr(Rand)+EDIT1.Text + 'One' ; 
    Data^.Column1 := EDIT1.Text+'Two' + IntToStr(Rand + 10); 
    Data^.Column2 := EDIT1.Text+'Three' + IntToStr(Rand - 10); 
    end; 
end; 

procedure TForm3.Button2Click(Sender: TObject);//ADDCHILD 
var 
    XNode: PVirtualNode; 
    Data: PMytreedata; 
begin 
    if not Assigned(VST.FocusedNode) then 
    Exit; 

    XNode := VST.AddChild(VST.FocusedNode); 
    Data := VST.GetNodeData(Xnode); 

    Data^.Column0 := EDIT1.Text ; 
    Data^.Column1 := EDIT2.Text ; 
    Data^.Column2 := EDIT3.Text ; 

    VST.Expanded[VST.FocusedNode] := True; 
end; 

保存

procedure TForm3.Button4Click(Sender: TObject); 
begin 
    VST.SaveToFile('C:\vst.at1'); 
end; 

procedure TForm3.Button5Click(Sender: TObject); 
begin 
    VST.LoadFromFile('C:\vst.at1'); 
end; 

コードが

の下に新しいノードとデータを作成しています
procedure TForm3.VSTGetNodeDataSize(Sender: TBaseVirtualTree; 
    var NodeDataSize: Integer); 
begin 
    NodeDataSize := SizeOf(TMYTreeData);//WITHOUT THE CODE,ERROR COMING . 
end; 

表示テキスト

procedure TForm3.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; 
    Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); 
var 
    Data: PMytreedata; 
begin 
    Data := VST.GetNodeData(Node); 
    case Column of 
    0: CellText := Data^.Column0; 
    1: CellText := Data^.Column1; 
    2: CellText := Data^.Column2; 
    end; 
end; 

LOADフォームファイル

procedure TForm3.VSTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; 
    Stream: TStream);//LOAD FORM FILE 
var 
    Data: PMytreedata; 
    Len: Integer; 
begin 
     Data := VST.GetNodeData(Node); 

     Stream.read(Len, SizeOf(Len)); 
     SetLength(Data^.Column0, Len); 
     Stream.read(PChar(Data^.Column0)^, Len); 

     Stream.read(Len, SizeOf(Len)); 
     SetLength(Data^.Column1, Len); 
     Stream.read(PChar(Data^.Column1)^, Len); 

     Stream.read(Len, SizeOf(Len)); 
     SetLength(Data^.Column2, Len); 
     Stream.read(PChar(Data^.Column2)^, Len); 
end; 

Unicodeのデルファイ、2009年に

procedure TForm3.VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; 
    Stream: TStream); //SAVE TO FILE 
var 
    Data: PMytreedata; 
    Len: Integer; 
begin 
    Data := VST.GetNodeData(Node); 

    Len := Length(Data^.Column0); 
    Stream.write(Len, SizeOf(Len)); 
    Stream.write(PChar(Data^.Column0)^, Len); 

    Len := Length(Data^.Column1); 
    Stream.write(Len, SizeOf(Len)); 
    Stream.write(PChar(Data^.Column1)^, Len); 

    Len := Length(Data^.Column2); 
    Stream.write(Len, SizeOf(Len)); 
    Stream.write(PChar(Data^.Column2)^, Len); 
end; 

答えて

7

をファイルに保存し、後で、Charは、16ビットのタイプ、WideCharです。あなたはこれを説明していないので、文字列の半分しか書いていません。文字列の内容については、WriteReadの各呼び出しで2倍のバイト数を書き込む必要があります。例えば

、この

Stream.read(PChar(Data^.Column0)^, Len); 

などの各ラインは

Stream.read(PChar(Data^.Column0)^, Len*SizeOf(Char)); 

他のいくつかのコメントをする必要があります:あなたは、各文字列を読み書きするコードを複製

  • 。それらの繰り返しセクションを再利用のためのメソッドに抽出する方が良いでしょう。
  • Writeではなく、WriteBufferを使用してください。 WriteBufferWriteを呼び出すだけでなく、戻り値をチェックしてエラーチェックを実行します。同様にReadではなくReadBufferを呼び出します。
+0

私はwritebufferの使用経験がありません。私はそれをテストし、それは正常に動作します。あなたのためのあなたのための迅速かつ正確な解決策。ありがとう – u950321

関連する問題