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

📄 readunit.~pas

📁 完整的ic卡管理软件
💻 ~PAS
字号:
unit readUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, Mask, bsSkinBoxCtrls, bsSkinCtrls,
  BusinessSkinForm, bsSkinGrids, bsMessages, ExtCtrls;

type
  TreadForm = class(TForm)
    bsBusinessSkinForm1: TbsBusinessSkinForm;
    bsSkinStdLabel1: TbsSkinStdLabel;
    bsSkinEdit1: TbsSkinEdit;
    bsSkinStdLabel2: TbsSkinStdLabel;
    bsSkinEdit2: TbsSkinEdit;
    bsSkinStdLabel3: TbsSkinStdLabel;
    bsSkinEdit3: TbsSkinEdit;
    bsSkinButton1: TbsSkinButton;
    bsSkinButton2: TbsSkinButton;
    bsSkinButton3: TbsSkinButton;
    bsSkinMessage1: TbsSkinMessage;
    bsSkinStringGrid1: TbsSkinStringGrid;
    bsSkinScrollBar1: TbsSkinScrollBar;
    bsSkinScrollBar2: TbsSkinScrollBar;
    bsSkinStatusBar1: TbsSkinStatusBar;
    bsSkinStatusPanel1: TbsSkinStatusPanel;
    Timer1: TTimer;
    bsSkinStdLabel4: TbsSkinStdLabel;
    procedure bsSkinButton3Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bsSkinButton1Click(Sender: TObject);
    procedure bsSkinButton2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  k1:integer;
  sad,sdd:string;
  readForm: TreadForm;
  i,j:integer;
  s3,s2:Array[0..128]of char;
  s1,sty,sy,stext,sN:string;
  data1,data2,dataJ,hexdataJ,dataS,dataT,hexdataT,dataC:array[0..128]of char;
   
  procedure readIC(k:integer);
     //记录读取的报警数量
  function mythreadfunc(p:pointer):longint;stdcall;
  function mythreadIC(p:pointer):longint;stdcall;    //***检测读卡器连接线程

implementation
uses
datamodel,newcarUnit, mainUnit;

{$R *.dfm}

procedure TreadForm.bsSkinButton3Click(Sender: TObject);
begin
 close;
end;
///****动态设置bsSkinStringGrid行列属性*********
procedure TreadForm.FormShow(Sender: TObject);
var
i:integer;
hthread:thandle;//定义一个句柄
threadid:dword;
begin
  datamodule1.alarmTable.Open;
   bsskinedit1.Text:='';
   bsskinEdit2.Text:='';
   bsSKinEdit3.Text:='';
   bsSkinStringGrid1.RowCount:=31;
   for i:=1 to 31 do
    begin
     bsSkinStringGrid1.Cells[0,i]:=inttostr(i);
    end;
   bsSkinStringGrid1.ColWidths[0]:=20;
   //bsSkinStringGrid1.RowHeights[0]:=30;
   bsSkinStringGrid1.ColWidths[1]:=80;
   bsSkinStringGrid1.ColWidths[2]:=150;
   bsSkinStringGrid1.ColWidths[3]:=150;
   bsSkinStringGrid1.ColWidths[4]:=150;
   bsSkinStringGrid1.ColWidths[5]:=80;
   bsskinstringGrid1.ColWidths[6]:=100;
   bsSkinStringGrid1.Cells[1,0]:='机器编号';
   bsSKinStringGrid1.Cells[2,0]:='机器名称';
   bsSkinStringGrid1.Cells[3,0]:='报警类型';
   bsSkinStringGrid1.Cells[4,0]:='报警时间';
   bsSkinStringGrid1.Cells[5,0]:='处理情况';
   bsSkinStringGrid1.Cells[6,0]:='备注';
  
   //******调试串口************
   createthread(nil,0,@mythreadIC,nil,0,threadid);
 

end;
//******退出串口*******
procedure TreadForm.FormCreate(Sender: TObject);
begin
//st:=ic_exit(icdev);          //退出串口
end;
 //********读卡***********
procedure TreadForm.bsSkinButton1Click(Sender: TObject);
var

  hthread:thandle;//定义一个句柄
  threadid:dword;
begin
      Timer1.Enabled:=true;
      bsSkinStdLabel4.Caption:='IC卡读卡中.......';
      st:=chk_24c64(icdev);           //检测是否24c64卡
         if st<>0 then
           begin
            readForm.bsSkinMessage1.MessageDlg('读卡器未插卡!',mtError,[mbok],0);
            exit;
          end;
     createthread(nil,0,@mythreadfunc,nil,0,threadid);


end;
///*********读卡函数*************
procedure readIC(k:integer);
begin
 with readform do
  begin
       for i:=1 to k  do
              begin
                 offset:=201+18*i-18;
                 st:=srd_24c64(icdev,offset,3,dataJ);  //读出机器编号
                 offset:=206+18*i-18;
                 st:=srd_24c64(icdev,offset,1,dataS);     //读出报警数据
                 sad:=dataS;
                 offset:=207+18*i-18;
                 st:=srd_24c64(icdev,offset,11,dataT);  //读出时间,处理情况

                 //***查询报警类型************

                 with datamodule1.alarmTypeQuery do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('select alarmName from alarmType where alarmid=:a');
                    parameters[0].Value:=sad;
                    open;
                    stext:=fieldByname('alarmName').AsString;
                    bsskinStringGrid1.Cells[3,i]:=stext;  //显示报警类型
                  end;
                   bsSkinStringGrid1.Cells[1,i]:=dataJ;       //显示机器编号
                   //*****查询机器名称********

                       sN:=dataJ;
                     with datamodule1.alarmadressQuery do
                      begin
                           close;
                           sql.Clear;
                           sql.Add('select address from alarmDress where adressid=:a');
                           parameters[0].Value:=sN;
                           open;
                           bsskinStringGrid1.Cells[2,i]:=fieldByName('address').AsString;
                      end;
                  //****显示时间********
                 bsskinStringGrid1.Cells[4,i]:='20'+copy(dataT,1,2)+'-'+copy(dataT,3,2)+'-'+copy(dataT,5,2)+' ' +copy(dataT,7,2)+':'+copy(dataT,9,2);
                  if copy(dataT,11,1)='0' then
                    begin
                      bsskinStringGrid1.Cells[5,i]:='未处理';
                    end
                    else
                         if  copy(dataT,10,1)='1'  then
                    begin
                       bsskinStringGrid1.Cells[5,i]:='处理';
                    end;
                   
              end;

  end;
     

