此代码在Firemonkey Windows应用中运行,但在Android应用中不起作用,我得Goodbye
而不是Welcome
,出了什么问题?
Edit8 Text:162496 //计算机唯一代码
Edit9 Text:1564224593 // serial#
procedure TForm2.Button5Click(Sender: TObject);
var
f2,f1:textfile;
i,j:byte;
s1,s2,s3,c:string;
F: TextFile;
begin
j:=0;
s2 := Edit8.Text;
for i:=1 to Length(s2) do
if (s2[i]>='0') and (s2[i]<='9') then
s3:=s3+s2[i];
for i:=1 to Length(s3)-1 do
if (edit9.Text[i*2-1]<>s3[i]) or (abs(strtoint(s3[i+1])-strtoint(s3[i]))<> strtoint(edit9.Text[i*2])) then
inc(j);
if j=0 then
ShowMessage('Welcome')
else
ShowMessage('Goodbye');
end;
答案 0 :(得分:4)
Delphi移动编译器使用zero-based strings。
您有三种选择:
for I := 0 to ...
{$ZEROBASEDSTRINGS OFF}
指令在本地为您的代码段将其关闭(并再次使用{$ZEROBASEDSTRINGS ON}
还原)。对于选项2和3.,如果您需要跨平台代码,请考虑使用适当的平台conditional defines。这就是选项1.引人注目的原因:不需要使用条件定义来混淆代码。
答案 1 :(得分:-1)
我正在使用这两个帮助程序:
FUNCTION GetChar(CONST S : STRING ; OneBasedIndex : LongWord) : CHAR;
BEGIN
{$IF CompilerVersion>=24 }
Result:=S[SUCC(OneBasedIndex-LOW(S))]
{$ELSE }
Result:=S[OneBasedIndex]
{$IFEND }
END;
PROCEDURE SetChar(VAR S : STRING ; OneBasedIndex : LongWord ; NewChar : CHAR);
BEGIN
{$IF CompilerVersion>=24 }
S[SUCC(OneBasedIndex-LOW(S))]:=NewChar
{$ELSE }
S[OneBasedIndex]:=NewChar
{$IFEND }
END;
这样,只要您始终使用这两个函数将字符串作为字符访问,就可以继续使用基于1的字符串(这是逻辑选择:-))。