Delphi 2010错误E2010不兼容的类型:Char'和'AnsiChar'

时间:2014-06-29 16:11:23

标签: delphi

我从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;

1 个答案:

答案 0 :(得分:3)

在Delphi 2009及更高版本中,(P)Char(P)WideChar的别名,而在早期版本中它是(P)AnsiChar的别名。这就是您收到编译器错误的原因。

MultiByteToWideChar()的第三个参数在所有版本的Delphi中都需要PAnsiChar。只需将PChar更改为PAnsiChar即可。考虑到StrAAnsiString而不是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()功能变得多余,可以完全消除。