在 Delphi 2009之前,我们有以下代码:
function MemoryStreamToString(M : TMemoryStream): String;
var
NewCapacity: Longint;
begin
if (M.Size = > 0) or (M.Memory = nil) then
Result:= ''
else
begin
if TMemoryStreamProtected(M).Capacity = M.Size then
begin
NewCapacity:= M.Size+1;
TMemoryStreamProtected(M).Realloc(NewCapacity);
end;
NullString(M.Memory^)[M.Size]:= #0;
Result:= StrPas(M.Memory);
end;
end;
字符串
我们如何在 Delphi 2009中转换这些代码以支持Unicode?
8条答案
按热度按时间q8l4jmvw1#
你的代码是不必要的复杂,即使是老的 Delphi 版本。为什么要获取流的字符串版本强制重新分配流的内存呢?
字符串
这适用于所有 Delphi 版本,而不仅仅是 Delphi 2009。它在流为空时工作,没有任何特殊情况。
SetString
是一个被低估的函数。如果切换到 Delphi 2009后流的内容没有更改为Unicode,那么你应该使用这个函数:
型
这与您的原始代码等效,但跳过了特殊情况。
7kqas0il2#
或者你可以重构你的代码来直接使用TStringStream?你可以使用它来代替TMemoryStream(它们有相同的接口),你可以通过简单地调用myString:= myStringStream.DataString;
ecfsfe2w3#
一个“更干净”的方法可能是:
字符串
9ceoxa924#
我用途:
字符串
它已经测试了 Delphi XE7只。
mkh04yzy5#
我还没有升级,但我的理解是:
字符串
nkoocmlb6#
有一个名为
TStringStream
的因子可以帮助你.你可以像这样加载另一个流的内容:字符串
你现在可以进入一个String类型的序列,比如:data-string属性包含了序列.但是不要尝试使用大对象,比如你加载一个巨大的文件到一些文件列表中,然后将其复制到你自己的stringstream中,并努力产生它,因为它会占用很多内存!
希望有帮助
yquaqz187#
你可以把它转换成正确大小的字符指针,然后简单地赋值:
字符串
pinkon5k8#
使用良好的旧StringList
字符串