📄 card_scanxx.~pas
字号:
unit Card_ScanXx;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ToolWin, ComCtrls, StdCtrls, DBCtrls, DB, ADODB, IniFiles;
type
TFrmCard_ScanXx = class(TForm)
Panel1: TPanel;
Label8: TLabel;
DBText7: TDBText;
Label9: TLabel;
DBText8: TDBText;
Label10: TLabel;
DBText9: TDBText;
Panel2: TPanel;
Label6: TLabel;
DBText5: TDBText;
Label7: TLabel;
DBText6: TDBText;
Label2: TLabel;
DBText1: TDBText;
Panel3: TPanel;
Label3: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
DBText2: TDBText;
DBText3: TDBText;
DBText11: TDBText;
DBText12: TDBText;
DBText13: TDBText;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
GroupBox1: TGroupBox;
Label1: TLabel;
DateTimePicker1: TDateTimePicker;
Label15: TLabel;
Edit1: TEdit;
Label5: TLabel;
DBText4: TDBText;
Panel4: TPanel;
Button1: TButton;
Button3: TButton;
Panel5: TPanel;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
IsNew: Boolean;
function Scan(Rq: TDate; Kh: string): Boolean;
function GetCardNo: Boolean;
function ReadKh(var CardNo: string; comh: smallint; pass: Pchar): Boolean;
function ReadFromDll(filelx: string; comh: smallint; passwordz: PChar):
smallint;
public
{ Public declarations }
end;
procedure SetWork;
implementation
uses Card_DataModule, PublicUnit;
{$R *.dfm}
procedure SetWork;
var
FrmCard_ScanXx: TFrmCard_ScanXx;
begin
Screen.Cursor := crHourGlass;
Application.CreateForm(TFrmCard_ScanXx, FrmCard_ScanXx);
FrmCard_ScanXx.ShowModal;
FrmCard_ScanXx.Free;
end;
procedure TFrmCard_ScanXx.FormShow(Sender: TObject);
begin
ADOQuery1.ConnectionString:= 'Provider=SqlOLEDB.1;Persist Security Info=True;User ID='
+ PublicUnit.DBUser + ';Password=' + PublicUnit.DBPass +
';Initial Catalog='
+ PublicUnit.DbName + ';Data Source=' + PublicUnit.ServerName;
DateTimePicker1.Date := Date;
Screen.Cursor := CrDefault;
end;
function TFrmCard_ScanXx.Scan(Rq: TDate; Kh: string): Boolean;
begin
with ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('Select top 1 *');
Sql.Add('From SCSJ_TSKXX Where');
Sql.Add('Convert(char(10),日期,20)<=''' + DateToStr(Rq) + '''');
Sql.Add('And IC卡号=''' + Trim(Kh) + '''');
Sql.Add('Order by 序号 DESC');
//Sql.SaveToFile('c:\dd.sql');
try
Open;
except
Screen.Cursor := crDefault;
ShowMessage('无法浏览卡片状态信息!');
Exit;
end;
if RecordCount = 0 then
begin
ShowMessage('数据库中没有此卡片的信息!');
Exit;
end;
end;
end;
function TFrmCard_ScanXx.GetCardNo: Boolean;
var
ti: TInifile;
CardNo, PassWord1: string;
Comhm: smallint;
begin
Result := False;
IsNew := False;
ti := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'System.ini');
PassWord1 := ti.ReadString('默认选项', 'Mima', '55555');
PassWord1 := UnEncryFunc(Trim(PassWord1));
Comhm := ti.ReadInteger('默认选项', 'Port', 0);
if not ReadKh(CardNo, Comhm, Pchar(PassWord1)) then
Exit;
if CardNo <> '00000000' then {老卡}
Edit1.Text := Trim(CardNo)
else
begin
IsNew := True;
ShowMessage('这是一张新卡!');
end;
ti.Free;
Result := True;
end;
//从文件中读取卡号信息
function TFrmCard_ScanXx.ReadKh(var CardNo: string; comh: smallint; pass:
Pchar): Boolean;
var
returnvalue: smallint;
AFileName, s: string;
ATextFile: Textfile;
begin
Result := False;
returnvalue := ReadFromDll('readcardno', comh, pass);
if returnvalue <> 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('读取卡号错误!');
Exit;
end;
AFileName := Trim('c:\windows\cardno.txt');
if not FileExists(AFileName) then
begin
Screen.Cursor := crDefault;
ShowMessage('卡号信息文件' + AFileName + '不存在,系统无法继续工作!');
Exit;
end;
AssignFile(ATextFile, AFileName);
try
ReSet(ATextFile);
except
Screen.Cursor := crDefault;
ShowMessage('卡号信息文件' + AFileName + '受到破坏,系统无法继续工作!');
CloseFile(ATextFile);
Exit;
end;
while not Eof(ATextFile) do
Readln(ATextFile, s);
CloseFile(ATextFile);
s := Trim(s);
if s='FFFFFFFF' then
begin
ShowMessage('卡片插反了,请正确插入卡片!');
Exit;
end;
{while Copy(s, 1, 1) = '0' do
s := Trim(Copy(s, 2, 10000000));}
CardNo := Trim(s);
Result := True;
end;
// 读取卡的各类信息
function TFrmCard_ScanXx.ReadFromDll(filelx: string; comh: smallint; passwordz:
PChar): smallint;
type
TDllFunc = function(com: integer; password: pchar): smallint; stdcall;
var
alib: THandle;
proc: TDllFunc;
FileName: string;
x: FARPROC;
begin
Screen.Cursor := crHourGlass;
FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
alib := LoadLibrary(PChar(FileName)); //调用dll文件
if alib = 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机的函数iccardp.dll!');
FreeLibrary(alib);
Exit;
end;
x := GetProcAddress(alib, PChar(filelx)); //获取指定函数指针
if x = nil then
begin
Screen.Cursor := crDefault;
ShowMessage(' 函数' + filelx + '调用失败!');
FreeLibrary(alib);
Exit;
end;
Proc := TDllFunc(x); //转换函数类型
if @Proc = nil then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机读取数据函数!');
x := nil;
FreeLibrary(alib);
Exit;
end;
try
Result := Proc(comh, passwordz);
except
ShowMessage('函数运行失败!');
end;
proc := nil;
if not FreeLibrary(alib) then
ShowMessage('释放文件不成功!');
Screen.Cursor := crDefault;
end;
procedure TFrmCard_ScanXx.Button1Click(Sender: TObject);
begin
if not GetCardNo then
begin
ShowMessage('从卡片上读取卡号信息错误,请输入卡号!');
Edit1.SetFocus;
end;
end;
procedure TFrmCard_ScanXx.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TFrmCard_ScanXx.Button3Click(Sender: TObject);
var
Rq: TDate;
Kh: string;
begin
if IsNew then
Exit;
Rq := DateTimePicker1.Date;
Kh := Trim(Edit1.Text);
if Kh = '' then
begin
ShowMessage('卡号不能为空!');
Edit1.SetFocus;
Exit;
end;
Scan(Rq, Kh);
end;
procedure TFrmCard_ScanXx.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then Button3.Click;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -