繁体   English   中英

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

[英]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 这将很好地工作考虑StrAAnsiString ,而不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM