📄 newcarunit.pas
字号:
unit NewCarUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, bsSkinBoxCtrls, bsSkinCtrls, Mask, BusinessSkinForm,
bsSkinGrids, bsDBGrids, bsMessages, Grids, DBGrids, bsdbctrls, ImgList,
ComCtrls, ValEdit;
type
TNewCarForm = class(TForm)
bsSkinStdLabel1: TbsSkinStdLabel;
bsSkinEdit1: TbsSkinEdit;
bsSkinButton6: TbsSkinButton;
bsSkinButton7: TbsSkinButton;
bsSkinButton8: TbsSkinButton;
bsSkinStdLabel2: TbsSkinStdLabel;
bsSkinStdLabel3: TbsSkinStdLabel;
bsSkinEdit2: TbsSkinEdit;
bsSkinStatusBar1: TbsSkinStatusBar;
bsSkinStatusPanel1: TbsSkinStatusPanel;
bsSkinListView2: TbsSkinListView;
bsSkinScrollBar1: TbsSkinScrollBar;
bsSkinEdit3: TbsSkinEdit;
bsSkinMessage1: TbsSkinMessage;
bsBusinessSkinForm1: TbsBusinessSkinForm;
procedure bsSkinButton8Click(Sender: TObject);
procedure FormShow(Sender: TObject);
// procedure bsSkinButton5Click(Sender: TObject);
procedure bsSkinButton6Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure bsSkinButton7Click(Sender: TObject);
// procedure bsSkinDBLookupComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
NewCarForm: TNewCarForm;
dataIC,dataP,data2,data3,data4,data5,hexdata3,hexdataP,hexdataIC:Array[0..1000]of char;
datamax:Array[0..1000]of char; //地址长度
icdev: longint;
st:smallint;
length1:integer; //字符长度
offset:integer; //偏移地址
status:integer;
offset1:integer;
iswrite:boolean;
source,dest:array[0..16]of char;
function chk_24c64(icdev:longint):smallint;stdcall;
far;external 'MWIC_32.dll'name 'chk_24c64';
function swr_24c64(icdev: longint;offset:smallint;length:smallint;data1:pchar):smallint;stdcall;
far;external 'MWIC_32.dll'name 'swr_24c64';
function srd_24c64(icdev: longint;offset:smallint;length:smallint;data1:pchar):smallint;stdcall;
far;external 'MWIC_32.dll'name 'srd_24c64';
function auto_init(port: smallint;baud:longint): longint;stdcall;
far;external 'MWIC_32.DLL' name 'auto_init';
function ic_init(port: smallint;baud:longint): longint; stdcall;
far;external 'MWIC_32.DLL' name 'ic_init';
function ic_exit(icdev: longint):smallint;stdcall;
far;external 'MWIC_32.dll' name 'ic_exit';
function get_status(icdev: longint;status:pchar):smallint;stdcall;
far;external 'MWIC_32.dll' name 'get_status';
function cmp_dvsc(icdev:longint;length:smallint;password:pchar):smallint;stdcall;
far;external 'MWIC_32.dll' name 'cmp_dvsc';
function setsc_md(icdev: longint;mode:smallint):smallint;stdcall;
far;external 'MWIC_32.dll'name 'setsc_md';
function srd_dvsc(icdev: longint;length:smallint;password:pchar):smallint;stdcall;
far;external 'MWIC_32.dll'name 'srd_dvsc'
function swr_dvsc(icdev: longint;length:smallint;password:pchar):smallint;stdcall;
far;external 'MWIC_32.dll'name 'swr_dvsc';
function auto_pull(icdev: longint):smallint;stdcall;
far;external 'MWIC_32.dll'name 'auto_pull';
function srd_ver(icdev: longint;length:smallint;ver:pchar):smallint;stdcall;
far;external 'MWIC_32.dll'name 'srd_ver';
function dv_beep(icdev: longint;time:smallint):smallint;stdcall;
far;external 'MWIC_32.dll'name 'dv_beep';
function asc_hex(asc:pchar;hex:pchar;len:smallint):smallint;stdcall;
far;external 'MWIC_32.dll'name 'asc_hex';
function hex_asc(hex:pchar;asc:pchar;len:smallint):smallint;stdcall;
far;external 'MWIC_32.dll'name 'hex_asc';
function ic_encrypt(key:pchar;source:pchar;len:smallint;dest:pchar):smallint;
stdcall;far;external 'MWIC_32.dll'name 'ic_encrypt';
function ic_decrypt(key:pchar;dest:pchar;len:smallint;source:pchar):smallint;
stdcall;far;external 'MWIC_32.dll'name 'ic_decrypt';
function writeIC(s2:string):string;//汉字转化字模
function GetChineseLattice(ChineseText: String; out LatticeData: array of char; Style: Integer): Boolean; stdcall;far;external 'Lattices.dll'
function mythreadIC(p:pointer):longint;stdcall; //***检测读卡器连接线程
implementation
uses
datamodel,mainUnit;
{$R *.dfm}
procedure TNewCarForm.bsSkinButton8Click(Sender: TObject);
begin
close;
end;
procedure TNewCarForm.FormShow(Sender: TObject);
var
adress,id:string;
aListItem:TListItem;
hthread:thandle;//定义一个句柄
threadid:dword;
begin
//*****连接数据库********
datamodule1.carTable.Open;
datamodule1.personTable.Open;
datamodule1.Car_adressTable.Open;
datamodule1.alarmAdressTable.Open;
iswrite:=false;
bsSkinEdit2.Text:='';
bsSkinEdit1.Text:=''; //IC卡编号清空
bsSkinListView2.Items.Clear;
with datamodule1.alarmAdressTable do //Listview加入报警地址
begin
open;
DisableControls;
first;
while not eof do
begin
id:=FieldByname('adressid').AsString;
adress:=FieldByName('address').AsString;
aListItem:=bsSkinListView2.Items.Add;
aListItem.Caption:=id;
aListItem.SubItems.Add(adress);
next;
end;
EnableControls ;
close;
end;
createthread(nil,0,@mythreadfunc,nil,0,threadid); //***检测读卡器连接线程
end;
function mythreadIC(p:pointer):longint;stdcall; //***检测读卡器连接线程
var
dc:hdc;
begin
dc:=getdc(NewCarform.handle);
with newcarform 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(newcarform.handle,dc);
end;
end;
//保存数据
procedure TNewCarForm.bsSkinButton6Click(Sender: TObject);
var
i:integer;
begin
//*********判断输入编号是否3位******
if length(bsSkinEdit1.Text)<>3 then
begin
newCarform.bsSkinMessage1.MessageDlg('请输入三位IC卡编号!',mtError,[mbok],0);
bsSkinEdit1.SetFocus;
exit;
end;
{ if length(bssKinEdit4.Text)<>3 then
begin
newCarform.bsSkinMessage1.MessageDlg('请输入三位机器编号',mtError,[mbok],0);
bsSkinEdit1.SetFocus;
exit;
end; }
if length(bssKinEdit3.Text)<>3 then
begin
newCarform.bsSkinMessage1.MessageDlg('请输入三位值班人员编号',mtError,[mbok],0);
bsSkinEdit3.SetFocus;
exit;
end;
//****判断IC卡编号是否重复**********
with datamodule1.carQuery do
begin
close;
sql.Clear;
sql.Add('select * from carMIS where carid=:a');
parameters[0].Value :=bsSkinEdit1.Text;
open;
if not eof then
begin
newCarform.bsSkinMessage1.MessageDlg('IC卡编号已存在,请重新输入!',mtError,[mbok],0);
bsSkinEdit1.Text:='';
bsskinEdit1.SetFocus;
exit;
end;
end;
//**判断人员是否重复************
with datamodule1.personQuery do
begin
close;
sql.Clear;
sql.Add('select * from personMIs where persionID=:a');
parameters[0].Value :=bsSkinEdit3.Text;
open;
if not eof then
begin
newCarform.bsSkinMessage1.MessageDlg('人员编号已存在,请重新输入!',mtError,[mbok],0);
exit;
end;
end;
//****保存IC卡编号信息*********
with datamodule1.carTable do //保存人员编号,报警编号
begin
open;
append;
FieldByName('carid').AsString:=bsSkinEdit1.Text;
FieldByName('userid').AsString:=bsSkinEdit3.Text;
// fieldByName('sid').AsString:=bsSkinEdit4.Text;
FieldByname('date').AsDateTime:=date();
post;
end;
//*****保存值班人员信息************
with datamodule1.personTable do
begin
open;
append;
FieldByName('persionID').AsString:=bsSkinEdit3.Text;
FieldByName('Pname').AsString:=bsSkinEdit2.Text;
post;
end;
//****保存地址编号****************
for i:=0 to bsSkinListView2.Items.Count-1 do //保存报警地址.
begin
if bsSkinListView2.Items[i].Checked then
begin
with datamodule1.Car_adressTable do
begin
open;
append;
FieldByname('carid').AsString:=bsSkinEdit1.Text;
FieldByname('adressid').AsString:=bsSkinListView2.Items[i].Caption;
FieldByName('adress').AsString:=bsSkinListView2.Items[i].SubItems.CommaText;
post;
end;
end;
end;
iswrite:=true;
newCarform.bsSkinMessage1.MessageDlg('保存成功!',mtInformation,[mbok],0);
end;
procedure TNewCarForm.FormCreate(Sender: TObject);
begin
// st:=ic_exit(icdev); //退出串口
end;
///*****写卡********
procedure TNewCarForm.bsSkinButton7Click(Sender: TObject);
var
i,j,k,l,n,sdn,t:integer;
sIC,sP,sd,strtext,s1,s2:string;
begin
if not iswrite then
begin
newCarform.bsSkinMessage1.MessageDlg('注意!先保存再写卡',mtError,[mbok],0);
bsSkinButton7.SetFocus;
exit;
end;
//*********检测是否24c64卡 ********
st:=chk_24c64(icdev);
if st<>0 then
begin
newcarForm.bsSkinMessage1.MessageDlg('读卡器未插卡!',mtError,[mbok],0);
exit;
end;
if bsSkinEdit1.Text='' then //判断输入信息是否正确
begin
newCarForm.bsSkinMessage1.MessageDlg('IC卡编号不能为空!',mtError,[mbok],0);
bsSkinEdit1.SetFocus;
exit;
end;
st:=chk_24c64(icdev); //检测是否24c64卡
if st<>0 then
begin
bsSkinStatusPanel1.Caption:='读卡器未插入卡';
newCarForm.bsSkinMessage1.MessageDlg('读卡器未插入卡!',mtInformation,[mbok],0);
mainform.bsSkinStatusPanel3.Caption:='读卡器未插入卡';
exit;
end
else
bsSkinStatusPanel1.Caption:='读卡器已插卡成功';
mainform.bsSkinStatusPanel3.Caption:='读卡器已插卡成功';
//******写卡************
offset:=0; //IC卡偏移地址
length1:=3; //字符长度
sIC:=bsSkinEdit1.Text; //卡编号,
sP:=bsSkinEdit3.Text; // 人员编号
for i:=0 to 2 do
begin
dataIC[i]:=sIC[i+1];
end;
for i:=0 to 2 do
begin
dataP[i]:=SP[i+1];
end;
st:=swr_24c64(icdev,offset,length1,dataIC); //写入IC卡编号,3位地址
offset1:=3;
st:=swr_24c64(icdev,3,length1,dataP); //写入人员编号号 3位地址
for j:=0 to bsSkinListView2.Items.Count-1 do
begin
if bsSkinListView2.Items[j].Checked then
begin
sdn:=strtoint( bsSkinListView2.Items[j].Caption); // 读机器编号
sd:= bsSkinListView2.Items[j].SubItems.CommaText; // 读机器名称
s2:=inttostr(length(sd)div 2); //S2机器名称汉字个数
strtext:=writeIC(sd); //得到汉字的16进制编码
l:=length(strtext);
n:=l div 2; //求出汉字存放地址的长度
datamax[0]:=s2[1];
offset1:=1000+sdn*400-400; //存汉字个数
st:=swr_24c64(icdev,offset1,1,datamax);
for i:=0 to length(strtext)-1 do
begin
data3[i]:=strtext[i+1];
end;
offset1:=1001+sdn*400-400; //存储汉字16*16编码
st:=asc_hex(data3,hexdata3,n);
st:=swr_24c64(icdev,offset1,n,hexdata3);
end;
end;
///*********判断是否写卡成功****************
if st<>0 then
begin
newCarForm.bsSkinMessage1.MessageDlg('写卡失败,请重新写卡!',mtInformation,[mbok],0);
exit;
end
else
newCarForm.bsSkinMessage1.MessageDlg('写卡成功!',mtInformation,[mbok],0);
// bsSkinEdit1.Text:='';
// bsSkinEdit2.Text:='';
// bsSkinEDIT3.Text:='';
iswrite:=true;
end;
//*********将汉字转化字模***********
function writeIC(s2:string):string;
var
s1,s3,strtext:string;
i,j,n:integer;
LatticeData: array[1..32] of char;
k, stemp:string;
hzk16:file of char ;
count:longint;
m:array[1..32] of char;
r:integer;
begin
with newCarform do
begin
assignfile(hzk16,'hzk16');
FileMode := 0;
reset(hzk16);
strtext:='';
r:=1;
while r<length(s2) do
begin
k:=copy(s2,r,r+2);
j:=((ord(k[1])-161)*94+(ord(k[2])-161))*32; //asci
seek(hzk16,j);
n:=1;
for count:=1 to 32 do
begin
read(hzk16,m[n]); // 将一个整数转换为16进制的字符串
stemp:=inttohex(ord(m[n]),2);
strtext:=strtext+stemp;
n:=n+1;
end;
r:=r+2;
end;
writeIC:=strtext;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -