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

📄 storeservice.pas

📁 物流管理系统是一个典型的数据库应用程序
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit storeservice;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, frame, StdCtrls, DB, DBGrids, ComCtrls,Buttons,
  ExtCtrls, Grids,ADODB;

type
  Tf_storeservice = class(Tf_frame)
    Label1: TLabel;
    Reginfo: TStringGrid;
    Panel2: TPanel;
    Label3: TLabel;
    Servicemanaa: TLabel;
    Label5: TLabel;
    Label7: TLabel;
    Date: TDateTimePicker;
    List: TListBox;
    Grid: TDBGrid;
    RegSource: TDataSource;
    Panel1: TPanel;
    Label2: TLabel;
    Label9: TLabel;
    Save: TBitBtn;
    Cancel: TBitBtn;
    Quit: TBitBtn;
    principal: TEdit;
    Serviceman: TEdit;
    Operator: TEdit;
    Stocktotal: TEdit;
    Factmoney: TEdit;
    procedure FormShow(Sender: TObject);
    procedure principalEnter(Sender: TObject);
    procedure principalKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ListKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ListExit(Sender: TObject);
    procedure ListDblClick(Sender: TObject);
    procedure DateKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure GridDblClick(Sender: TObject);
    procedure GridExit(Sender: TObject);
    procedure GridKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure factmoneyKeyPress(Sender: TObject; var Key: Char);
    procedure ReginfoSelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure ReginfoKeyPress(Sender: TObject; var Key: Char);
    procedure ReginfoSetEditText(Sender: TObject; ACol, ARow: Integer;
      const Value: String);
    procedure ReginfoKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure QuitClick(Sender: TObject);
    procedure CancelClick(Sender: TObject);
    procedure SaveClick(Sender: TObject);
    procedure ServicemanKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    Procedure SetListPos(Control: TControl); //设置列表出现的位置
    Function SelectTableinfo(TableName: String;FieldName: String;Value: Variant):Boolean;//有数据返回,返回指为True
    Function CurrentIsNull: Boolean;//判断表格当前行是否为空
    Function CalculateMoney: Real;//统计金额
    Procedure ClearCurRow;//清空当前行
    Procedure ClearEndRow;//清空最后一行
    Procedure ClearEdit;//清空编辑框中的文本
    Procedure IniGrid;//初试化表格
    Function EditIsNull: Boolean;//判断编辑框文本是否为空
    Function EndRowIsNull: Boolean;//判断表格最后一行是否为空
    Function GridIsNull: Boolean;//判断表格信息是否为空
    { Public declarations }
  end;

var
  f_storeservice: Tf_storeservice;
  row: Integer = 1; //记录当前单元格横坐标
  col: integer = 0;//记录当前单元格纵坐标
  Reg: Boolean= False; //在表格中输入登记信息时,防止再次触发列表的OnSetEditText事件

Const
  storename = 0;
  num = 1;
  servicemoney = 2;
  memo = 3;
implementation
  uses data, main;
{$R *.dfm}
//在窗体显示时设置字段名称
procedure Tf_storeservice.FormShow(Sender: TObject);
begin
  inherited;
  with Reginfo do
  begin
    Cells[storename,0]:='物资名称';
    Cells[num,0]:='数量';
    Cells[servicemoney,0]:= '维护费用';
    Cells[memo,0]:= '备注';
  end;
  Cancel.Click;
end;

procedure Tf_storeservice.principalEnter(Sender: TObject);
begin
  inherited;
  Grid.Visible := False;
end;
//处理编辑框的OnKeyDown事件,按PageDown键会以列表形式显示数据 ,按回车键将检查数据是否合法
//如果不合法,进行提示,否则焦点将移动到下一个单元格中
procedure Tf_storeservice.principalKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  procedure SelectTable(TableName: String;FieldIndex,Tag: integer);//将指定表某一字段数据显示在列表中
  begin
    List.Clear;//清空列表
    with t_data.Query1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select * from '+ TableName);
      Open;
    end;
    if t_data.Query1.RecordCount>0 then //向列表中添加数据
    begin
      while Not t_data.Query1.Eof do
      begin
        List.Items.Add(t_data.Query1.Fields[FieldIndex].AsString);
        t_data.Query1.Next;
      end;
    end;
    if tag = 0 then
      SetListPos(Principal)
    else
      SetListPos(Serviceman);
    List.SetFocus;
    List.ItemIndex := 0;
  end;
begin
  inherited;
  if (Key = VK_Next)and(Sender is TEdit)  then
  begin
    case TEdit(Sender).Tag of
      0: begin
           SelectTable('tb_employeeinfo',1,0);
           List.Tag := 0;
         end;
      1: begin
           SelectTable('tb_employeeinfo',1,1);
           List.Tag := 1;
         end;
    end;
  end
  else if Key = vk_Return then
  begin
    if Sender is TEdit then
    begin
      if Trim(TEdit(Sender).Text)='' then
      begin
        Application.MessageBox('信息不能为空.','提示',64);
        Exit;
      end;
      case TEdit(Sender).Tag of
        0: begin
             if SelectTableInfo('tb_employeeinfo','workername',Principal.Text)= False then
             begin
               Application.MessageBox('该领取人不存在,请重新输入.','提示',64);
               Principal.SelectAll;
               Exit;
             end;
           end;
        1: begin
             if SelectTableInfo('tb_employeeinfo','workername',Serviceman.Text)= False then
             begin
               Application.MessageBox('该库管员不存在,请重新输入.','提示',64);
               Serviceman.SelectAll;
               Exit;
             end;
           end;
      end;
    end;
    FindNext(True);
  end;
end;
//自定义函数用于根据表名\字段名\字段值查询数据,如果有数据返回,返回值为True,否则为False
function Tf_storeservice.SelectTableinfo(TableName, FieldName: String;
  Value: Variant): Boolean;
begin
  Result := False;
  with t_data.Query1 do
  begin
    CLose;
    SQL.Clear;
    SQL.Add('select * from '+ TableName+' where '+ FieldName+' = :Value');
    Parameters.ParamByName('Value').Value := Value;
    Open;
  end;
  if t_data.Query1.RecordCount>0 then
    Result := True;
end;
//自定义过程,用于设置列表框出现的位置
procedure Tf_storeservice.SetListPos(Control: TControl);
begin
  List.Top := Control.Top+Control.Parent.Top;
  List.Left := Control.Left+Control.Width;
  List.Visible := True;
  List.SetFocus;
end;
//处理列表框的OnKeyDown事件,按回车键将列表框当前文本显示在编辑框中
procedure Tf_storeservice.ListKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  inherited;
  if Key = vk_Return then
  begin
    case List.Tag of //根据列表框不同的Tag值设置不同编辑框的文本
      0: begin
           Principal.Text := List.Items[List.ItemIndex];
           Principal.OnKeyDown(Principal,Key,shift);
           Principal.SetFocus;
         end;
      1: begin
           Serviceman.Text := List.Items[List.ItemIndex];
           Serviceman.SetFocus;
         end;
    end;
    List.Visible := False;
  end;
end;
//列表框失去焦点时不可见
procedure Tf_storeservice.ListExit(Sender: TObject);
begin
  inherited;
  List.Visible := False;
end;
//双击列表框将调用列表框的OnKeyDown事件处理过程
procedure Tf_storeservice.ListDblClick(Sender: TObject);
var
  Key: Word;
begin
  inherited;
  //模拟回车按键操作
  Key:= vk_ReTurn;
  List.OnKeyDown(nil,Key,[ssLeft]);
end;

procedure Tf_storeservice.DateKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  inherited;
  if Key = vk_Return then
    Reginfo.SetFocus;
end;
//用户在录入表格中输入物资名称时,会显示一个联想录入表格,双击该表格可以将当前物资信息
//显示在录入表格中
procedure Tf_storeservice.GridDblClick(Sender: TObject);
begin
  inherited;
  with t_data.Query1 do
  begin
    Reginfo.Cells[storename,row]:= Trim(FieldByName('storename').AsString);
  end;
  Reginfo.SetFocus;
  Reginfo.Col := Reginfo.Col+1;
end;
//联想录入表格在失去焦点时不可见
procedure Tf_storeservice.GridExit(Sender: TObject);
begin
  inherited;
  Grid.Visible := False;
end;
//在联想录入表格中按回车键将模拟录入表格的OnDblClick事件
procedure Tf_storeservice.GridKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  inherited;
  if Key = vk_Return then
    Grid.OnDblClick(Sender);
end;
//防止输入非法的数据,只允许输入数字
procedure Tf_storeservice.factmoneyKeyPress(Sender: TObject;
  var Key: Char);
begin
  inherited;
  if not (Key in ['0'..'9',#8,'.']) then
    Key := #0
  else if (Key = '.')and(Pos('.',Trim(Factmoney.Text))<>0) then
    Key := #0;
end;
//记录当前单元格的坐标
procedure Tf_storeservice.ReginfoSelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  inherited;
  row := ARow;
  col := ACol;
end;
//在表格的数量和金额字段只允许输入数字
procedure Tf_storeservice.ReginfoKeyPress(Sender: TObject; var Key: Char);
begin
  inherited;
  if (col = num)or(col = servicemoney) then
  begin
    if not (Key in ['0'..'9','.',#8]) then
      Key := #0
  end;
end;

//处理表格的OnSetEditText事件,完成物资信息的联想录入,计算总计金额
procedure Tf_storeservice.ReginfoSetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
var
  CellRect: TRect; //记录当前单元格的区域,用于计算联想录入表格出现的位置
begin
  inherited;
  if Reg = false then
  begin
    Grid.Visible := False;
    if (Acol = storename) then //匹配查询物资名称
    begin
      With t_data.Query1 do
      begin
        CLose;
        SQL.Clear;
        SQL.Add('select * from tb_storeinfo where storename Like :Storename or nameshort like :nameshort');
        Parameters.ParamByName('storename').Value := Trim(Reginfo.Cells[storename,ARow])+'%' ;
        Parameters.ParamByName('nameshort').Value := Trim(Reginfo.Cells[storename,ARow])+'%' ;
        Open;
      end;
      if t_data.Query1.RecordCount>0 then //如果存在匹配的数据,显示联想录入表格,供用户选择
      begin
        Regsource.DataSet := t_data.Query1;
        if not Grid.Visible then
        begin
          CellRect := Reginfo.CellRect(ACol,ARow);
          CellRect.Left := CellRect.Left+Reginfo.Left;
          CellRect.Right := CellRect.Right+ Reginfo.Left;
          CellRect.Top := Reginfo.Top+ CellRect.Top;
          Grid.Left := CellRect.Right+1;
          Grid.Top := CellRect.Top;
          Grid.Visible := True;

⌨️ 快捷键说明

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