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 يعمل عليه تشيك فاذا كان صحيح قبل او يعرض رسالة بعدم صحة الرقم.
التحويل سهل جدا بدل استعمال Mid...في دلفي مثلا ستستعمل بدلها الدالة Copy...وهكدا وان أردت ماهو جديد ويوفر الوقت تعلم أخي التعابير القياسية فقد تم دعمها كدلك في دلفي مند الاصدار XE
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;
بارك الله فيك وجزاك الله خير.
جربت الدالة ونجحت لكن لاحظت الرقم التالي: 3212121212 يعتبره صحيح بينما الارقام لدينا تبدأ برقم 1 ورقم 2 فقط.
مع العلم اني جربت نفس الرقم على الكود الاساسي فاعطى نفس النتيجه (يعني ان الكود الاساسي يحمل نفس الخطأ)
فكيف يمكن التعديل عليه ليعتبر الرقم حطأ. والمرفق هو البرنامج
الذي فهمته انه في حالة ان الرقم الاول من اليسار لا يساوي واحد او اثنين فإن الرقم خطأ بغض النظر عن باقي عملية الفحص
فاذا كان كذلك فقم بفحص الرقم الاول وبناءا عليه تقرر هل تستمر في عمل الدالة او التوقف والخروج بخطأ
كود :
if (segel_num[1] <> '1' ) or (segel_num[1] <> '2' ) then
result:=False
Else
Begin
:
: your code here
:
:
:
End;
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;