【发布时间】:2015-11-30 11:11:34
【问题描述】:
我正在开发一个最近从 Delphi 2007 升级到 XE7 的应用程序。在一种特殊情况下,将 TMemoryStream 转换为 PChar 失败。代码如下:
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 的大小相同。
我知道上面的代码假设 char 的大小为 1 个字节,这可能是个问题。但是我尝试了多种方法,但没有任何效果。
您能否建议一种更好的方法来进行这种转换?
【问题讨论】:
-
SaveToTextStream以什么编码存储数据?修复代码的正确方法取决于使用的编码。三种现实可能性是 1) 与UnicodeString(UTF-16LE) 2) UTF-8 相同的编码 3) 与AnsiString相同的编码(取决于 Windows 活动代码页)。 -
为什么这被否决了??
标签: delphi unicode delphi-2007 delphi-xe7