⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modifyform.~pas

📁 求是科技出版的《Delphi串口通信工程开发实例导航》所有的源代码。是一本很好的书。拿出来与大家共享。
💻 ~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 + -