Код, который у вас есть, излишне сложен, даже для более старых версий Delphi. Зачем, в конце концов, выборка строковой версии потока принудительно перераспределяет память потока?
function MemoryStreamToString(M: TMemoryStream): string;
begin
SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char));
end;
Это работает во всех версиях Delphi, не только в Delphi 2009. Это работает, когда поток пуст без какого-либо особого случая. SetString
- недооцененная функция.
Если содержимое вашего потока не меняется на Unicode при переключении на Delphi 2009, вам следует использовать эту функцию вместо:
function MemoryStreamToString(M: TMemoryStream): AnsiString;
begin
SetString(Result, PAnsiChar(M.Memory), M.Size);
end;
Это эквивалентно вашему исходному коду, но пропускает особые случаи.