⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_idcard.pas

📁 用Delphi 开发的一个 户籍管理系统
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      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 + -