We had the following code prior to 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;
How might we convert this code to support Unicode now with Delphi 2009?
The code you have is unnecessarily complex, even for older Delphi versions. Why should fetching the string version of a stream force the stream’s memory to be reallocated, after all?
That works in all Delphi versions, not just Delphi 2009. It works when the stream is empty without any special case.
SetStringis an under-appreciated function.If the contents of your stream aren’t changing to Unicode with your switch to Delphi 2009, then you should use this function instead:
That’s equivalent to your original code, but skips the special cases.