我从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;
答案 0 :(得分:3)
在Delphi 2009及更高版本中,(P)Char
是(P)WideChar
的别名,而在早期版本中它是(P)AnsiChar
的别名。这就是您收到编译器错误的原因。
MultiByteToWideChar()
的第三个参数在所有版本的Delphi中都需要PAnsiChar
。只需将PChar
更改为PAnsiChar
即可。考虑到StrA
是AnsiString
而不是String
(这是D2009 +中UnicodeString
的别名),哪个会正常工作,因此它们会匹配。
话虽如此,您应该使用CP_ACP
常量而不是GetACP()
函数,在调用Result
之前删除冗余赋值(和转换)MultiByteToWideChar()
,删除不必要的字符索引,并删除不必要的空终止符处理:
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()
功能变得多余,可以完全消除。