В Delphi XE я собираю данные CF_UNICODETEXT из буфера обмена. Результатом является поток, который заканчивается двумя нулевыми байтами. Чтобы получить фактическую строку, скопированную в буфер обмена, мне нужно удалить нули.
Этот аналогичный вопрос содержит хороший метод преобразования TMemoryStream в Delphi строка Юникода:
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;
... но это кажется уродливым, «особенным». Интересно, есть ли более чистый способ закодировать это, чтобы кто-либо (я!), Посмотревший код позже, не сразу спросил: «Почему завершающий символ удаляется из потока?»
Изменить. Один из способов предварять вопрос - это добавить комментарий. Но кроме этого?
TBlockAllocatedMemoryStream = class(TStream)
выполняет свою работу без фрагментации. Он также не требует непрерывного адресного пространства и позволяет избежать еще одной ловушки с TMemoryStream. - person David Heffernan   schedule 20.01.2011