【发布时间】:2011-01-19 17:39:48
【问题描述】:
在 Delphi XE 中,我从剪贴板捕获 CF_UNICODETEXT 数据。结果是一个以两个空字节结束的流。要获取复制到剪贴板的实际字符串,我需要去除空值。
This similar so question 包含一个从 TMemoryStream 转换为 Delphi 的 unicode 字符串的好方法:
function MemoryStreamToString(M: TMemoryStream): string;
begin
SetString(Result, M.Memory, M.Size div SizeOf(Char));
end;
然而,在我的例子中,这会产生一个包含尾随空值的字符串。我可以通过限制大小来解决这个问题:
function ClipboardMemoryStreamToString(M: TMemoryStream): string;
begin
SetString(Result, M.Memory, (M.Size - SizeOf(Char)) div SizeOf(Char));
end;
...但这感觉很难看,“特殊情况”。我想知道是否有一种更简洁的方法来编写代码,这样以后查看代码的任何人(我!)都不会立即问“为什么从流中删除尾随字符?”
编辑:先发制人的问题的一种方法是添加评论。但是,除此之外呢?
【问题讨论】:
-
你提到 TMemoryStream 很有趣。由于它的内存碎片实现,我今天花了我的整个代码库将它从我的整个代码库中删除(剩下的引用不多)!
-
@David:这很有趣。你的首选替代品是什么?
-
我自己亲手制作的
TBlockAllocatedMemoryStream = class(TStream)完成了这项工作,没有碎片。它也不需要连续的地址空间,因此避免了 TMemoryStream 的另一个陷阱。
标签: delphi memorystream unicode-string null-terminated