📄 readunit.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('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 + -