jet*_*tty 0 delphi unicode delphi-2007 delphi-xe7
我正在开发一个最近从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;
Run Code Online (Sandbox Code Playgroud)
添加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;
Run Code Online (Sandbox Code Playgroud)
我观察到StrLen(PChar)的大小也是TMemoryStream的一半.但是在Delphi 2007中,它的出现与TMemoryStream的大小相同.
我知道上面的代码假设char的大小为1个字节,这可能是个问题.但我尝试了多种方法,没有任何效果.
你能建议一个更好的方法来进行这种转换吗?
再一次,这是Delphi 2009及以后使用Unicode文本的问题.在Delphi 2007及更早版本中:
Char
是别名AnsiChar
.PChar
是别名PAnsiChar
.string
是别名AnsiString
.在Delphi 2009及更高版本中:
Char
是别名WideChar
.PChar
是别名PWideChar
.string
是别名UnicodeString
.你的代码是假设PChar
的PAnsiChar
.因此你的问题.StrAlloc
无论如何你需要停止使用.你在这里通过手动分配堆内存让自己变得艰难.让编译器完成工作.
您需要在字符串变量中获取文本,然后只需执行以下操作:
Clipboard.AsText := MyStrVariable;
Run Code Online (Sandbox Code Playgroud)
究竟如何最好地获得字符串取决于提供的设施TCReport
.我希望它会直接产生一个字符串,在这种情况下你会写这样的东西:
procedure TCReport.CopyToClipboard;
begin
Clipboard.AsText := Self.ReportAsText;
end;
Run Code Online (Sandbox Code Playgroud)
我猜你的功能是什么TCReport
,但我相信你知道.
归档时间: |
|
查看次数: |
354 次 |
最近记录: |