全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2640
推到 Plurk!
推到 Facebook!

檢驗身份證號碼的正確性

尚未結案
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-11 08:58:03 IP:61.16.xxx.xxx 未訂閱
小弟已有瀏覽過關於身份證檢驗的一些文章如下: http://delphi.ktop.com.tw/topic.php?topic_id=24058  (轉自n/a 大大的連結) 但是我還是不知道具體的做法 在我的主form視窗下  有一個身份證字號的欄位(如下圖所示) 目前我這個欄位 可以隨便打一些數字 並沒有檢驗身份證字號是否輸入正確的功能 所以 想請問各位大大 如何解決詞問題啊? 麻煩各位大哥 大姊了!!    
chfamy
中階會員


發表:87
回覆:161
積分:54
註冊:2002-05-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-11 09:14:25 IP:61.219.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-11 16:53:29 IP:63.84.xxx.xxx 未訂閱
您好!    不知您所說的驗証功能包括哪些功能呢? <><>===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-11 17:23:54 IP:61.13.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-11 17:28:19 IP:61.13.xxx.xxx 未訂閱
我要的驗證功能就如同上方的程式碼 MyWarning('身份證字號第一個字母必須要大寫,請重新輸入!'); MyWarning('身份證號碼第2至第十個字必須是數字!'); MyWarning('身份證號碼內容有誤,請重新輸入!');
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-11 22:00:19 IP:218.163.xxx.xxx 未訂閱
參考看看:    
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-12 01:07:35 IP:61.13.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-12 02:31:51 IP:218.163.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-13 00:47:17 IP:61.13.xxx.xxx 未訂閱
我試過了 還是不行耶 我在身份證字號欄位(也就是DBEdit3)內 亂打數字 最後儲存時 它沒有跑出警告視窗耶 且還讓我儲存 請問 這是為什麼ㄋ?
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-13 10:20:19 IP:218.163.xxx.xxx 未訂閱
引言: 我試過了 還是不行耶 我在身份證字號欄位(也就是DBEdit3)內 亂打數字 最後儲存時 它沒有跑出警告視窗耶 且還讓我儲存 請問 這是為什麼ㄋ?
1.放入function CkIDNum(idn:string):boolean;整個函式到程式中 2.修改紅色部分 ............................................................ 若不行~請放上你最新修改的程式碼上來 網海無涯,學無止境!
jasonchen613
初階會員


發表:67
回覆:75
積分:28
註冊:2003-03-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-13 18:50:04 IP:61.16.xxx.xxx 未訂閱
我已把我的檔案上傳上來了 我有做個密碼登入框 密碼是1234 麻煩你了 http://delphi.ktop.com.tw/loadfile.php?TOPICID=12171644&CC=272216
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-10-13 22:32:05 IP:218.163.xxx.xxx 未訂閱
引言: 我已把我的檔案上傳上來了 我有做個密碼登入框 密碼是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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-10-13 23:27:46 IP:61.13.xxx.xxx 未訂閱
哎呀 真是太感激您了qoo1234大哥 最後想問你最後一個問題 當您儲存"身份證字號","車牌號碼","車證號碼","學號"完後 如果是儲存到相同的話 跳出一個警告視窗 說: 這組身份證字號已被使用 請從新輸入一次! 另外 可不可以要求使用者最少要輸入這三項其中一項 因為如果儲存一筆 "空" 的資料就沒有意義 請問 這要如何做出來啊? 抱歉一直麻煩各位 因為小弟在一些delphi的書中 並沒有找到 相關的解說 所以在此提出來 拜託各位大大的幫忙 THANK U VERY MUCH
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-10-13 23:36:06 IP:218.163.xxx.xxx 未訂閱
引言: 哎呀 真是太感激您了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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-10-13 23:40:41 IP:61.13.xxx.xxx 未訂閱
sorry 小弟急著發問 萬了 
系統時間:2024-06-03 0:14:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!