2014-05-12 32 views
2

我正在按照本教程來保存和加載我的VirtualStringTree:http://wiki.freepascal.org/VirtualTreeview_Example_for_Lazarus 我現在的問題是,當我保存和加載時,我的數據已損壞。字符已更改並添加。那麼有誰知道問題是什麼?保存和加載後損壞的數據VirtualStringTree

+2

你需要讀寫比Lazarus的例子多的字節。更具體地說,你必須寫'(Data.Column,Len * SizeOf(Char));'和Read(Data.Column,Len * SizeOf(Char));'因爲你的字符串是每個字符2字節Delphi版本。儘管如此,我會離開這個例子,或者爲字符串寫入和讀取做輔助函數,或者使用現成的'TBinaryWriter'。 – TLama

+0

你幾乎在那裏。你確實給了我信息來尋找正確的代碼。 Tnx – Eszee

回答

2

我發現這個Link並改變了awnser以適合我的代碼。

Data.Symbol[1] //Simply points to a char. So I changed it to 'char' 

閱讀:

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

//Copy/Paste this code for all Columns 

寫:

Len := Length(Data.Column0); 
Stream.Write(Len, SizeOf(Len)); 
Stream.Write(PChar(Data.Column0)^, Length(Data.Column0) * SizeOf(Char)); 

//Copy/Paste this code for all Columns 

第二個答案由TLama:

閱讀:

var 
    TreeData: PTreeData; 
    BinaryReader: TBinaryReader; 
begin 
    TreeData := Sender.GetNodeData(Node); 

    BinaryReader := TBinaryReader.Create(Stream); 
    try 
    TreeData.Column0 := BinaryReader.ReadString; 
    TreeData.Column1 := BinaryReader.ReadString; 
    TreeData.Column2 := BinaryReader.ReadString; 
    finally 
    BinaryReader.Free; 
    end; 
end; 

寫:

var 
    TreeData: PTreeData; 
    BinaryWriter: TBinaryWriter; 
begin 
    TreeData := Sender.GetNodeData(Node); 

    BinaryWriter := TBinaryWriter.Create(Stream); 
    try 
    BinaryWriter.Write(TreeData.Column0); 
    BinaryWriter.Write(TreeData.Column1); 
    BinaryWriter.Write(TreeData.Column2); 
    finally 
    BinaryWriter.Free; 
    end; 
end; 

我實現TLama的答案,因爲我真的不能與所有的指針困擾。這段代碼看起來好多了,讀起來容易多了,佔用的空間也少,而且也一樣。

所以得出結論。當你在網上搜索保存你的VST數據時,你會得到很多垃圾代碼。第一個答案會爲你解決這個問題。第二個會讓你微笑:)

+1

使用二進制閱讀器和編寫器,我認爲你可以寫一些東西['like this'](http://pastebin.com/VpyaZ0T6)。 – TLama

+0

@TLama看起來不錯。我的代碼更全面。我會看看我能否實施它。謝謝你。 – Eszee

+0

@Tlama我實現了它。如果你喜歡我可以接受你的答案,你應該發佈它;)謝謝你很多。 – Eszee