使用delphi在android应用程序中使用序列号安全
此代码在Firemonkey Windows应用程序中有效,但在Android应用程序中无效,我得到的是使用delphi在android应用程序中使用序列号安全,android,delphi,delphi-10-seattle,Android,Delphi,Delphi 10 Seattle,此代码在Firemonkey Windows应用程序中有效,但在Android应用程序中无效,我得到的是再见而不是欢迎,怎么了 Edit8文本:162496//计算机唯一代码 Edit9文本:1564224593//序列号# 程序TForm2.按钮5点击(发送方:TObject); 变量 f2,f1:文本文件; i、 j:字节; s1,s2,s3,c:字符串; F:文本文件; 开始 j:=0; s2:=Edit8.Text; 对于i:=1到长度(s2)do 如果(s2[i]>='0')和(s2[
再见
而不是欢迎
,怎么了
Edit8文本:162496//计算机唯一代码
Edit9文本:1564224593//序列号#
程序TForm2.按钮5点击(发送方:TObject);
变量
f2,f1:文本文件;
i、 j:字节;
s1,s2,s3,c:字符串;
F:文本文件;
开始
j:=0;
s2:=Edit8.Text;
对于i:=1到长度(s2)do
如果(s2[i]>='0')和(s2[i]Delphi移动编译器使用
你有三个选择:
正如@Günter_the_Beautiful所指出的,您最好的选择是重写代码以供使用(代码总是基于0)
重写代码以使用基于0的索引:将I:=0改为…
如果需要快速修复,请使用{$ZEROBASEDSTRINGS off}
指令在代码段本地将其关闭(并再次使用{$ZEROBASEDSTRINGS ON}
将其还原)
<选项> 2和3。如果你需要你的代码是跨平台的,考虑使用合适的平台。这就是选项1。强制:不需要用条件定义来扰乱你的代码。 < Pdel> Delphi移动编译器使用.< /P>
你有三个选择:
正如@Günter_the_Beautiful所指出的,您最好的选择是重写代码以供使用(代码总是基于0)
重写代码以使用基于0的索引:将I:=0改为…
如果需要快速修复,请使用{$ZEROBASEDSTRINGS off}
指令在代码段本地将其关闭(并再次使用{$ZEROBASEDSTRINGS ON}
将其还原)
<选项> 2和3。如果你需要你的代码是跨平台的,考虑使用合适的平台。这就是选项1。强制:不需要用条件定义来扰乱你的代码。 < P>我使用这两个助手例程:
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的字符串(这是逻辑选择:-)。我使用这两个帮助程序例程:
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的字符串(这是逻辑选择:-))只要你总是使用这两个函数以字符的形式访问字符串。我强烈建议不要用编译器指令把代码弄得乱七八糟,只是为了保持从索引1
开始而不是像其他地方那样从0
开始的奇怪习惯。由于XE3或其他一些东西,有一些字符串帮助程序可以让您以零访问权限访问字符串的Char
,而无需担心它运行的平台:如果myString.Chars[0]='X',那么…
)。好吧,我在两个for循环中都将其更改为i:=0
,还是相同的问题,重写完整的代码?更新您的答案,谢谢@OndrejKelle@unknown。。。到长度(s2)-1
<代码>到长度(s3)-2
?我是说。。。你知道,你总是可以尝试使用调试器。并打开范围检查。你的索引中有复合算法。你必须把它归为零。考虑<代码> [I*2-1 ] < /代码>。这显然马上就会出问题。@unknown我建议你再努力一点。这个答案告诉您代码有什么问题。现在轮到你做些工作了。不要束手无策。@unknown您不需要编译一个庞大的项目来调试它。制作一个可以在几秒钟内编译的测试应用程序。请看:我强烈建议不要为了保持从索引1
而不是像其他任何地方那样从0
开始的奇怪习惯,就用编译器指令来混乱代码。由于XE3或其他一些东西,有一些字符串帮助程序可以让您以零访问权限访问字符串的Char
,而无需担心它运行的平台:如果myString.Chars[0]='X',那么…
)。好吧,我在两个for循环中都将其更改为i:=0
,还是相同的问题,重写完整的代码?更新您的答案,谢谢@OndrejKelle@unknown。。。到长度(s2)-1
<代码>到长度(s3)-2?我是说。。。你知道,你总是可以尝试使用调试器。并打开范围检查。你的索引中有复合算法。你必须把它归为零。考虑<代码> [I*2-1 ] < /代码>。这显然马上就会出问题。@unknown我建议你再努力一点。这个答案告诉您代码有什么问题。现在轮到你做些工作了。不要束手无策。@unknown您不需要编译一个庞大的项目来调试它。制作一个可以在几秒钟内编译的测试应用程序。见: