2011-06-11 68 views
2

我需要做一個TTreeView樹的Unicode字符串,所以我想加載這個字符串到內存流,然後加載內存流到樹視圖。我怎樣才能做到這一點?如何通過TMemoryStream將Unicode字符串加載到TTreeView中?

+0

問題不清楚,你不會將字符串添加爲一個TreeNode或什麼?順便說一句。你使用的是什麼Delphi版本?這很重要,因爲字符串是unicode – 2011-06-11 09:34:28

+0

你真的必須澄清。 「使用TTreeView的樹的字符串做些什麼」是什麼意思? – jpfollenius 2011-06-11 10:10:02

+0

夥計們,我有德爾福2010年。我創建TreeView的樹,添加一些其他字符串,並將其保存在Unicode作爲一個文件。然後我想將這個樹文件加載到TreeView中,但是在我編輯文件之前:先刪除添加的字符串。然後我需要將編輯後的字符串保存到MemoryStream中並將此MemoryStream加載到TreeView中。 – maxfax 2011-06-11 15:18:39

回答

1

您試圖直接使用TMemoryStreamTStringStream類intead。但是,這TStringStream類將編碼的UnicodeString入庫前的AnsiString類型,在Unicode的德爾福版本...

因此,這裏有一些功能來創建一個TMemoryStream實例與純Unicode的內容,然後檢索回這樣的文字:

function StringToMemoryStream(const Text: string): TMemoryStream; 
var Bytes: integer; 
begin 
    if Text='' then 
    result := nil else 
    begin 
    result := TMemoryStream.Create; 
    Bytes := length(Text)*sizeof(Char); 
    result.Size := Bytes; 
    move(pointer(Text)^,result.Memory^,Bytes); 
    end; 
end; 

function MemoryStreamToString(MS: TMemoryStream): string; 
begin 
    if MS=nil then 
    result := '' else 
    SetString(result,PChar(MS.Memory),MS.Size div sizeof(Char)); 
end; 

確保你FreeTMemoryStream當你不再需要它。

通過使用sizeof(Char)PChar,此代碼也可以與以前的非Unicode版本的Delphi一起使用。

+1

'procedure StringToMemoryStream(const Text:String; MemStream:TMemoryStream)'會更習慣。或者甚至更好:'procedure StringToMemoryStream(const Text:String; Stream:TStream)',然後使用'TStream'' Write'和'Read'方法。 – jpfollenius 2011-06-11 10:08:39

+0

粉碎機,它的工作原理String-> MemoryStream和MemoryStream-> String。但是,當我加載到TreeView的MemoryStream我得到'!@#$%^&*'在其中...不TreeView使用unicode?它保存文件在UTF-8 ... – maxfax 2011-06-11 15:22:21

+0

是的,我做TreeView1.LoadFromStream(UpdateMemoryStream,tencoding.Unicode)和所有warks – maxfax 2011-06-11 15:30:29

相關問題