Я работаю над приложением, которое недавно было обновлено с Delphi 2007 до XE7. Существует один конкретный сценарий, когда преобразование TMemoryStream в PChar не выполняется. Вот код:StrAlloc не работает после перехода на Delphi XE7
procedure TCReport.CopyToClipboard;
var
CTextStream: TMemoryStream;
PValue: PChar;
begin
CTextStream := TMemoryStream.Create;
//Assume that this code is saving a report column to CTextStream
//Verified that the value in CTextStream is correct
Self.SaveToTextStream(CTextStream);
//The value stored in PValue below is corrupt
PValue := StrAlloc(CTextStream.Size + 1);
CTextStream.Read(PValue^, CTextStream.Size + 1);
PValue[CTextStream.Size] := #0;
{ Copy text stream to clipboard }
Clipboard.Clear;
Clipboard.SetTextBuf(PValue);
CTextStream.Free;
StrDispose(PValue);
end;
Добавление кода для SaveToTextStream:
procedure TCReport.SaveToTextStream(CTextStream: TStream);
var
CBinaryMemoryStream: TMemoryStream;
CWriter: TWriter;
begin
CBinaryMemoryStream := TMemoryStream.Create;
CWriter := TWriter.Create(CBinaryMemoryStream, 24);
try
CWriter.Ancestor := nil;
CWriter.WriteRootComponent(Self);
CWriter.Free;
CBinaryMemoryStream.Position := 0;
{ Convert Binary 'WriteComponent' stream to text}
ObjectBinaryToText(CBinaryMemoryStream, CTextStream);
CTextStream.Position := 0;
finally
CBinaryMemoryStream.Free;
end;
end;
Я заметил, что StrLen (PChar) также выходит, что половина размера TMemoryStream. Но в Delphi 2007 он вышел так же, как и размер TMemoryStream.
Я знаю, что приведенный выше код предполагает, что размер символа равен 1 байту, и это может быть проблемой. Но я попробовал несколько подходов, и ничего не работает.
Не могли бы вы предложить лучший способ сделать это преобразование?
В какой кодировке хранится данные 'SaveToTextStream'? Правильный способ исправления кода зависит от используемой кодировки. Три реалистичные возможности: 1) та же кодировка, что и «UnicodeString» (UTF-16LE) 2) UTF-8 3) та же кодировка, что и «AnsiString» (которые зависят от активной кодовой страницы Windows). – hvd
Почему это было отклонено? – jetty