📄 card_firback.~pas
字号:
FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
try
alib := LoadLibrary(PChar(FileName));
if alib = 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机的函数iccardp.dll!');
Exit;
end;
Proc := TDllFunc(GetProcAddress(alib, PChar('writeCard')));
if @Proc = nil then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机写卡函数!');
Exit;
end;
Result := Proc(PassWord, Comh, Cardh, ValDay, CardType, UserPass1, Discount,
Ye);
finally
begin
proc := nil;
FreeLibrary(alib);
end;
end;
end;
{删除售卡信息SCSJ_TSKXX表中相同的记录}
function TFrmCard_FirBack.DeleteFromDB(rq: TDate; cardno, machineno,
cardstatus, czyname: string): Boolean;
begin
Result := False;
with CardSell_DataModule.ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('Delete');
Sql.Add('From SCSJ_TSKXX');
Sql.Add('Where Convert(char(10),日期,20)=''' + Trim(DateToStr(rq)) + '''');
Sql.Add('And IC卡号=''' + Trim(cardno) + '''');
Sql.Add('And 售卡机编码=''' + Trim(machineno) + '''');
Sql.Add('And 卡片状态=''' + Trim(cardstatus) + '''');
Sql.Add('And 操作员姓名=''' + Trim(czyname) + '''');
try
ExecSql;
except
ShowMessage('无法清空' + machineno + '号售卡机' + DateToStr(rq) + '日' +
cardno + '号卡' + '的数据,系统无法继续工作!');
Exit;
end;
end;
Result := True;
end;
{删除与售卡信息表相关的SCSJ_TKPXX表中相同的记录}
function TFrmCard_FirBack.DeleteFromSubDB(rq: TDate; cardno, machineno,
cardstatus, czyname: string): Boolean;
begin
Result := False;
with CardSell_DataModule.ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('Delete');
Sql.Add('From SCSJ_TKPXX');
Sql.Add('Where Convert(char(10),创建日期,20)=''' + Trim(DateToStr(rq)) +
'''');
Sql.Add('And IC卡号=''' + Trim(cardno) + '''');
Sql.Add('And 售卡机编码=''' + Trim(machineno) + '''');
Sql.Add('And 卡片状态=''' + Trim(cardstatus) + '''');
Sql.Add('And 操作员姓名=''' + Trim(czyname) + '''');
try
ExecSql;
except
ShowMessage('无法清空' + machineno + '号售卡机' + DateToStr(rq) + '日' +
cardno + '号卡' + '的数据,系统无法继续工作!');
Exit;
end;
end;
Result := True;
end;
{向售卡信息表中插入记录}
function TFrmCard_FirBack.InsertToDb(rq: TDate; IcKh: string; CkJe, TkJe, Yj:
Double; KhName: string; ValDaynum: integer; CardStatus, CardLx, CzyName,
MachineNo, CardValue: string; Ye: Double): BooLean;
begin
Result := False;
with CardSell_DataModule.ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('Insert Into SCSJ_TSKXX');
Sql.Add('(IC卡号,日期,存款金额,退款金额,押金,客户姓名,有效天数,卡片状态,卡片类型,操作员姓名,售卡机编码,卡片面值,卡内余额)');
Sql.Add('values(');
Sql.Add('''' + IcKh + ''',''' + Trim(DateToStr(rq)) + ''',' +
floattostr(CkJe) + ',' + floattostr(TkJe) + ',' + floattostr(Yj));
Sql.Add(',''' + KhName + ''',' + IntToStr(ValDaynum) + ',''' +
Trim(CardStatus) + '''');
Sql.Add(',''' + CardLx + ''',''' + CzyName + ''',''' + MachineNo + ''',''' +
CardValue + ''',' + floatToStr(Ye) + ')');
try
ExecSql;
except
ShowMessage('向数据库中插入' + DateToStr(rq) + '日' + IcKh +
'号卡数据失败');
Exit;
end;
end;
Result := True;
end;
{向与售卡信息表相关的表中插入记录}
function TFrmCard_FirBack.InsertToSubDb(rq: TDate; IcKh: string; Yj: Double;
ValDaynum: integer; CardStatus, CardLx, CzyName, MachineNo, CardValue:
string):
BooLean;
begin
Result := False;
with CardSell_DataModule.ADOQuery1 do
begin
Close;
Sql.Clear;
Sql.Add('Insert Into SCSJ_TKPXX');
Sql.Add('(IC卡号,创建日期,押金,有效天数,卡片状态,卡片类型,操作员姓名,售卡机编码,卡片面值)');
Sql.Add('values(');
Sql.Add('''' + IcKh + ''',''' + Trim(DateToStr(rq)) + ''',' +
floattostr(Yj));
Sql.Add(',' + IntToStr(ValDaynum) + ',''' + Trim(CardStatus) + '''');
Sql.Add(',''' + CardLx + ''',''' + CzyName + ''',''' + MachineNo + ''',''' +
CardValue + ''')');
try
ExecSql;
except
ShowMessage('向数据库中插入' + DateToStr(rq) + '日' + IcKh +
'号卡数据失败');
Exit;
end;
end;
Result := True;
end;
{判断Edit是否有为空的字段}
function TFrmCard_FirBack.IfEditNull: Boolean;
var
i: integer;
Temp: TComponent;
begin
Result := True;
for i := 0 to ComponentCount - 1 do
begin
Temp := Components[i];
if (Temp is TDBEdit) then
if TDBEdit(Temp).Text = '' then
begin
ShowMessage(TDBEdit(Temp).Hint + '不能为空');
TDBEdit(Temp).SetFocus;
Exit;
end;
end;
Result := False;
end;
// 读取卡的各类信息
function TFrmCard_FirBack.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';
//ShowMessage('开始调用文件iccardp.dll');
alib := LoadLibrary(PChar(FileName)); //调用dll文件
if alib = 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机的函数iccardp.dll!');
FreeLibrary(alib);
Exit;
end;
//ShowMessage('调用文件iccardp.dll成功!');
//ShowMessage('开始调用函数'+filelx);
x := GetProcAddress(alib, PChar(filelx)); //获取指定函数指针
if x = nil then
begin
Screen.Cursor := crDefault;
ShowMessage(' 函数' + filelx + '调用失败!');
FreeLibrary(alib);
Exit;
end;
// else ShowMessage('函数调用成功!');
Proc := TDllFunc(x); //转换函数类型
if @Proc = nil then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机读取数据函数!');
x := nil;
FreeLibrary(alib);
Exit;
end;
//else ShowMessage('函数转换成功!');
try
Result := Proc(comh, passwordz);
//ShowMessage('函数运行成功!');
except
ShowMessage('函数运行失败!');
proc := nil;
FreeLibrary(alib);
Exit;
end;
proc := nil;
if not FreeLibrary(alib) then
ShowMessage('释放文件不成功!');
//else ShowMessage('释放文件成功!');
Screen.Cursor := crDefault;
end;
{从文件中读取卡号信息}
function TFrmCard_FirBack.ReadKh(var CardNo: string; comh: smallint; pass:
Pchar): Boolean;
var
returnvalue: smallint;
AFileName, s: string;
ATextFile: Textfile;
begin
Result := False;
AFileName := Trim('c:\windows\cardno.txt');
if FileExists(AFileName) then
DeleteFile(AFileName);
returnvalue := ReadFromDll('readcardno', comh, pass);
if returnvalue <> 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('读取卡号错误!');
Exit;
end;
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_FirBack.ReadValdate(var ValDate: string; comh: smallint;
pass: Pchar): Boolean;
var
returnvalue: smallint;
AFileName, s: string;
ATextFile: Textfile;
begin
Result := False;
AFileName := Trim('c:\windows\valdate.txt');
if FileExists(AFileName) then
DeleteFile(AFileName);
returnvalue := ReadFromDll('readvaldate', comh, pass);
if returnvalue <> 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('读取IC卡有效期错误!');
Exit;
end;
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);
while Copy(s, 1, 1) = '0' do
s := Trim(Copy(s, 2, 10000000));
if s = '' then
s := '0';
ValDate := Trim(s);
Result := True;
end;
{从文件中读取卡内余额}
function TFrmCard_FirBack.ReadYe(var Ye: Double; comh: smallint; pass: Pchar):
Boolean;
var
returnvalue: smallint;
AFileName, s: string;
ATextFile: Textfile;
begin
Result := False;
AFileName := Trim('c:\windows\balance.txt');
if FileExists(AFileName) then
DeleteFile(AFileName);
returnvalue := ReadFromDll('readBalance', comh, pass);
if returnvalue <> 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('读取IC卡余额错误!');
Exit;
end;
if not FileExists(AFileName) then
begin
Screen.Cursor := crDefault;
ShowMessage('IC卡余额信息文件' + AFileName + '不存在,系统无法继续工作!');
Exit;
end;
AssignFile(ATextFile, AFileName);
try
ReSet(ATextFile);
except
Screen.Cursor := crDefault;
ShowMessage('IC卡余额信息文件' + AFileName +
'受到破坏,系统无法继续工作!');
CloseFile(ATextFile);
Exit;
end;
while not Eof(ATextFile) do
Readln(ATextFile, s);
CloseFile(ATextFile);
s := Trim(s);
while Copy(s, 1, 1) = '0' do
s := Trim(Copy(s, 2, 10000000));
if s = '' then
s := '0';
Ye := (StrToInt(Trim(s))) / 100;
Result := True;
end;
function TFrmCard_FirBack.ReadXx(CardNo: string; Rq: TDate): Boolean;
var
CardStatus: string;
begin
CardStatus := '使用';
Result := False;
with CardSell_DataModule.ADOQuery3 do
begin
Close;
Sql.Clear;
Sql.Add('Select top 1 卡片类型,卡片面值,押金,存款金额,客户姓名,有效天数');
Sql.Add('From SCSJ_TSKXX Where 卡片状态=''' + Trim(CardStatus) + '''');
Sql.Add('And Convert(char(10),日期,20)<=''' + DateToStr(Rq) + '''');
Sql.Add('And IC卡号=''' + Trim(CardNo) + '''');
Sql.Add('Order by 序号 DESC');
try
Open;
except
Screen.Cursor := crDefault;
ShowMessage('无法浏览售卡信息!');
Exit;
end;
if RecordCount = 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('此卡未售出!');
Exit;
end;
CardSell_DataModule.ADOQuery2.FieldByName('卡片类型').AsString :=
Trim(Fields[0].AsString);
CardSell_DataModule.ADOQuery2.FieldByName('卡片面值').AsString :=
Trim(Fields[1].AsString);
CardSell_DataModule.ADOQuery2.FieldByName('押金').AsFloat :=
Fields[2].AsFloat;
CardSell_DataModule.ADOQuery2.FieldByName('存款金额').AsFloat :=
Fields[3].AsFloat;
CardSell_DataModule.ADOQuery2.FieldByName('客户姓名').AsString :=
Trim(Fields[4].AsString);
CardSell_DataModule.ADOQuery2.FieldByName('有效天数').AsInteger :=
Fields[5].AsInteger;
end;
Result := True;
end;
function TFrmCard_FirBack.ReadXx1(CardNo: string; Rq: TDate): Boolean;
var
CardStatus: string;
ValRq: TDate;
begin
CardStatus := '使用';
Result := False;
with CardSell_DataModule.ADOQuery3 do
begin
Close;
Sql.Clear;
Sql.Add('Select top 1 卡片类型,卡片面值,押金,存款金额,客户姓名,有效天数,日期,卡内余额');
Sql.Add('From SCSJ_TSKXX Where 卡片状态=''' + Trim(CardStatus) + '''');
Sql.Add('And Convert(char(10),日期,20)<=''' + DateToStr(Rq) + '''');
Sql.Add('And IC卡号=''' + Trim(CardNo) + '''');
Sql.Add('Order by 序号 DESC');
try
Open;
except
Screen.Cursor := crDefault;
ShowMessage('无法浏览售卡信息!');
Exit;
end;
if RecordCount = 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('此卡未售出!');
Exit;
end;
CardSell_DataModule.ADOQuery2.FieldByName('卡片类型').AsString :=
Trim(Fields[0].AsString);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -