檢驗身份證號碼的正確性 |
尚未結案
|
jasonchen613
初階會員 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
|
chfamy
中階會員 發表:87 回覆:161 積分:54 註冊:2002-05-03 發送簡訊給我 |
1.將"身份證字號"欄位元件之對應欄位增加EditFormat屬性設定,限制止
只能輸入一個英文字及九個數字.
2.在"身份證字號"欄位元件之OnChange加入判斷:
if (Length(Edit1.Value) = 10) then
begin
if (CorrectIDN(Edit1.Value) = False) then
Edit1.SetFocus;
end;
3.在ADOTable之onBeforePost加入判斷:
if (CorrectIDN(身份證字號欄位.Value) = False) then
身份證字號欄.FocusControl;
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
|
jasonchen613
初階會員 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
Sorry耶 chfamy 大大 我看書上說有用到陣列耶 書上的程式碼如下: function CheckRocID(ID: String):Boolean;
const
LetterWeight : array['A'..'Z'] of Integer =
// A B C D E F G H I J K L M N O
(10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35,
23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33,);
P Q R S T U V W X Y Z
//
Var
i: Integer;
D: array[1..9] of Integer;
Sum: Integer;
begin
Result := False;
if Length(ID) < > 10 then begin
MyWarning('身份證號碼長度錯誤,請重新輸入 ! ');
Exit;
end;
ID :== UpperCase(ID);
if not (ID[1] in ['A'..'Z']) then
begin
MyWarning('身份證字號第一個字母必須要大寫,請重新輸入!');
Exit;
end;
for i := 2 to 10 do
begin
if not (ID[i] in ['0'..'9']) then
begin
MyWarning('身份證號碼第2至第十個字必須是數字!');
Exit;
end;
end;
for i := 1 to 9 do
D[i] := strToInt(Subster(ID, i 1, 1));
i := LetterWeight[ID[1]];
Sum := (i div 10) (i mod 10) * 9;
Sum := Sum 8 * D[1] 7 * D[2] 6 * D[3] 5 * D[4]
4 * D[5] 3 * D[6] 2 * D[7] D[8] D[9];
if not (Sum mod 10 = 0) then
begin
MyWarning('身份證號碼內容有誤,請重新輸入!');
Exit;
end;
Result :=True;
end; //程式碼來源 "delphi 進銷存程式設計" 作者:陳惟彬
---------------------------------------------------------------------- 可是我不知道這些程式碼要打在哪裡 它只說 以上的自訂函數要寫在
PublicFunctuon.pas內 如果要把他寫入我的主form視窗內 要如何寫入啊?
|
jasonchen613
初階會員 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
參考看看:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; //測試用 procedure Edit1Exit(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function CkIDNum(idn:string):boolean; const LetterCode:array[0..25] of byte = (10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33); var cksum:integer; i,j:ShortInt; { *Note: 男生=第二碼為1 (即字母後的那一位) 女生=第二碼為2 (即字母後的那一位) } begin Result:=false; if length(idn)<>10 then begin ShowMessage('身份證字號長度錯誤,請重新輸入!'); Exit; //驗證總位數 end; i:=Ord(UpCase(idn[1]))-65; //驗證首位字母...(取得對應值在LetterCode的位置、確認為A~Z之一、計算加權值) if ((i<0) or (i>25)) then begin ShowMessage('身份證字號第一個字母必須是英文字母,請重新輸入!'); Exit; end; for j := 2 to 10 do begin if not (idn[j] in ['0'..'9']) then begin ShowMessage('身份證號碼第2至第10個字必須是數字!'); Exit; end; end; cksum:=(LetterCode[i] div 10) (9*LetterCode[i] mod 10); for i:=1 to 8 do cksum:=cksum StrToInt(idn[i 1])*(9-i); //數字部份加權加總 if (cksum StrToInt(idn[10])) mod 10 = 0 then Result:=true //驗證檢碼(最後一碼):與cksum的和必須被10整除 else ShowMessage('身份證號碼內容有誤,請重新輸入!'); end; procedure TForm1.Edit1Exit(Sender: TObject); begin Edit1.text:=UpperCase(Edit1.Text); //英文字母自動變成大寫字母 CkIDNum(edit1.Text); end; end.網海無涯,學無止境! 發表人 - qoo1234 於 2003/10/12 00:08:00 |
jasonchen613
初階會員 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
Sorry qoo1234兄 我有加入你的程式碼 可是程式還是沒反應耶??
implementation uses Unit2, Unit4, Unit5, Unit6; {$R *.DFM}
function FileSizes(filename:string):integer;
var f:file;
begin
assignfile(f,filename);
reset(f,1);
result:=filesize(f);
closefile(f);
end; /我把以下的程式碼 從這行開始加入/
---------------------------------------------------------------------- function CkIDNum(idn:string):boolean;
const LetterCode:array[0..25] of byte = (10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33);
var cksum:integer;
i,j:ShortInt;
{ *Note: 男生=第二碼為1 (即字母後的那一位)
女生=第二碼為2 (即字母後的那一位) }
begin
Result:=false;
if length(idn)<>10 then
begin
ShowMessage('身份證字號長度錯誤,請重新輸入!');
Exit; //驗證總位數
end;
i:=Ord(UpCase(idn[1]))-65; //驗證首位字母...(取得對應值在LetterCode的位置、確認為A~Z之一、計算加權值)
if ((i<0) or (i>25)) then
begin
ShowMessage('身份證字號第一個字母必須是英文字母,請重新輸入!');
Exit;
end;
for j := 2 to 10 do
begin
if not (idn[j] in ['0'..'9']) then
begin
ShowMessage('身份證號碼第2至第10個字必須是數字!');
Exit;
end;
end;
cksum:=(LetterCode[i] div 10) (9*LetterCode[i] mod 10);
for i:=1 to 8 do cksum:=cksum StrToInt(idn[i 1])*(9-i); //數字部份加權加總
if (cksum StrToInt(idn[10])) mod 10 = 0 then
Result:=true //驗證檢碼(最後一碼):與cksum的和必須被10整除
else
ShowMessage('身份證號碼內容有誤,請重新輸入!');
end; 另外我身份證字號的欄位是 DBEdit3
所以 是不是把以下的程式碼 加入在 DBEdit3--> events--> Onexit 下ㄋ? procedure TForm1.Edit1Exit(Sender: TObject);
begin
Edit1.text:=UpperCase(Edit1.Text); //英文字母自動變成大寫字母
CkIDNum(edit1.Text);
end; 另外 我需要多加一個dbedit 或 edit 嗎?
因為你說 {Edit2: TEdit; //測試用} 可是我好像沒看到你有用到Edit2
你都只有用到edit1 多謝 麻煩你ㄋ
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言: Sorry qoo1234兄 我有加入你的程式碼 可是程式還是沒反應耶?? 請將edit1改為你自己的DBEdit3 implementation uses Unit2, Unit4, Unit5, Unit6; {$R *.DFM} function FileSizes(filename:string):integer; var f:file; begin assignfile(f,filename); reset(f,1); result:=filesize(f); closefile(f); end; /我把以下的程式碼 從這行開始加入/ ---------------------------------------------------------------------- function CkIDNum(idn:string):boolean; const LetterCode:array[0..25] of byte = (10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33); var cksum:integer; i,j:ShortInt; { *Note: 男生=第二碼為1 (即字母後的那一位) 女生=第二碼為2 (即字母後的那一位) } begin Result:=false; if length(idn)<>10 then begin ShowMessage('身份證字號長度錯誤,請重新輸入!'); Exit; //驗證總位數 end; i:=Ord(UpCase(idn[1]))-65; //驗證首位字母...(取得對應值在LetterCode的位置、確認為A~Z之一、計算加權值) if ((i<0) or (i>25)) then begin ShowMessage('身份證字號第一個字母必須是英文字母,請重新輸入!'); Exit; end; for j := 2 to 10 do begin if not (idn[j] in ['0'..'9']) then begin ShowMessage('身份證號碼第2至第10個字必須是數字!'); Exit; end; end; cksum:=(LetterCode[i] div 10) (9*LetterCode[i] mod 10); for i:=1 to 8 do cksum:=cksum StrToInt(idn[i 1])*(9-i); //數字部份加權加總 if (cksum StrToInt(idn[10])) mod 10 = 0 then Result:=true //驗證檢碼(最後一碼):與cksum的和必須被10整除 else ShowMessage('身份證號碼內容有誤,請重新輸入!'); end; 另外我身份證字號的欄位是 DBEdit3 所以 不是把以下的程式碼 加入在 DBEdit3--> events--> Onexit 下ㄋ? 是 procedure TForm1.DBEdit3Exit(Sender: TObject); begin DBEdit3.text:=UpperCase(DBEdit3.Text); //英文字母自動變成大寫字母 CkIDNum(DBEdit3.Text); end; 另外 我需要多加一個dbedit 或 edit 嗎? 因為你說 {Edit2: TEdit; //測試用} 可是我好像沒看到你有用到Edit2 你都只有用到edit1 Edit2測試用,表示不用! 多謝 麻煩你ㄋ網海無涯,學無止境! 發表人 - qoo1234 於 2003/10/12 02:33:35 |
jasonchen613
初階會員 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
jasonchen613
初階會員 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言: 我已把我的檔案上傳上來了 我有做個密碼登入框 密碼是1234 麻煩你了 http://delphi.ktop.com.tw/loadfile.php?TOPICID=12171644&CC=272216============================================================= 你目前的範例程式碼,不用改,只需要加入紅色部分,即可! //儲存按鈕 procedure TForm1.ToolButton7Click(Sender: TObject); begin if CkIDNum(DBEdit3.Text) then begin CanEdit := True; IF ADOTable1.State in [dsEdit,dsInsert] Then ADOTable1.Post; showmessage('資料已儲存'); end; end;網海無涯,學無止境! 發表人 - qoo1234 於 2003/10/13 22:33:14 |
jasonchen613
初階會員 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
哎呀 真是太感激您了qoo1234大哥 最後想問你最後一個問題
當您儲存"身份證字號","車牌號碼","車證號碼","學號"完後
如果是儲存到相同的話 跳出一個警告視窗 說: 這組身份證字號已被使用
請從新輸入一次! 另外 可不可以要求使用者最少要輸入這三項其中一項
因為如果儲存一筆 "空" 的資料就沒有意義
請問 這要如何做出來啊?
抱歉一直麻煩各位 因為小弟在一些delphi的書中 並沒有找到
相關的解說 所以在此提出來 拜託各位大大的幫忙 THANK U VERY MUCH
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
引言: 哎呀 真是太感激您了qoo1234大哥 最後想問你最後一個問題 當您儲存"身份證字號","車牌號碼","車證號碼","學號"完後 如果是儲存到相同的話 跳出一個警告視窗 說: 這組身份證字號已被使用 請從新輸入一次! 另外 可不可以要求使用者最少要輸入這三項其中一項 因為如果儲存一筆 "空" 的資料就沒有意義 請問 這要如何做出來啊? 抱歉一直麻煩各位 因為小弟在一些delphi的書中 並沒有找到 相關的解說 所以在此提出來 拜託各位大大的幫忙 THANK U VERY MUCH關於 1.相同資料, 跳出一個警告視窗。 2.要求使用者最少要輸入這三項其中一項 本主題到此結案,請再發表一個發問主題文章.. < src="http://delphi.ktop.com.tw/download/upload\33223_qoo.gif">網海無涯,學無止境! 發表人 - qoo1234 於 2003/10/13 23:38:33 |
jasonchen613
初階會員 發表:67 回覆:75 積分:28 註冊:2003-03-25 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |