如何修复Delphi XE3迁移错误?

Nal*_*alu 4 delphi delphi-5 delphi-xe3

我正在将我的Delphi 5应用程序迁移到Delphi XE3.我在编译时得到了一些错误.有人可以帮我解决这些问题.提前感谢您的帮助.

  1. 我无法OemToChar在XE3中找到功能定义.当我按住Ctrl键并单击该功能时,它会显示消息Unable to locate 'WinAPI.Windows.pas'.我无法打开任何delphi组件文件.windows.pas位于系统上的位置是什么?或者如何解决?

  2. Incompatiable Types: 'PAnsiChar' and 'PWideChar'在下面的功能在线OemToChar(p1, p2).

function OemToAnsi(const Str: string): string;
var
  p1,
  p2: PChar;
begin
  p1 := PChar(Str);
  p2 := StrNew(p1);
  OemToChar(p1, p2);
  Result := StrPas(p2);
  StrDispose(p2);
end;
Run Code Online (Sandbox Code Playgroud)
  1. 'Low Bound Exceeds High Bound'在以下代码中获取错误.

function StrToRichText(const Str: string): string;
var
  i: integer;
begin
  Result := '';
  for i := 1 to Length(Str) do
  begin
    case Str[i] of
      #128 .. #255 :
        Result := Result + '\''' + LowerCase(IntToHex(Ord(Str[i]), 2));
      '\','{','}':
        Result := Result + '\' + Str[i];
    else
      Result := Result + Str[i];
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 7

你的OemToAnsi功能应该是这样的:

function OemToAnsi(const Str: AnsiString): AnsiString;
begin
  SetLength(Result, Length(Str));
  OemToCharA(PAnsiChar(Str), PAnsiChar(Result));
end;
Run Code Online (Sandbox Code Playgroud)

但也许你会更好

function OemToWide(const Str: AnsiString): string;
begin
  SetLength(Result, Length(Str));
  OemToChar(PAnsiChar(Str), PChar(Result));
end;
Run Code Online (Sandbox Code Playgroud)

至于你StrToRichText,那看起来更难.它显然只接受ANSI输入.如果你想坚持使用ANSI,那么只需将声明更改为

function StrToRichText(const Str: AnsiString): AnsiString;
Run Code Online (Sandbox Code Playgroud)

RTF使用7位ASCII编码.要使该函数与Unicode输入一起使用,您需要使用ordinal> = 128转义任何字符.例如,在Wikipedia 富文本格式页面上描述了转义.我会把它作为锻炼给你!


在你走得更远之前,你需要阅读MarcoCantù的白皮书:Delphi和Unicode.