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,但没有成功
我会很高兴任何有用的想法!
谢谢.
代码应该是这样的:
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)