📄 modifyform.~pas
字号:
unit ModifyForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, Grids, DBGrids, Db, ADODB, StdCtrls, Buttons, OleCtrls,
MSCommLib_TLB, ExtCtrls;
type
TfrmModify = class(TForm)
tblUseMoney: TADOTable;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Panel1: TPanel;
DBGrid1: TDBGrid;
DateTimePicker1: TDateTimePicker;
Label1: TLabel;
MSComm1: TMSComm;
edtCardId: TEdit;
Label2: TLabel;
DataSource1: TDataSource;
Timer1: TTimer;
tblUseMoneycard_use_id: TAutoIncField;
tblUseMoneycard_id: TWideStringField;
tblUseMoneymoney: TFloatField;
tblUseMoneyuse_date: TDateTimeField;
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure DateTimePicker1Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmModify: TfrmModify;
implementation
uses
CardDM,FunctionUnit, ModifyFeeForm;
{$R *.DFM}
procedure TfrmModify.Timer1Timer(Sender: TObject);
var
mByteAry: array of Byte;
mIn :array of Byte ;
mCardId : string;
begin
//构造上位机报文
SetLength(mByteAry,5);
mByteAry[0] := $0f;
mByteAry[1] := $f0;
mByteAry[2] := $5;
mByteAry[3] := $1;
mByteAry[4] := CalCheck(mByteAry,0,3);
//发读第一区的命令
MSComm1.Output := mByteAry;
//等待读卡机的应答信息
Sleep(60);
if MSComm1.InBufferCount <> 13 then
begin
//下位机不应答,表示没有卡放入
mCardId := '00000'; //显示一个不存在的卡号
end
else begin
//将下位机报文接受到缓冲区
SetLength(mIn,MSComm1.inBufferCount);
mIn := MSComm1.Input;
if not IsArrayValid(mIn) then Exit;
//在用户界面中显示卡号
mCardId := Chr(mIn[4])
+Chr(mIn[5])
+Chr(mIn[6])
+Chr(mIn[7])
+Chr(mIn[8]);
end;
//卡没有变
if mCardId = edtCardId.Text then Exit
else edtCardId.Text := mCardId;
with tblUseMoney do
begin
Filter := 'use_date >= ' + '''' + DateTimeToStr(Int(DateTimePicker1.DateTime)) + '''';
Filter := Filter + ' and use_date < ' + '''' + DateTimeToStr(Int(DateTimePicker1.DateTime) + 1) + '''';
Filter := Filter + ' and card_id = ' + '''' + edtCardId.Text + '''';
Filtered := True;
//有数据记录
if RecordCount < 1 then
begin
BitBtn1.Enabled := False;
BitBtn2.Enabled := False;
end
else begin
BitBtn1.Enabled := True;
BitBtn2.Enabled := True;
end;
end;
end;
procedure TfrmModify.FormShow(Sender: TObject);
begin
//打开数据表card_use
with tblUseMoney do
begin
Connection := DMMain.cnnMain;
TableName := 'card_use';
Active := True;
end;
//打开串口
if MSComm1.PortOpen = False then
begin
try
MSComm1.CommPort := ComStrToInt(Port);
MSComm1.Settings := Speed + ','
+ CheckBit[1] + ','
+ DataBit + ','
+ StopBit;
MSComm1.PortOpen := True;
except
ShowMessage('串口不能打开,请检查串口的配置!');
Exit;
end;
end;
Timer1.Enabled := True;
//---------------初始化用户界面-----------
DateTimePicker1Change(DateTimePicker1);
end;
procedure TfrmModify.DateTimePicker1Change(Sender: TObject);
begin
with tblUseMoney do
begin
//查找对应的数据
Filter := 'use_date >= ' + '''' + DateTimeToStr(Int(DateTimePicker1.DateTime)) + '''';
Filter := Filter + ' and use_date < ' + '''' + DateTimeToStr(Int(DateTimePicker1.DateTime) + 1) + '''';
Filter := Filter + ' and card_id = ' + '''' + edtCardId.Text + '''';
Filtered := True;
//有数据记录
if RecordCount < 1 then
begin
BitBtn1.Enabled := False;
BitBtn2.Enabled := False;
end
else begin
BitBtn1.Enabled := True;
BitBtn2.Enabled := True;
end;
end;
end;
procedure TfrmModify.BitBtn1Click(Sender: TObject);
var
mQuery: TADOQuery;
mMoneyFloat,mMoneyReal : double;
mByteAry: array of Byte;
mIn :array of Byte ;
mMoney : Integer;
mB:array[0..5] of Byte;
mRet,i:Integer;
begin
//读取误消费金额
mMoneyFloat := tblUseMoney.FieldByName('money').AsFloat;
with frmModifyFee do
begin
//数据转换
Edit1.Text := FloatToStr(mMoneyFloat);
Edit2.Text := '';
ActiveControl := Edit2;
if ShowModal() <>mrOk then Exit;
//实际消费的金额
mMoneyReal := StrToFloat(Edit2.Text);
end;
//开始数据库事务
DMMain.cnnMain.BeginTrans;
with tblUseMoney do
begin
Edit;
FieldByName('money').AsFloat := mMoneyReal;
Post;
end;
//多消费的金额差-再次加入卡中
mMoneyFloat := mMoneyFloat - mMoneyReal;
mQuery := TADOQuery.Create(nil);
with mQuery do
begin
Connection := DMMain.cnnMain;
SQL.Clear;
//更改卡中的金额
SQL.Add('update card set money = money + :AMoney ');
SQL.Add('where card_id = :ACardId ');
Parameters.ParamValues['AMoney'] := mMoneyFloat;
Parameters.ParamValues['ACardId'] := edtCardId.Text;
ExecSQL;
//读取卡中的金额
SQL.Clear;
SQL.Add('select money from card ');
SQL.Add('where card_id = :ACardId');
Parameters.ParamValues['ACardId'] := edtCardId.Text;
Open;
//数据库中有该卡号
if RecordCount = 1 then
begin
mMoney := Round(FieldByName('money').AsFloat*100);
//取出金额中的每一位
for i:=0 to 5 do
begin
mB[i] := mMoney mod 10;
mMoney := mMoney div 10;
end;
Timer1.Enabled := False;
//等待Timer时间函数执行完成
Sleep(200);
//构造上位机报文
SetLength(mByteAry,13);
mByteAry[0] := $0f;
mByteAry[1] := $f0;
mByteAry[2] := $03; //写命令
mByteAry[3] := $03; //第3区
//金额数据加密写入
mByteAry[4] := Encrypt(mB[0]);
mByteAry[5] := Encrypt(mB[1]);
mByteAry[6] := Encrypt(mB[2]);
mByteAry[7] := Encrypt(mB[3]);
mByteAry[8] := Encrypt(mB[4]);
mByteAry[9] := Encrypt(mB[5]);
mByteAry[10] := CalMoneyCheck(mByteAry,4,9);
mByteAry[11] := $FF;//数据区以$FF结尾
mByteAry[12] := CalCheck(mByteAry,0,11);
//发写第3区的命令
MSComm1.Output := mByteAry;
//等待读卡机的应答信息
Sleep(60);
if MSComm1.InBufferCount <> 6 then
begin
ShowMessage('写入数据时出错,请重试!');
DMMain.cnnMain.RollbackTrans ;
Exit;
end;
//将下位机报文接受到缓冲区
SetLength(mIn,MSComm1.inBufferCount);
mIn := MSComm1.Input;
if not IsArrayValid(mIn) or (mIn[4] <> $0f) then
begin
ShowMessage('写入数据时出错,请重试!');
DMMain.cnnMain.RollbackTrans ;
Exit;
end;
end
else begin
ShowMessage('该卡号在数据中不存在!');
end;
end;
mQuery.Free;
DMMain.cnnMain.CommitTrans;
end;
procedure TfrmModify.BitBtn2Click(Sender: TObject);
var
mQuery: TADOQuery;
mMoneyFloat : double;
mByteAry: array of Byte;
mIn :array of Byte ;
mMoney : Integer;
mB:array[0..5] of Byte;
mRet,i:Integer;
begin
//读取误消费金额
mMoneyFloat := tblUseMoney.FieldByName('money').AsFloat;
//开始数据库事务
DMMain.cnnMain.BeginTrans;
//删除误消费记录
with tblUseMoney do
begin
Delete;
end;
mQuery := TADOQuery.Create(nil);
with mQuery do
begin
Connection := DMMain.cnnMain;
SQL.Clear;
//将误消费的金额重新加入卡
SQL.Add('update card set money = money + :AMoney ');
SQL.Add('where card_id = :ACardId ');
Parameters.ParamValues['AMoney'] := mMoneyFloat;
Parameters.ParamValues['ACardId'] := edtCardId.Text;
ExecSQL;
//读取卡中新的中金额
SQL.Clear;
SQL.Add('select money from card ');
SQL.Add('where card_id = :ACardId');
Parameters.ParamValues['ACardId'] := edtCardId.Text;
Open;
//数据库中有该卡号
if RecordCount = 1 then
begin
mMoney := Round(FieldByName('money').AsFloat*100);
//取出金额中的每一位
for i:=0 to 5 do
begin
mB[i] := mMoney mod 10;
mMoney := mMoney div 10;
end;
Timer1.Enabled := False;
//等待Timer时间函数执行完成
Sleep(200);
//构造上位机报文
SetLength(mByteAry,13);
mByteAry[0] := $0f;
mByteAry[1] := $f0;
mByteAry[2] := $03; //写命令
mByteAry[3] := $03; //第3区
//金额数据加密写入
mByteAry[4] := Encrypt(mB[0]);
mByteAry[5] := Encrypt(mB[1]);
mByteAry[6] := Encrypt(mB[2]);
mByteAry[7] := Encrypt(mB[3]);
mByteAry[8] := Encrypt(mB[4]);
mByteAry[9] := Encrypt(mB[5]);
mByteAry[10] := CalMoneyCheck(mByteAry,4,9);
mByteAry[11] := $FF;//数据区以$FF结尾
mByteAry[12] := CalCheck(mByteAry,0,11);
//发写第3区的命令
MSComm1.Output := mByteAry;
//等待读卡机的应答信息
Sleep(60);
if MSComm1.InBufferCount <> 6 then
begin
ShowMessage('写入数据时出错,请重试!');
DMMain.cnnMain.RollbackTrans ;
Exit;
end;
//将下位机报文接受到缓冲区
SetLength(mIn,MSComm1.inBufferCount);
mIn := MSComm1.Input;
if not IsArrayValid(mIn) or (mIn[4] <> $0f) then
begin
ShowMessage('写入数据时出错,请重试!');
DMMain.cnnMain.RollbackTrans ;
Exit;
end;
end
else begin
ShowMessage('该卡号在数据中不存在!');
end;
end;
mQuery.Free;
DMMain.cnnMain.CommitTrans;
end;
procedure TfrmModify.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//释放相应的资源
Timer1.Enabled := False;
//关闭串口
MSComm1.PortOpen := False;
//关闭数据表
tblUseMoney.Active := False;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -