[英]Delphi 2010 Error E2010 Incompatible types: 'AnsiChar' and 'Char'
[英]Delphi 2010 Error E2010 Incompatible types: Char' and 'AnsiChar'
我从Delphi加载了一些代码,当我在Delphi 2010中进行编译时,我得到了E2010不兼容的类型:'Char'和'AnsiChar'。
如何解决此错误? 请帮助
function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
var
nLen: integer;
begin
Result := StrA;
if Result <> '' then
begin
nLen := MultiByteToWideChar(GetACP(), 1, PChar(@StrA[1]), -1, nil, 0);
SetLength(Result, nLen - 1);
if nLen > 1 then
MultiByteToWideChar(GetACP(), 1, PChar(@StrA[1]), -1, PWideChar(@Result[1]), nLen - 1);
end;
end;
在Delphi 2009和更高版本中, (P)Char
是(P)WideChar
的别名,而在早期版本中是(P)AnsiChar
的别名。 这就是为什么您遇到编译器错误的原因。
MultiByteToWideChar()
的第三个参数在所有版本的Delphi中均要求PAnsiChar
。 因此,只需将PChar
更改为PAnsiChar
。 这将很好地工作考虑StrA
被AnsiString
,而不是String
(这是一个别名UnicodeString
在D2009 +),所以他们会匹配。
就是说,您应该使用CP_ACP
常量而不是GetACP()
函数,在调用MultiByteToWideChar()
之前删除对Result
的冗余分配(和转换MultiByteToWideChar()
,删除不必要的字符索引,以及删除不必要的null终止符处理:
function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
var
nLen: integer;
begin
Result := '';
nLen := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(StrA), Length(StrA), nil, 0);
if nLen > 0 then
begin
SetLength(Result, nLen);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(StrA), Length(StrA), PWideChar(Result), nLen);
end;
end;
话虽如此,请不要在D2009 +中将WideString
用于非ActiveX工作。 UnicodeString
更有效。
function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): UnicodeString;
最后,由于您正在设置CodePage
到ACP和dwFlags
参数MB_PRECOMPOSED
(这是,如果没有指定其他标志默认),你可以只消除所有这些代码,让RTL为您处理转换,因为它使用的默认情况下,内部使用相同的设置:
function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
begin
Result := WideString(StrA);
end;
要么:
function TFKirimEmail.ChAnsiToWide(const StrA: RawByteString): UnicodeString;
begin
Result := UnicodeString(StrA);
end;
在这种情况下,您的ChAnsiToWide()
函数将变得多余,可以完全消除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.