📄 card_inicard.~pas
字号:
returnvalue: smallint;
pass: PChar;
begin
Result := False;
pass := Pchar(Trim(PassWord1));
//校验密码
returnvalue := ReadFromDll('checkpass', Comhm, pass);
if returnvalue <> 1 then
Exit;
CkJe1 := FloatToStr(CkJe * 100);
//写卡(密码,端口号,卡号,有效期,卡片类型,用户密码,折扣率,卡内余额)
returnvalue := WriteToCard(Pchar(pass), Comhm, Pchar(IcKh), '00000000', '04',
'0000', '15', Trim(CkJe1));
if returnvalue = 0 then
begin
ShowMessage('写卡错误!');
Exit;
end;
if not DeleteFromDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
Exit;
if not DeleteFromSubDB(rq, IcKh, MachineNo, CardStatus, CzyName) then
Exit;
if not InsertToDb(rq, IcKh, CkJe, TkJe, Yj, KhName, ValDayNum, CardStatus,
CardLx, CzyName, MachineNo, CardValue, Ye) then
Exit;
if not InsertToSubDb(rq, IcKh, Yj, ValDayNum, CardStatus, CardLx, CzyName,
MachineNo, CardValue) then
Exit;
Result := True;
end;
{判断Edit是否有为空的字段}
function TFrmCard_IniCard.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_IniCard.WriteToCard(PassWord: Pchar; Comh: smallint; Cardh:
PChar; ValDay: PChar; CardType: string; UserPass1: string; Discount: string;
Ye:
string): smallint;
type
TDllFunc = function(pass: Pchar; comh: smallint; cardno: PChar; valdate:
PChar; dyte: string; userpass: string; disc: string; blance: string):
smallint; stdcall;
var
alib: THandle;
proc: TDllFunc;
FileName: string;
x: FARPROC;
begin
FileName := ExtractFilePath(Application.ExeName) + 'iccardp.dll';
alib := LoadLibrary(PChar(FileName));
if alib = 0 then
begin
Screen.Cursor := crDefault;
ShowMessage('无法访问ic卡机的函数iccardp.dll!');
Exit;
end;
x := GetProcAddress(alib, PChar('writeCard'));
if x = nil then
begin
Screen.Cursor := crDefault;
ShowMessage('写卡函数writeCard调用失败!');
FreeLibrary(alib);
Exit;
end;
Proc := TDllFunc(x);
if @Proc = nil then
begin
Screen.Cursor := crDefault;
x := nil;
FreeLibrary(alib);
ShowMessage('无法访问ic卡机写卡函数!');
Exit;
end;
try
Result := Proc(PassWord, Comh, Cardh, ValDay, CardType, UserPass1, Discount,
Ye);
except
ShowMessage('写卡函数运行失败!');
proc := nil;
FreeLibrary(alib);
end;
proc := nil;
FreeLibrary(alib);
end;
{删除售卡信息SCSJ_TSKXX表中相同的记录}
function TFrmCard_IniCard.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_IniCard.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_IniCard.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(DateTimeToStr(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('向数据库中插入' + DateTimeToStr(rq) + '日' + IcKh +
'号卡数据失败');
Exit;
end;
end;
Result := True;
end;
{向与售卡信息表相关的表中插入记录}
function TFrmCard_IniCard.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(DateTimeToStr(rq)) + ''',' +
floattostr(Yj));
Sql.Add(',' + IntToStr(ValDaynum) + ',''' + Trim(CardStatus) + '''');
Sql.Add(',''' + CardLx + ''',''' + CzyName + ''',''' + MachineNo + ''',''' +
CardValue + ''')');
try
ExecSql;
except
ShowMessage('向数据库中插入' + DateTimeToStr(rq) + '日' + IcKh +
'号卡数据失败');
Exit;
end;
end;
Result := True;
end;
// 读取卡的各类信息
function TFrmCard_IniCard.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('函数运行失败!');
end;
proc := nil;
if not FreeLibrary(alib) then
ShowMessage('释放文件不成功!');
// else ShowMessage('释放文件成功!');
Screen.Cursor := crDefault;
end;
//从文件中读取卡号信息
function TFrmCard_IniCard.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;
{从系统文件中获得初始值}
procedure TFrmCard_IniCard.GetIniValue;
var
ti: TInifile;
MachineNo, CardType, CardValue, CardNo: string;
Yj: Double;
begin
PublicUnit.IsErrorFlag := False;
OldCardFlag := False;
SetReadOnlyFalse;
CardSell_DataModule.ADOQuery2.FieldByName('日期').AsDateTime := Date;
CardSell_DataModule.ADOQuery2.FieldByName('操作员姓名').AsString :=
Trim(FrmMain.UserName);
CardSell_DataModule.ADOQuery2.FieldByName('卡片状态').AsString := '未使用';
ti := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'System.ini');
MachineNo := ti.ReadString('默认选项', 'MachineNo', '2');
CardType := ti.ReadString('默认选项', 'CardType', 'A');
CardValue := ti.ReadString('默认选项', 'CardValue', '10');
Yj := ti.ReadFloat('默认选项', 'CardYj', 5);
IniComboBox;
PassWord1 := ti.ReadString('默认选项', 'Mima', '55555');
PassWord1 := UnEncryFunc(Trim(PassWord1));
Comhm := ti.ReadInteger('默认选项', 'Port', 0);
CardSell_DataModule.ADOQuery2.FieldByName('售卡机编码').AsString :=
Trim(MachineNo);
CardSell_DataModule.ADOQuery2.FieldByName('押金').AsFloat := Yj;
CardSell_DataModule.ADOQuery2.FieldByName('卡片类型').AsString :=
Trim(CardType);
CardSell_DataModule.ADOQuery2.FieldByName('卡片面值').AsString :=
Trim(CardValue);
CardSell_DataModule.ADOQuery2.FieldByName('存款金额').AsFloat :=
StrToFloat(CardValue) - Yj;
if not ReadKh(CardNo, Comhm, Pchar(PassWord1)) then
begin
PublicUnit.IsErrorFlag := True;
DBNavigator1.VisibleButtons := [nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbEdit, nbCancel];
DBNavigator1.DataSource.DataSet.Cancel;
Exit;
end;
if CardNo <> '00000000' then {老卡}
begin
//GetPreCardXx(CardNo);
CardSell_DataModule.ADOQuery2.FieldByName('IC卡号').AsString :=
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -