📄 storeout.pas
字号:
unit storeout;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, frame, StdCtrls, Buttons, ExtCtrls, ComCtrls, Grids,
DB, DBGrids,ADODB;
type
Tf_storeout = class(Tf_frame)
Label1: TLabel;
Panel3: TPanel;
Save: TBitBtn;
Cancel: TBitBtn;
Quit: TBitBtn;
Grid: TDBGrid;
RegSource: TDataSource;
List: TListBox;
Reginfo: TStringGrid;
Panel2: TPanel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Date: TDateTimePicker;
Label6: TLabel;
Comstorage: TComboBox;
outperson: TEdit;
storemanager: TEdit;
Operator: TEdit;
Memo: TEdit;
procedure FormShow(Sender: TObject);
procedure outpersonEnter(Sender: TObject);
procedure outpersonKeyDown(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 GridExit(Sender: TObject);
procedure GridDblClick(Sender: TObject);
procedure GridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure QuitClick(Sender: TObject);
procedure CancelClick(Sender: TObject);
procedure ComstorageExit(Sender: TObject);
procedure ComstorageKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ReginfoKeyPress(Sender: TObject; var Key: Char);
procedure ReginfoSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure ReginfoSetEditText(Sender: TObject; ACol, ARow: Integer;
const Value: String);
procedure ReginfoKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DateKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure SaveClick(Sender: TObject);
private
{ Private declarations }
public
Procedure SetListPos(Control: TControl); //设置列表出现的位置
Function SelectTableinfo(TableName: String;FieldName: String;Value: Variant):Boolean;//有数据返回,返回指为True
Procedure ClearEdit;//清空编辑框中的文本
Procedure IniGrid;//初试化表格
Function CurrentIsNull: Boolean;//判断表格当前行是否为空
Procedure ClearCurRow;//清空当前行
Procedure ClearEndRow;//清空最后一行
Function EditIsNull: Boolean;//判断编辑框文本是否为空
Function EndRowIsNull: Boolean;//判断表格最后一行是否为空
Function GridIsNull: Boolean;//判断表格信息是否为空
Function CurIsExit(index: Integer): Boolean;//判断表格中当前行在其后面的行中是否存在
Function CheckStoreEnough: Boolean;//判断表格中的物资在库存中是否充足
Function Calculatenum(index: Integer): Real;//在当前行统计物资数量
Function StoreIsExis: Boolean;//判断物资在库存中是否存在
{ Public declarations }
end;
var
f_storeout: Tf_storeout;
row: Integer = 1; //记录当前单元格横坐标
col: integer = 0;//记录当前单元格纵坐标
Reg: Boolean= False; //在表格中输入登记信息时,防止再次触发列表的OnSetEditText事件
Const
barcode = 0;
storename = 1;
num =2;
storagename = 3;
implementation
uses data, main;
{$R *.dfm}
//在窗体显示时,设置表格字段名称,向组合框中添加仓库名称
procedure Tf_storeout.FormShow(Sender: TObject);
begin
inherited;
with Reginfo do
begin
Cells[barcode,0]:='条形码';
Cells[storename,0]:= '物资名称';
Cells[num,0]:='数量';
Cells[storagename,0]:='仓库名称';
end;
with t_data.Query1 do
begin
CLose;
SQL.Clear;
SQL.Add('select storagename from tb_storageinfo');
Open;
end;
if t_data.Query1.RecordCount>0 then
begin
while not t_data.Query1.Eof do //利用循环的方式向组合框中添加仓库名称
begin
Comstorage.Items.Add(Trim(t_data.Query1.FieldByName('storagename').AsString));
t_data.Query1.Next;
end;
Comstorage.ItemIndex := 0;
end;
Cancel.Click;//调用取消按钮的单击事件进行初始化
end;
//在编辑框获得焦点时,联想录入表格不可见
procedure Tf_storeout.outpersonEnter(Sender: TObject);
begin
inherited;
Grid.Visible := False;
end;
//处理编辑框的OnKeyDown事件,用户按Page键,将以列表形式显示相关信息,供用户选择
//按回车键检查用户信息是否合法
procedure Tf_storeout.outpersonKeyDown(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(Outperson)
else
SetListPos(Storemanager);
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',Outperson.Text)= False then
begin
Application.MessageBox('该领取人不存在,请重新输入.','提示',64);
Outperson.SelectAll;
Exit;
end;
end;
1: begin
if SelectTableInfo('tb_employeeinfo','workername',Storemanager.Text)= False then
begin
Application.MessageBox('该库管员不存在,请重新输入.','提示',64);
Storemanager.SelectAll;
Exit;
end;
end;
end;
end;
FindNext(True); //使下一个控件获得焦点
end;
end;
//自定义函数函数,根据表名\字段名\字段值查询数据,如果有数据返回,返回值为True,否则为False
function Tf_storeout.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_storeout.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_storeout.ListKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if Key = vk_Return then
begin
case List.Tag of
0: begin
Outperson.Text := List.Items[List.ItemIndex];
Outperson.OnKeyDown(Outperson,Key,shift);
Outperson.SetFocus;
end;
1: begin
Storemanager.Text := List.Items[List.ItemIndex];
Storemanager.SetFocus;
end;
end;
List.Visible := False;
end;
end;
//列表失去焦点时不可见
procedure Tf_storeout.ListExit(Sender: TObject);
begin
inherited;
List.Visible := False;
end;
//双击列表,将模拟其OnKeyDown事件
procedure Tf_storeout.ListDblClick(Sender: TObject);
var
Key: Word;
begin
inherited;
Key:= vk_ReTurn;
List.OnKeyDown(nil,Key,[ssLeft]);
end;
//联想录入表格失去焦点时不可见
procedure Tf_storeout.GridExit(Sender: TObject);
begin
inherited;
Grid.Visible := False;
end;
//双击联想录入表格,将条形码,物资名称显示在录入表格中
procedure Tf_storeout.GridDblClick(Sender: TObject);
begin
inherited;
with t_data.Query1 do
begin
Reginfo.Cells[barcode,row]:= Trim(FieldByName('barcode').AsString);
Reginfo.Cells[storename,row]:= Trim(FieldByName('storename').AsString);
end;
Reginfo.SetFocus;
Reginfo.Col := Reginfo.Col+1;
end;
//在联想录入表格中按回车键将模拟OnDblClick事件
procedure Tf_storeout.GridKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if Key = vk_Return then
Grid.OnDblClick(Sender);
end;
//退出按钮的单击事件
procedure Tf_storeout.QuitClick(Sender: TObject);
begin
inherited;
Close;
end;
//取消按钮的单击事件
procedure Tf_storeout.CancelClick(Sender: TObject);
begin
inherited;
ClearEdit;//清空编辑框
Outperson.SetFocus;
IniGrid; //初始化表格
Date.DateTime := Now;//重新设置时间
end;
//自定义过程,用于清空编辑框信息
procedure Tf_storeout.ClearEdit;
var
i: Integer;
begin
For i := 0 to Panel2.ControlCount-1 do
if Panel2.Controls[i]is TEdit then
TEdit(Panel2.Controls[i]).Clear;
Operator.Text := t_main.Operatorname;
Memo.Text := '空';
end;
//自定义过程,用于初始化表格
procedure Tf_storeout.IniGrid;
var
x,y: Integer;
begin
for x:=1 to Reginfo.RowCount-1 do
for y := 0 to reginfo.ColCount-1 do
Reginfo.Cells[y,x]:= '';
Reginfo.RowCount := 2;
end;
//组合框失去焦点时不可见
procedure Tf_storeout.ComstorageExit(Sender: TObject);
begin
inherited;
Comstorage.Visible := False;
end;
//在组合框中按回车键,将当前信息显示在录入表格中
procedure Tf_storeout.ComstorageKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if key = vk_Return then
begin
Reginfo.Cells[storagename,row]:=Trim(ComStorage.Text);
ComStorage.Visible := False;
Reginfo.SetFocus;
if (row = Reginfo.RowCount-1)and(CurrentIsNull = False) then
begin
Reginfo.RowCount := Reginfo.RowCount+1;
end;
end;
end;
//防止在数量字段输入非法字符,只允许输入数字
procedure Tf_storeout.ReginfoKeyPress(Sender: TObject; var Key: Char);
begin
inherited;
if col = num then
begin
if not (Key in ['0'..'9','.',#8]) then
Key := #0
else if (Key = '.')and(Pos('.',Trim(Reginfo.Cells[num,row]))<>0) then
Key := #0;
end;
end;
//处理录入表格的OnSelectCell事件,记录当前单元格的坐标
procedure Tf_storeout.ReginfoSelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
inherited;
row := ARow;
col := ACol;
//如果当前列为条形码,并且物资名称为空,或者当前列为物资名称,条形码为空,或者列为数量,则允许编辑数据,否则不允许编辑数据
if (ACol = barcode)and(Trim(Reginfo.Cells[storename,ARow])='')or(Acol = storename)and(Trim(Reginfo.Cells[barcode,ARow])='')or
(ACol = num) then
begin
Reginfo.Options := Reginfo.Options+[goEditing];
end
else
Reginfo.Options := Reginfo.Options-[goEditing];
end;
//处理表格的OnSetEditText事件,完成物资信息的联想录入,计算总计金额
procedure Tf_storeout.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;
end;
end
else //如果没有匹配的数据,进行提示
begin
RegSource.DataSet := Nil;
Grid.Visible := False;
Application.MessageBox('该物资信息不存在.','提示',64);
reg := True;
Reginfo.Cells[storename,Row]:='';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -