19-02-2014, 08:21 PM
المشكلة أن كومبايلر أندرويد يستخدم Zero based string : بمعنى الترقيم يبدأ من الصفر و ليس الواحد !!
يمكن تعطيله باستخدام التوجيه :
لكن كحل مثالي و آمن أنصحك أن لا تقوم بتعطيله لأن ال RTL الخاصة بالأندرويد تعمل بنفس المبدأ Zero Based ..
هذا حل يلبي احتياجك :
يمكن تعطيله باستخدام التوجيه :
PHP كود :
{$ZEROBASEDSTRINGS OFF}
لكن كحل مثالي و آمن أنصحك أن لا تقوم بتعطيله لأن ال RTL الخاصة بالأندرويد تعمل بنفس المبدأ Zero Based ..
هذا حل يلبي احتياجك :
PHP كود :
{$IF CompilerVersion >=26}
{$IFDEF MSWINDOWS}
{$ZEROBASEDSTRINGS ON}
{$DEFINE ZeroBasedStrOn}
{$ENDIF}
{$IFEND}
function CalculateCode(LicenseName: string): string;
var
i, Code: integer;
CodeStr: string;
Num: Int64;
FSeed: Int64;
FRegCodeSize: integer;
begin
FSeed := 3210;
FRegCodeSize := 13;
// You can modify this algorithm if you want to...
if (Length(LicenseName) > 21) or (Length(LicenseName) < 4) then
begin
Result := ''; // LicenseName did not fit length requirements
Exit;
end;
i := Length(LicenseName){$IFDEF ZeroBasedStrOn} - 1{$ENDIF};
// Takes the last 6 characters (going backwards), converting each
// character to ASCII and taking the remainder of dividing it into Seed
while {$IFDEF ZeroBasedStrOn} (i >= Length(LicenseName) - 1 - 8) and (i >= 0)
{$ELSE}
(i >= Length(LicenseName) - 8) and (i > 0)
{$ENDIF}
do
begin
CodeStr := CodeStr + IntToStr(FSeed mod Ord(LicenseName[i]));
Dec(i);
end;
Val(CodeStr, Num, Code);
if FRegCodeSize <= 0 then
Result := IntToHex(Num, 0)
else
begin
Result := IntToHex(Num, FRegCodeSize);
Delete(Result, FRegCodeSize + 1, Length(Result) - FRegCodeSize);
end;
end;
Open Your Source .. Open Your Mind

