delphi4arab منتديات دلفي للعرب
مشكل Division by zero في delph xe 5 android - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : مشكل Division by zero في delph xe 5 android (/showthread.php?tid=5930)



مشكل Division by zero في delph xe 5 android - sky19 - 09-02-2014

السلام عليكم عندي استفسار

طبقت هذا الكود في Delphi XE وعمل بنجاح
واعدت تطبيقه في Delphi XE Android ثم جربته في الهاتف تخرج لي الرسالة
Division by zero

كود :
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); // Takes the last 6 characters (going backwards), converting each // character to ASCII and taking the remainder of dividing it into Seed while (i >= Length(LicenseName) - 8) and (i > 0) 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; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := CalculateCode(Edit1.Text); end;



مشكل Division by zero في delph xe 5 android - SMP3 - 19-02-2014

المشكلة أن كومبايلر أندرويد يستخدم Zero based string : بمعنى الترقيم يبدأ من الصفر و ليس الواحد !!
يمكن تعطيله باستخدام التوجيه :

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; 



مشكل Division by zero في delph xe 5 android - sky19 - 21-02-2014

نفس المشكلة


مشكل Division by zero في delph xe 5 android - SMP3 - 21-02-2014

اعتذر .. غير :
PHP كود :
{$IF CompilerVersion >=26} 
   {
$IFDEF MSWINDOWS} 
      {
$ZEROBASEDSTRINGS ON} 
      {
$DEFINE ZeroBasedStrOn} 
   {
$ENDIF} 
{
$IFEND} 
الى :
PHP كود :
{$IF CompilerVersion >=26}// Delphi XE5 
   
{$ZEROBASEDSTRINGS ON} 
   {
$DEFINE ZeroBasedStrOn} 
{
$IFEND}