كيف تحويل فانكشن من الاكسس الى لغة دلفي
#1
الاخوة الكرام وجدت هذا الفانكشن التالي:

PHP كود :
Function ID_Validation(ByVal SEGEL_NO AsString) AsBoolean
Dim i
, TOT AsInteger
Dim TEMP
, FIN AsString
TOT 
= 0
For i = 1 To 9
If (i = 1) Or (i = 3) Or (i = 5) Or (i = 7) Or (i = 9) Then
TEMP 
= (CInt(Mid(SEGEL_NO, i, 1)) * 2).ToString
If Len(TEMP) = 1 Then
TEMP 
= "0" & (CInt(Mid(SEGEL_NO, i, 1)) * 2).ToString
Else
TEMP = (CInt(Mid(SEGEL_NO, i, 1)) * 2).ToString
EndIf
TOT = TOT + CInt(Mid(TEMP, 1, 1)) + CInt(Mid(TEMP, 2, 1))
Else
TOT = TOT + CInt(Mid(SEGEL_NO, i, 1))
EndIf
Next
IfCStr
(TOT).Length = 1 Then
FIN 
= "0" & TOT
Else
FIN = TOT.ToString
EndIf
ID_Validation = (CInt(Mid(FIN, 2, 1)) = CInt(Mid(SEGEL_NO, 10, 1))) Or (CInt(Mid(SEGEL_NO, 10, 1)) = 10 - CInt(Mid(FIN, 2, 1)))
Return 
ID_Validation
EndFunction 

والذي يفيد في التحقق من صحة ادخال السجل الوطني في السعودية
بحيث اذا وضع الرقم في EDIT يعمل عليه تشيك فاذا كان صحيح قبل او يعرض رسالة بعدم صحة الرقم.

كيف احولة الى لغة الدلفي ؟

تحياتي وتقديري للجميع.
الرد
#2
السلام عليكم

هده لغة VB.NET وليس Access

التحويل سهل جدا بدل استعمال Mid...في دلفي مثلا ستستعمل بدلها الدالة Copy...وهكدا وان أردت ماهو جديد ويوفر الوقت تعلم أخي التعابير القياسية فقد تم دعمها كدلك في دلفي مند الاصدار XE
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#3
بارك الله فيك ، ياليت لوتساعدني بالتحويل.
الرد
#4
أرفق أخي محاولتك كي تتم مساعدتك

CInt دالة تحول نوع من البيانات الى Integer ...في دلفي ستسعمل ما يقابلها ك StrToInt

CStr تقوم بتحويل نوع من البيانات الى String .في دلفي ستسعمل ما يقابلها ك IntToStr
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#5
هدا تحويل ..على السريع ...تأكد من صحته

لم أجرب الدالة

PHP كود :
function ID_Validation(SEGEL_NO: string): Boolean;
var 
i, TOT: Integer;
  
TMP, FIN: string;
begin
  TOT 
:= 0;
  for 
i := 1 to 9 do
  
begin
    
if (i = 1) or (i = 3) or (i = 5) or (i = 7) or (i = 9) then
    begin
      TMP 
:= IntToStr(StrToInt(Copy(SEGEL_NO, i, 1)) * 2);
      if 
Length(TMP) = 1 then
        TMP 
:= '0' + IntToStr(StrToInt(Copy(SEGEL_NO, i, 1)) * 2)
      else
        
TMP := IntToStr(StrToInt(Copy(SEGEL_NO, i, 1)) * 2);

      
TOT := TOT + StrToInt(Copy(TMP, 1, 1)) + StrToInt(Copy(TMP, 2, 1));
    
end
    
else
      
TOT := TOT + StrToInt(Copy(SEGEL_NO, i, 1));
  
end;
  if 
Length(IntToStr(TOT)) = 1 then
    FIN 
:= '0' + IntToStr(TOT)
  else
    
FIN := IntToStr(TOT);
  
Result := (StrToInt(Copy(FIN, 2, 1)) = StrToInt(Copy(SEGEL_NO, 10, 1))) or (StrToInt(Copy(SEGEL_NO, 10, 1)) = 10 - StrToInt(Copy(FIN, 2, 1)));
end; 
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#6
بارك الله فيك وجزاك الله خير.
جربت الدالة ونجحت لكن لاحظت الرقم التالي: 3212121212 يعتبره صحيح بينما الارقام لدينا تبدأ برقم 1 ورقم 2 فقط.
مع العلم اني جربت نفس الرقم على الكود الاساسي فاعطى نفس النتيجه (يعني ان الكود الاساسي يحمل نفس الخطأ)
فكيف يمكن التعديل عليه ليعتبر الرقم حطأ. والمرفق هو البرنامج


الملفات المرفقة
.rar   delphi.rar (الحجم : 5.95 ك ب / التحميلات : 12)
الرد
#7
إقتباس :ربت الدالة ونجحت لكن لاحظت الرقم التالي: 3212121212 يعتبره صحيح بينما الارقام لدينا تبدأ برقم 1 ورقم 2 فقط

اوضح أكثر...أنا قمت فقط بالتحويل...دورك الآن أخي ....اطرح محاولتك وسأساندك بما أعرف
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#8
الذي فهمته انه في حالة ان الرقم الاول من اليسار لا يساوي واحد او اثنين فإن الرقم خطأ بغض النظر عن باقي عملية الفحص
فاذا كان كذلك فقم بفحص الرقم الاول وبناءا عليه تقرر هل تستمر في عمل الدالة او التوقف والخروج بخطأ
كود :
if (segel_num[1] <> '1' ) or (segel_num[1] <> '2' ) then result:=False Else Begin : : your code here : : : End;
الرد
#9
بارك الله في الجميع
اخي الكريم me&delphi
المشكلة اني مبتدء في البرمجة وليس محترف حتى استطيع ان اعدل في الكود فبارك الله في جهودك

اخي الكريم tempuser جربت الكود ولاكن لايعمل بالشكل الصحيح هل يبدو اني اخطأت في كتابته:
كود :
if (edit1.Text[1] <> '1' ) or (edit1.Text[1] <> '2' ) then Begin ShowMessage('بداية الرقم خطأ'); End Else Begin ShowMessage(بداية الرقم صحيح) End;
الرد
#10
السلام عليكم

كود :
Function ID_Validation(SEGEL_NO:String):Boolean; var i, TOT:Integer; TEMP, FIN:String; begin TOT := 0; For i := 1 To 9 do begin If (i = 1) Or (i = 3) Or (i = 5) Or (i = 7) Or (i = 9) Then begin TEMP := IntToStr(strtoint(Copy(SEGEL_NO, i, 1)) * 2); If Length(TEMP) = 1 Then TEMP := '0' + TEMP; TOT := TOT + strtoint(Copy(TEMP, 1, 1)) + strtoint(Copy(TEMP, 2, 1)); end Else TOT := TOT + strtoint(Copy(SEGEL_NO, i, 1)); End; If Length(IntToStr(TOT)) = 1 Then FIN := '0' + inttostr(TOT) Else FIN := inttostr(TOT); Result := (StrToInt(Copy(FIN, 2, 1)) = StrToInt(Copy(SEGEL_NO, 10, 1))) Or (StrToInt(Copy(SEGEL_NO, 10, 1)) = 10 - StrToInt(Copy(FIN, 2, 1))) end;
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم