📄 storeservice.pas
字号:
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 + -