📄 f_idcard.pas
字号:
begin
//取性别
SexMark := '1';
//取性别标志
case IDNumInfo.IDNumType of
idnum15 : SexMark := IDNum[15];
idnum18 : SexMark := IDNum[17];
end;
//判断性别
case strtoint(SexMark) mod 2 of
0 : IDNumInfo.Sex := sexFemale;
1 : IDNumInfo.Sex := sexMale;
end;
//如果是18位的身份证,判断校验是否正确
if IDNumInfo.IDNumType = idnum18 then
begin
if CompareText(GenIDNumCheckSumChar(IDNum), IDNum[18]) = 0 then
begin
IDNumInfo.ChecksumRst := csChecksumCorrect;
Result := true;
end;
end else
Result := true;
end;
end;
end;
end;
//判断身份证号码是否正确,通过从中取信息是否成功来判定。
function IsIDNumValid(IDNum: string): boolean;
var
TmpIDNumInfo : TIDNumInfo;
begin
Result := GetIDNumInfo(IDNum, TmpIDNumInfo);
end;
//将区划代码转换成名称
function RegionCode2Str(RegionCode: string; RegionCodeArray: TRegionCodeTransArray): string;
//在列表中搜索指定的区划代码所对应的名称
//用折半查找,所以要求输入的对应关系必须是有序的
function SearchRegionStr(SearchRegionCode: string): string;
var
SearchFrom,
SearchTo,
CheckIdx,
SearchValue,
CheckValue : integer;
begin
Result := '';
SearchFrom := low(RegionCodeArray);
SearchTo := high(RegionCodeArray);
SearchValue := StrToInt(SearchRegionCode);
while SearchFrom <= SearchTo do
begin
CheckIdx := (SearchFrom + SearchTo) div 2;
CheckValue := StrToInt(RegionCodeArray[CheckIdx].RegionCode);
if CheckValue = SearchValue then
begin
Result := RegionCodeArray[CheckIdx].RegionStr;
Break;
end else
if CheckValue > SearchValue then
begin
SearchTo := CheckIdx - 1;
end else
if CheckValue < SearchValue then
begin
SearchFrom := CheckIdx + 1;
end;
end;
end;
var
SepRegionCode : TSepRegionCode;
TmpStr,
SearchRst : string;
begin
Result := '';
//区划代码为6位
if (length(RegionCode) = 6) and IsDigiStr(RegionCode) and (length(RegionCodeArray) > 0) then
begin
//分解区划代码
SepRegionCode.ProvinceCode := Copy(RegionCode, 1, 2);
SepRegionCode.CityCode := Copy(RegionCode, 3, 2);
SepRegionCode.CountyCode := Copy(RegionCode, 5, 2);
//省级的区划代码不包括11以下的组合
if StrToInt(SepRegionCode.ProvinceCode) > 10 then
begin
//列表内搜索省的名称
TmpStr := '';
SearchRst := SearchRegionStr(SepRegionCode.ProvinceCode + '0000');
if length(SearchRst) > 0 then
begin
TmpStr := SearchRst;
//在列表内搜索市的名称
SearchRst := SearchRegionStr(SepRegionCode.ProvinceCode + SepRegionCode.CityCode + '00');
if length(SearchRst) > 0 then
begin
if not((SearchRst = '市辖区') or (SearchRst = '县')) then
TmpStr := TmpStr + SearchRst;
//在列表内搜索县的名称
SearchRst := SearchRegionStr(SepRegionCode.ProvinceCode + SepRegionCode.CityCode + SepRegionCode.CountyCode);
if length(SearchRst) > 0 then
begin
if not((SearchRst = '市辖区') or (SearchRst = '县')) then
TmpStr := TmpStr + SearchRst;
end;
end;
end;
Result := TmpStr;
end;
end;
end;
//取区划名称
function GetRegionStr(RegionCode: string; FromFileName: string): string;
var
RegionCodeArray: TRegionCodeTransArray;
begin
if LoadRegionDat(FromFileName, RegionCodeArray) then
Result := RegionCode2Str(RegionCode, RegionCodeArray)
else
Result := '';
end;
//取区划名称
function GetRegionStr(RegionCode: string): string;
begin
Result := RegionCode2Str(RegionCode, RegionCodeTransArray);
end;
//取区划名称
function GetRegionStr(var IDNumInfo: TIDNumInfo; FromFileName: string): boolean;
var
RegionStr : string;
begin
RegionStr := GetRegionStr(IDNumInfo.RegionCode, FromFileName);
if not (RegionStr = '') then
begin
IDNumInfo.RegionStr := RegionStr;
Result := true;
end else
Result := false;
end;
//取区划名称
function GetRegionStr(var IDNumInfo: TIDNumInfo): boolean;
var
RegionStr : string;
begin
RegionStr := GetRegionStr(IDNumInfo.RegionCode);
if not (RegionStr = '') then
begin
IDNumInfo.RegionStr := RegionStr;
Result := true;
end else
Result := false;
end;
//根据指定分隔符分解字符串,并存入数组
function DecodeStr2Array(Source: string; SepChar: char; var Rst: TStrArray): integer;
var
Count, CutFrom, Len: word;
procedure AddStr(Str: string);
begin
SetLength(Rst, length(Rst) + 1);
Rst[high(Rst)] := Str;
end;
begin
Result := 0;
SetLength(Rst, 0);
len := length(Source);
if len > 0 then
begin
CutFrom := 1;
for count := 1 to len do //逐字符扫描字符串,遇到分隔符时则切断串获得数据
if (Source[count] = SepChar) then begin
AddStr(Copy(Source, CutFrom, count - CutFrom));
CutFrom := count + 1;
if Count = Len then
AddStr('');
end else
if count = len then
begin
AddStr(Copy(Source, CutFrom, count - CutFrom + 1));
Break;
end;
Result := length(Rst);
end;
end;
//把区划代码和名称的对应关系从文件读到变量中
function LoadRegionDat(FromFileName: string; var RegionCodeArray: TRegionCodeTransArray): boolean;
var
Count0 : integer;
RegionDatFile : TStringList;
StrArray : TStrArray;
begin
Result := false;
SetLength(RegionCodeArray, 0);
if FileExists(FromFileName) then
begin
RegionDatFile := TStringList.Create;
//读入文件
try
RegionDatFile.LoadFromFile(FromFileName);
except
end;
//处理数据
for Count0 := 0 to RegionDatFile.Count - 1 do
//跳过空行
if length(RegionDatFile[Count0]) > 0 then
begin
//跳过以#开头的行(注释行)
if not (RegionDatFile[Count0][1] = '#') then
begin
//分解数据
if (DecodeStr2Array(RegionDatFile[Count0], ',', StrArray) = 2) and //以,分隔的两个字段
(length(StrArray[0]) = 6) and //代码长度为6个字符
IsDigiStr(StrArray[0]) and //代码必须全部是数字
(length(StrArray[1]) > 0) then //名称长度必须大于1
begin
//增加内容
SetLength(RegionCodeArray, length(RegionCodeArray) + 1);
RegionCodeArray[high(RegionCodeArray)].RegionCode := StrArray[0];
RegionCodeArray[high(RegionCodeArray)].RegionStr := StrArray[1];
end;
end;
end;
Result := length(RegionCodeArray) > 0;
RegionDatFile.Free;
end;
end;
//直接将区划代码信息读入到本单元的公用变量里
function LoadRegionDat(FromFileName: string): boolean;
begin
Result := LoadRegionDat(FromFileName, RegionCodeTransArray);
end;
initialization
SetLength(RegionCodeTransArray, 0);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -