Delphi XE上的ERangeError

Mar*_*cha 1 delphi types delphi-xe

我正在将软件从Delphi 5迁移到Delphi XE.我已经纠正了很多差异,现在我可以编译我的代码了.

发生的问题是有时(在代码的某些地方),我收到错误"范围检查错误".

例如,在此代码中:

function CopyChar(Ori : string; var Des : Array of char) : Boolean;
var Msg     : string;
    Counter : integer;
    SizeDes : integer;
begin
    SizeDes:= SizeOf(Des);
    for Counter:= 1 to SizeDes do begin
        Des[Counter-1]:= ' ';
    end;
    Ori:= Trim(Ori);
    Msg:= '';
    SizeDes:= Min(Length(Ori),SizeDes);
    for Counter:= 1 to SizeDes do begin
        Des[Counter-1]:= char(Ori[Counter]);
    end;
    CopyChar:= True;
end;
Run Code Online (Sandbox Code Playgroud)

经过Des [Counter-1]行时,我在运行时得到错误:=''; 错误发生在第一次通过循环时,但在很多次之后.

我试图禁用Rance Checking($ R),但它没有解决我的问题.我也尝试将"Counter"的类型更改为Cardinal和LongWord,但没有成功

我会很高兴任何有用的想法!

谢谢.

Dav*_*nan 5

代码应该是这样的:

function CopyChar(Ori : string; var Des : Array of char) : Boolean;
var Msg     : string;
    Counter : integer;
    LenDes  : integer;
begin
    LenDes:= Length(Des);
    for Counter:= 1 to LenDes do begin
        Des[Counter-1]:= ' ';
    end;
    Ori:= Trim(Ori);
    Msg:= '';
    LenDes:= Min(Length(Ori),LenDes);
    for Counter:= 1 to LenDes do begin
        Des[Counter-1]:= char(Ori[Counter]);
    end;
    CopyChar:= True;
end;
Run Code Online (Sandbox Code Playgroud)

我想你的问题是Char现在是2字节宽(在Delphi 5中它是1字节宽)虽然我从来没有在开放阵列上使用过SizeOf,甚至不知道它做了什么!

此代码还有其他一些问题.返回值似乎有点无意义,因为它只能返回True.它也可以像这样压缩:

procedure CopyChar(Ori: string; var Des: array of char);
var
  i: Integer;
begin
  Ori := Trim(Ori);
  for i := 1 to Length(Des) do begin
    if i<=Length(Ori) then
      Des[i-1] := Ori[i];
    else
      Des[i-1] := ' ';
  end;
end;
Run Code Online (Sandbox Code Playgroud)