end;

procedure TreadForm.bsSkinButton2Click(Sender: TObject);
var
 i:integer;
 s:string;
begin
   if bsSkinEdit1.Text='' then                              //判断输入信息是否正确
      begin
         readForm.bsSkinMessage1.MessageDlg('IC卡编号不能为空!',mtError,[mbok],0);
          bsSkinEdit1.SetFocus;
          exit;
      end;
    if bsSkinEdit2.Text='' then                              //判断输入信息是否正确
      begin
        readForm.bsSkinMessage1.MessageDlg('人员编号不能为空!',mtError,[mbok],0);
          bsSkinEdit2.SetFocus;
          exit;
      end;
 for i:=1 to k1 do
  begin
      with datamodule1.alarmquery do                     ///*****查找是否有重复**********
       begin
          close;
          sql.Clear;
          sql.Add('select * from alarm where carid=:a and Adate=:b and alarmAdressid=:c');
          parameters[0].Value:=bsskinedit1.Text;
          parameters[1].Value:=bsskinStringGrid1.Cells[4,i];
          parameters[2].Value:=bsskinStringGrid1.Cells[1,i];
          open;
          if eof then
           begin
           with datamodule1.alarmTable do
              begin
                 append;
                 fieldByname('carid').Value:=bsskinedit1.Text;
                 fieldByname('personID').Value:=bsskinedit2.Text;
                 fieldByname('alarmAdressid').Value:=bsskinStringGrid1.Cells[1,i];
                 //fieldByname('alarmid').Value:=sad;
                 fieldByname('Aname').Value:= bsskinStringGrid1.Cells[3,i];
                 fieldByname('Adate').Value:=bsskinStringGrid1.Cells[4,i];
                 fieldByname('deal').Value:=bsskinStringGrid1.Cells[5,i];
                 fieldByname('memo').Value:=bsskinStringGrid1.Cells[6,i];
                 s:=bsskinStringGrid1.Cells[4,i];
                 fieldByname('year').Value:=copy(s,1,4);
                 fieldByname('month').Value:=copy(s,6,2);
                 fieldByname('date').Value:=copy(s,9,2);
                 post;
            end;
          end;

  end;
end;
  readform.bsSkinMessage1.MessageDlg('报警信息已保存!',mtInformation,[mbok],0)
end;
//*******建立读卡多线程**************
function mythreadfunc(p:pointer):longint;stdcall;
var
dc:hdc;

begin
 with readform do
  begin
      dc:=getdc(readform.handle);  //建立线程

      //***读IC卡编号和人员编号*******

       st:=srd_24c64(icdev,0,3,dataIC);
       st:=srd_24c64(icdev,3,3,dataP);
       bsSkinEdit1.Text:=dataIC;
       bsSkinEdit2.Text:=dataP;
       with datamodule1.personQuery do
        begin
           close;
           sql.Clear;
           sql.Add('select * from personMIS where persionID=:a');
           parameters[0].Value:=bsskinedit2.Text;
           open;
           bsskinedit3.Text:=fieldByname('pname').AsString;
        end;
       //********读报警信息*********
      length1:=17;
      offset:= 200;
      st:=srd_24c64(icdev,199,1,s3);    //****读出报警记录号, ***********
      st:=hex_asc(s3,data1,1);
      k1:=StrToInt('$' + data1);        //将16进制转化10进制
      offset:=726;
      st:=srd_24c64(icdev,726,1,dataC);   //读出726地址里是否有数据, 如有数据,循环30次读出全部报警
      sad:=dataC;

       if sad<>'B' then                 //如果第30个地址不是BJ就循环记录次数  否则循环30次
        begin

          readIC(k1);

        end
        else
        begin
          k1:=30;
          readIC(k1);

        end;


//****判断输入是否成功*********
   if st<>0 then
        begin
          readForm.bsSkinMessage1.MessageDlg('读卡失败,请重试!',mtInformation,[mbok],0);
          exit;
        end;

end;
  releasedc(readform.handle,dc);  //释放线程
end;


procedure TreadForm.Timer1Timer(Sender: TObject);
begin
    Timer1.Enabled:=false;
    bsSkinStdLabel4.Caption:='';
end;
function mythreadIC(p:pointer):longint;stdcall;    //***检测读卡器连接线程
var
  dc:hdc;
begin
  dc:=getdc(readform.handle);
  with readform   do
  begin
  //******调试串口************
   icdev:=auto_init(0,9600);  //初始化串口一,并将读写器波特率设置为9600
      st:=chk_24c64(icdev);           //检测是否24c64卡
         if st<>0 then
           begin
           bsSkinStatusPanel1.Caption:='读卡器未插入卡';
           mainform.bsSkinStatusPanel3.Caption:='读卡器未插入卡';
          end
        else
            bsSkinStatusPanel1.Caption:='读卡器已插卡成功';
            mainform.bsSkinStatusPanel3.Caption:='读卡器已插卡成功';

   releasedc(readform.handle,dc);
  end;
end;



end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -