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

📄 casualcardform.~pas

📁 求是科技出版的《Delphi串口通信工程开发实例导航》所有的源代码。是一本很好的书。拿出来与大家共享。
💻 ~PAS
字号:
unit CasualCardForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Menus, Db, ADODB, ComCtrls;

type
  TfrmCasualCard = class(TForm)
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    PopupMenu1: TPopupMenu;
    ADOQuery1: TADOQuery;
    ADOTable1: TADOTable;
    RichEdit1: TRichEdit;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    MoneyArray:array of double;
    state:smallint;
    procedure AddMoney();
    procedure NewCasualCard();
    function GetCasualCardId():string;
    function MoneyToDB(AMoney:double):integer;
  public
    { Public declarations }
  end;

var
  frmCasualCard: TfrmCasualCard;

implementation

uses CardDM, MainForm;

{$R *.DFM}

procedure TfrmCasualCard.AddMoney;
var
    mLen : integer;
    mMoney: double;
begin
    //数据转换
    mMoney := StrToFloat(Edit1.Text);
    //增加数组长度
    mLen := Length(MoneyArray);
    SetLength(MoneyArray,mLen+1);
    //在数组末尾添加
    MoneyArray[mLen] := mMoney;
    RichEdit1.Lines.Add(Format('%20.2f',[mMoney]));
    //处理用户界面
    Edit1.Text := '';
    Edit1.SetFocus;
end;

procedure TfrmCasualCard.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    //回车键
    if Key = #13 then
    begin
        //开始一张新的临时卡
        if State = 0 then NewCasualCard
        else begin
            State := 0;
            AddMoney;
        end;
    end
    //输入数字
    else if Key in ['0'..'9'] then
    begin
        //输入了金额的整数部分
        if (State = 0) or (State = 1) then State := 1
        //输入了金额的小数部分十分位
        else if State = 2 then State := 3
        //输入了金额的小数部分百分位
        else if State = 3 then State := 4
        ////输入了两位小数,不能再输入
        else Key := #0;
    end
    //输入小数点
    else if Key = '.' then
    begin
        //之前没有输入小数点
        if State = 1 then State := 2
        else Key := #0;
    end
    else Key := #0;
end;

procedure TfrmCasualCard.NewCasualCard;
var
    mTotal:double;
    i:integer;
begin
    RichEdit1.Lines.Add('---------------------------');
    mTotal := 0.0;
    //计算临时卡的总金额
    for i:=0 to High(MoneyArray) do
    begin
        mTotal := mTotal + MoneyArray[i];
    end;
    //添加总金额
    RichEdit1.Lines.Add(Format('%20.2f',[mTotal]));
    RichEdit1.Repaint;
    //将临时卡收的费用写库
    if MoneyToDB(mTotal) < 0 then
    begin
        ShowMessage('数据库错误,本次操作将被取消!');
        Exit;
    end;
    //=============打印临时的票据====
    RichEdit1.Print('');
    //=============状态清零==========
    SetLength(MoneyArray,0);
    State := 0;
    //等待打印
    Sleep(3000);
    //开始办理新卡
    RichEdit1.Lines.Clear;
    Edit1.Text := '';
end;

function TfrmCasualCard.GetCasualCardId: string;
var
    mResult : integer;
    //整形数据到8位字符串的转换
    function _IntToStr8(AInt:integer):string;
    var
        mStr : string;
    begin
        mStr := IntToStr(AInt);
        mStr := Copy(mStr,1,8);
        //根据整数的长度再前面补零
        case Length(mStr) of
        1: mStr := '0000000' + mStr  ;
        2: mStr := '000000' + mStr ;
        3: mStr := '00000' + mStr ;
        4: mStr := '0000' + mStr ;
        5: mStr := '000' + mStr  ;
        6: mStr := '00' + mStr ;
        7: mStr := '0' + mStr ;
        end;
        Result := mStr;
    end;
begin
    with ADOQuery1 do
    begin
        Close;
        Connection := DMMain.cnnMain ;
        SQL.Clear;
        //检查数据库是否为空
        SQL.Add('select count(*) as _counter from casual_card_use');
        Open;
        //数据库为空
        if FieldByName('_counter').AsInteger = 0 then
        begin
            Result := '00000001';
            Exit;
        end;
        Close;
        SQL.Clear;
        //从数据库中读取最大的卡号
        SQL.Add('select max(card_id) as maxid from casual_card_use');
        try
            Open;
            if RecordCount > 0 then
            begin
                mResult := FieldByName('maxid').AsInteger;
                Result := _IntToStr8(mResult + 1);
            end
            // 抛出异常,进入except模块;
            else raise Exception.Create('');
        except
            Result := '########';
            Exit;
        end;
    end;
end;

function TfrmCasualCard.MoneyToDB(AMoney:double):integer;
var
    mCardId : string;
    mStr : string;
begin
    Result := 1;
    mCardId := GetCasualCardId();
    if mCardId = '########' then
    begin
        mStr := '数据库读取时发生错误,程序将被关闭。'#10#13;
        mStr := mStr + '请立即和程序开发方联系!';
        ShowMessage(mStr);
        Close;  //  关闭自己
        frmMain.Close;      //关闭主窗口
        Exit;
    end;
    try
        with ADOTable1 do
        begin
            Append;
            FieldByName('card_id').AsString := mCardId;
            FieldByName('use_date').AsDateTime := Now();
            FieldByName('money').AsFloat := AMoney;
            Post;
        end;
    except
        Result := -1;
    end;
end;


procedure TfrmCasualCard.FormShow(Sender: TObject);
begin
    //打开casual_card_use表
    with ADOTable1 do
    begin
        Connection := DMMain.cnnMain;
        TableName := 'casual_card_use';
        Active := True;
    end;
    //==============初始化成员变量===============
    SetLength(MoneyArray,0);
    State := 0;
    //处理用户界面
    RichEdit1.Lines.Clear;
    Edit1.Text := '';
end;

procedure TfrmCasualCard.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
    //关闭数据表,释放资源
    ADOTable1.Active := False;
end;


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -