📄 comsdktest.~pas
字号:
unit comsdktest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, zkemkeeper_TLB, Menus, Buttons, Grids,
ValEdit, ExtCtrls;
type
TForm1 = class(TForm)
CZKEM1: TCZKEM;
Label1: TLabel;
btnConnect: TButton;
Memo1: TMemo;
SaveDialog1: TSaveDialog;
gbOP: TGroupBox;
btnSetTime: TButton;
vleDevInfo: TValueListEditor;
btnLoadDevInfo: TBitBtn;
btnSaveDevInfo: TBitBtn;
Button3: TButton;
GroupBox1: TGroupBox;
btnClearData: TButton;
Button5: TButton;
Button6: TButton;
btnBackupUser: TButton;
btnRestore: TButton;
Button9: TButton;
OpenDialog1: TOpenDialog;
btnDeleteUser: TButton;
btnSetName: TButton;
Button10: TButton;
btnAutoTest: TButton;
edtNetAddress: TLabeledEdit;
edtNetPort: TLabeledEdit;
edtBaudRate: TEdit;
sbtnRS232: TSpeedButton;
sbtnTCPIP: TSpeedButton;
Label5: TLabel;
btnACUnlock: TButton;
edtPassword: TEdit;
Label2: TLabel;
chkEnabled: TCheckBox;
Button7: TButton;
Button8: TButton;
Button12: TButton;
Button11: TButton;
Button14: TButton;
Button13: TButton;
Button15: TButton;
Button16: TButton;
Button17: TButton;
Button18: TButton;
Button19: TButton;
Button20: TButton;
btnSMS: TButton;
Button1: TButton;
SaveDialog2: TSaveDialog;
OpenDialog2: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure btnLoadDevInfoClick(Sender: TObject);
procedure btnSaveDevInfoClick(Sender: TObject);
procedure btnSetTimeClick(Sender: TObject);
procedure btnClearDataClick(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure btnBackupUserClick(Sender: TObject);
procedure btnRestoreClick(Sender: TObject);
procedure vleDevInfoValidate(Sender: TObject; ACol, ARow: Integer;
const KeyName, KeyValue: String);
procedure btnSetNameClick(Sender: TObject);
procedure btnDeleteUserClick(Sender: TObject);
procedure btnAutoTestClick(Sender: TObject);
procedure sbtnRS232Click(Sender: TObject);
procedure sbtnTCPIPClick(Sender: TObject);
procedure btnACUnlockClick(Sender: TObject);
procedure chkEnabledClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure btnSMSClick(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button14Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
procedure Button15Click(Sender: TObject);
procedure Button16Click(Sender: TObject);
procedure Button17Click(Sender: TObject);
procedure Button18Click(Sender: TObject);
procedure CZKEM1FingerFeature(ASender: TObject; Score: Integer);
procedure CZKEM1Verify(ASender: TObject; UserID: Integer);
procedure Button19Click(Sender: TObject);
procedure Button20Click(Sender: TObject);
private
{ Private declarations }
DevID: integer;
Commport: integer;
Modified: string;
AppPath:string;
procedure AddInfo(const s: string);
procedure ReadDeviceStatus;
procedure BackupUser(const fn: string);
procedure RestoreUser(const fn: string);
function SaveGLogs(const fn: string): integer;
function BTimeEncode(MinuteSecond: integer): string;
function BTimeDecode(const TimeStr: string): integer;
function BNetSpeedEncode(speed: integer): string;
function BNetSpeedDecode(const speed: string): integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
function decodedata(const s: string): string;
function encodedata(const BinData; size: integer): string;
function LoadFile(const fn: string): string;
procedure SaveFileData(const fn: string; const Data; size: integer);
procedure SaveFile(const fn: string; Data: string);
implementation
uses inifiles, uUser;
{$R *.dfm}
const
HexOfNum: array[0..15] of char=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
StatusNames: array[1..12] of string=(
'Tatal administrator',
'Tatal users',
'Tatal FP',
'Tatal Password',
'Tatal manage record',
'Tatal In and out record',
'Nominal FP number',
'Nominal user number',
'Nominal In and out record number',
'Remain FP number',
'Remain user number',
'Remain In and out record number');
Languages: array[0..2] of string=(
'English',
'Simplified Chinese',
'Traditional Chinese');
BaudRates: array[0..6] of string=(
'1200 bps',
'2400 bps',
'4800 bps',
'9600 bps',
'19200 bps',
'38400 bps',
'115200 bps');
CRCs: array[0..2] of string=(
'Nothing',
'Even',
'Odd');
StopBits: array[0..1] of string=(
'One',
'Two');
DateSps: array[0..1] of string=(
'"/"',
'"-"');
MSpeeds: array[0..2] of string=(
'Low speed',
'High speed',
'Auto');
OnOffs: array[0..1] of string=(
'Off',
'On');
YesNos: array[0..1] of string=(
'No',
'Yes');
DateFormats: array[0..9] of string=(
'YY-MM-DD','YY/MM/DD','YY.MM.DD',
'MM-DD-YY','MM/DD/YY','MM.DD.YY',
'DD-MM-YY','DD/MM/YY','DD.MM.YY',
'YYYYMMDD');
NetSpeeds: array[0..4] of string=
('10M_H','100M_H','10M_F','100M_F','AUTO');
NetSpeedValues: array[0..4] of integer=(0,1,4,5,8);
procedure TForm1.FormCreate(Sender: TObject);
var
s: widestring;
i,j: integer;
begin
AppPath:= ExtractFilePath(application.exename);
CZKEM1.GetSDKVersion(s);
label1.Caption := s;
vleDevInfo.ItemProps[2].EditStyle := esPickList;
for i:=0 to length(Languages)-1 do
vleDevInfo.ItemProps[2].PickList.Add(Languages[i]);
vleDevInfo.ItemProps[8].EditStyle := esPickList;
for i:=0 to length(BaudRates)-1 do
vleDevInfo.ItemProps[8].PickList.Add(BaudRates[i]);
vleDevInfo.ItemProps[9].EditStyle := esPickList;
for i:=0 to length(CRCs)-1 do
vleDevInfo.ItemProps[9].PickList.Add(CRCs[i]);
vleDevInfo.ItemProps[10].EditStyle := esPickList;
for i:=0 to length(StopBits)-1 do
vleDevInfo.ItemProps[10].PickList.Add(StopBits[i]);
vleDevInfo.ItemProps[11].EditStyle := esPickList;
for i:=0 to length(DateSps)-1 do
vleDevInfo.ItemProps[11].PickList.Add(DateSps[i]);
for j := 12 to 15 do
begin
vleDevInfo.ItemProps[j].EditStyle := esPickList;
for i:=0 to length(OnOffs)-1 do
vleDevInfo.ItemProps[j].PickList.Add(OnOffs[i]);
end;
vleDevInfo.ItemProps[16].EditStyle := esPickList;
for i:=0 to length(MSpeeds)-1 do
vleDevInfo.ItemProps[16].PickList.Add(MSpeeds[i]);
end;
function LoadFile(const fn: string): string;
var
f: tmemorystream;
begin
result := '';
f := tmemorystream.Create;
try
f.LoadFromFile(fn);
f.Position := 0;
if f.Size>0 then
begin
setlength(result, f.size);
f.Read(result[1], length(result));
end;
finally
f.Free;
end;
end;
procedure SaveFile(const fn: string; Data: string);
var
f: tmemorystream;
begin
f := tmemorystream.Create;
try
if length(data)>0 then
f.Write(Data[1], length(data));
f.Position := 0;
f.SaveToFile(fn);
finally
f.Free;
end;
end;
procedure SaveFileData(const fn: string; const Data; size: integer);
var
f: tmemorystream;
begin
f := tmemorystream.Create;
try
if size>0 then
f.Write(Data, size);
f.Position := 0;
f.SaveToFile(fn);
finally
f.Free;
end;
end;
procedure TForm1.btnConnectClick(Sender: TObject);
var
ErrorCode: integer;
c: boolean;
begin
if btnConnect.Tag = 1 then
begin
CZKEM1.RefreshData(DevId);
CZKEM1.EnableDevice(DevId, TRUE);
CZKEM1.Disconnect;
btnConnect.Tag := 0;
btnConnect.Caption := 'Connect';
end
else
begin
devid:=strtoint(edtNetPort.Text);
if edtPassword.Text>'' then
CZKEM1.SetCommPassword(strtoint(edtPassword.Text));
if pos('COM', uppercase(edtNetAddress.text))=1 then
begin
commport:=ord(edtNetAddress.text[4])-ord('0');
CZKEM1.CommPort := commport;
c:=CZKEM1.Connect_Com(commport, DevID, strtoint(edtBaudRate.text));
end
else
begin
c:=CZKEM1.Connect_net(edtNetAddress.text, Devid);
Devid:=1;
end;
if c then
begin
AddInfo('Device Connected.');
ReadDeviceStatus;
btnConnect.Tag := 1;
btnConnect.Caption := 'Disconnect';
end
else
begin
CZKEM1.GetLastError(ErrorCode);
AddInfo(format('! ConnectDevice ErrorNo.=%d',[ErrorCode]));
end;
AddInfo(' ');
end;
end;
procedure TForm1.AddInfo(const s: string);
begin
memo1.Lines.Add(s);
memo1.Refresh;
end;
procedure TForm1.btnLoadDevInfoClick(Sender: TObject);
var
ErrorCode, Value, i: integer;
begin
for i:=1 to vleDevInfo.RowCount-1 do
if CZKEM1.GetDeviceInfo(devid, i, value) then
begin
if i=29 then
begin
vleDevInfo.Strings.ValueFromIndex[i-1]:=BNetSpeedEncode(Value);
end
else if vleDevInfo.ItemProps[i-1].HasPickList then
begin
if (value>=0) and (value<vleDevInfo.ItemProps[i-1].PickList.Count) then
vleDevInfo.Strings.ValueFromIndex[i-1]:=vleDevInfo.ItemProps[i-1].PickList[value]
else
vleDevInfo.Strings.ValueFromIndex[i-1]:=inttostr(Value);
end
else if (i>=19) and (i<=22) then
vleDevInfo.Strings.ValueFromIndex[i-1]:=BTimeEncode(Value)
else
vleDevInfo.Strings.ValueFromIndex[i-1]:=inttostr(Value);
end
else
begin
CZKEM1.GetLastError(ErrorCode);
AddInfo(format('! GetDeviceInfo(%d) ErrorNo.=%d',[i, ErrorCode]));
end;
Modified:=stringofchar(#0,100);
{
Modified:=stringofchar(#0,100);
for i:=1 to 17 do
if CZKEM1.GetDeviceInfo(devid, i, value) then
begin
if vleDevInfo.ItemProps[i-1].HasPickList then
begin
if (value>=0) and (value<vleDevInfo.ItemProps[i-1].PickList.Count) then
vleDevInfo.Strings.ValueFromIndex[i-1]:=vleDevInfo.ItemProps[i-1].PickList[value]
else
vleDevInfo.Strings.ValueFromIndex[i-1]:=inttostr(Value);
end
else
vleDevInfo.Strings.ValueFromIndex[i-1]:=inttostr(Value);
end
else
begin
CZKEM1.GetLastError(ErrorCode);
AddInfo(format('! GetDeviceInfo(%d) ErrorNo.=%d',[i, ErrorCode]));
end;
}
end;
procedure TForm1.btnSaveDevInfoClick(Sender: TObject);
var
ErrorCode, Value, i: integer;
begin
for i:=1 to vleDevInfo.RowCount-1 do
if Modified[i]='1' then
begin
if i=29 then
begin
Value := BNetSpeedDecode(vleDevInfo.Strings.ValueFromIndex[i-1]);
end
else if vleDevInfo.ItemProps[i-1].HasPickList then
begin
for value:=0 to vleDevInfo.ItemProps[i-1].PickList.Count-1 do
if vleDevInfo.ItemProps[i-1].PickList[value]=vleDevInfo.Strings.ValueFromIndex[i-1] then
break;
if value>=vleDevInfo.ItemProps[i-1].PickList.Count then
value:=0;
end
else if (i>=19) and (i<=22) then
Value := BTimeDecode(vleDevInfo.Strings.ValueFromIndex[i-1])
else
value:=strtoint(vleDevInfo.Strings.ValueFromIndex[i-1]);
if not CZKEM1.SetDeviceInfo(devid, i, value) then
begin
CZKEM1.GetLastError(ErrorCode);
AddInfo(format('! SetDeviceInfo(%d) ErrorNo.=%d',[i, ErrorCode]));
exit;
end
else
Modified[i]:=#0;
if i=2 then
begin
edtNetAddress.Text := vleDevInfo.Strings.ValueFromIndex[i-1];
DevId:=value;
end;
end;
AddInfo('SetDeviceInfo OK');
end;
procedure TForm1.btnSetTimeClick(Sender: TObject);
var
ErrorCode,
dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond: integer;
begin
if CZKEM1.SetDeviceTime(devid) then
begin
AddInfo('SetDeviceTime OK.');
if CZKEM1.GetDeviceTime(devid, dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond) then
AddInfo(Format('DeviceTime=%d-%d-%d %d:%d:%d',[dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond]))
else
begin
CZKEM1.GetLastError(ErrorCode);
AddInfo(format('! GetDeviceTime ErrorNo.=%d',[ErrorCode]));
end;
end
else
begin
CZKEM1.GetLastError(ErrorCode);
AddInfo(format('! SetDeviceTime ErrorNo.=%d',[ErrorCode]));
end;
end;
procedure TForm1.btnClearDataClick(Sender: TObject);
begin
CZKEM1.ClearKeeperData(devid);
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
CZKEM1.ClearGLog(devid);
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
CZKEM1.ClearAdministrators(DevId);
end;
procedure TForm1.Button9Click(Sender: TObject);
var
dwTMachine, dwEnrollNumber,dwEMachineNumber,dwVerifyMode: Integer;
dwInOutMode,dwYear,dwMonth,dwDay,dwHour,dwMinute: Integer;
s: string;
f: tfilestream;
begin
if SaveDialog1.Execute then
begin
f:=tfilestream.Create(SaveDialog1.FileName, fmOpenWrite or fmCreate);
try
if CZKEM1.ReadGeneralLogData(DevId) then
while CZKEM1.GetGeneralLogData(DevId,dwTMachine, dwEnrollNumber,dwEMachineNumber,dwVerifyMode,
dwInOutMode,dwYear,dwMonth,dwDay,dwHour,dwMinute) do
begin
s:=format('%5d %d %d %4d-%2d-%2d %2d:%2d'#13#10, [dwEnrollNumber,dwVerifyMode,
dwInOutMode,dwYear,dwMonth,dwDay,dwHour,dwMinute]);
f.Write(s[1],length(s));
end;
finally
f.Free;
end;
end;
end;
function NumOfHex(c: Char): integer;
begin
result := 0;
if c>='a' then result := ord(c)-ord('a')+10
else if c>='A' then result := ord(c)-ord('A')+10
else if c>='0' then result := ord(c)-ord('0');
if result>16 then
raise exception.Create('Error of Integer: '+c);
end;
type
TByteArray=array[0..0] of byte;
PByteArray=^TByteArray;
function encodedata(const BinData; size: integer): string;
var
i: integer;
da: pbytearray;
begin
setlength(result, size*2);
da:=@BinData;
for i:= 0 to size-1 do
begin
result[i*2+1]:=HexOfNum[da[i] div 16];
result[i*2+2]:=HexOfNum[da[i] mod 16];
end;
end;
function decodedata(const s: string): string;
var
i: integer;
da: pbytearray;
begin
setlength(result, length(s) div 2);
for i:= 1 to length(result) do
begin
result[i]:=char(NumOfHex(s[i*2-1])*16+NumOfHex(s[i*2]));
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
CZKEM1.PowerOffDevice(DevID);
end;
procedure TForm1.BackupUser(const fn: string);
var
f: tinifile;
dwEnrollNumber,dwBackupNumber,Password,
dwMachinePrivilege,i,c,Len: integer;
EnrollData: array[0..2047] of byte;
s: string;
Enable: WordBool;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -