📄 ustainfo.pas
字号:
unit uStainfo;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, XPMenu, StdCtrls, Mask, DBCtrls, ADODB, ActnList,
ImgList, DB, Buttons, Grids, DBGrids, jpeg, Menus, DBCtrlsEh, DateUtils,
DBGridEh, ToolWin, TeEngine, Series, TeeProcs, Chart, ExtDlgs, uStadetail;
type
TActState = (asAppend, asEdit, asView);
TfrmStainfo = class(TForm)
tvPer: TTreeView;
sptsta: TSplitter;
ilTree: TImageList;
gbPer: TGroupBox;
btnEdit: TBitBtn;
btnAdd: TBitBtn;
btnPrior: TBitBtn;
btnNext: TBitBtn;
btnDel: TBitBtn;
btnClose: TBitBtn;
btnInqu: TBitBtn;
pmTree: TPopupMenu;
miSearch: TMenuItem;
miAdd: TMenuItem;
miEdit: TMenuItem;
miDel: TMenuItem;
miExpand: TMenuItem;
miClose: TMenuItem;
btnPrint: TBitBtn;
xmStaInfo: TXPMenu;
meoBirth: TMemo;
aqStaInfo: TADOQuery;
rbDetail: TRadioButton;
rbDisplay: TRadioButton;
dgStaInfo: TDBGridEh;
fraStaDetail: TfraStaDetail;
dsStaInfo: TDataSource;
pnlLeft: TPanel;
tvPerv: TTreeView;
imgBtm: TImage;
btnOk: TBitBtn;
btnCancel: TBitBtn;
alSta: TActionList;
actAdd: TAction;
actEdit: TAction;
actOk: TAction;
actSearch: TAction;
actPrior: TAction;
actNext: TAction;
actDel: TAction;
actCancel: TAction;
actPrint: TAction;
actExit: TAction;
ilAct: TImageList;
imgRight: TImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormResize(Sender: TObject);
procedure tvPerGetImageIndex(Sender: TObject; Node: TTreeNode);
procedure tvPerCollapsed(Sender: TObject; Node: TTreeNode);
procedure tvPerGetSelectedIndex(Sender: TObject; Node: TTreeNode);
procedure tvPerClick(Sender: TObject);
procedure miExpandClick(Sender: TObject);
procedure miCloseClick(Sender: TObject);
procedure tvPerChange(Sender: TObject; Node: TTreeNode);
procedure tvPerMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure rbDetailClick(Sender: TObject);
procedure rbDisplayClick(Sender: TObject);
procedure dgStaInfoDblClick(Sender: TObject);
{Act start here}
procedure actEditExecute(Sender: TObject);
procedure actAddExecute(Sender: TObject);
procedure actOkExecute(Sender: TObject);
procedure actSearchExecute(Sender: TObject);
procedure actPriorExecute(Sender: TObject);
procedure actNextExecute(Sender: TObject);
procedure actDelExecute(Sender: TObject);
procedure actCancelExecute(Sender: TObject);
procedure actPrintExecute(Sender: TObject);
procedure actExitExecute(Sender: TObject);
private
{ Private declarations }
procedure InitData;
procedure FreeTree;
{取树节点ADeptNode部门员工信息}
procedure GetStaffs(const ADeptNode: TTreeNode; IsRoot: Boolean);
{树节点上附加员工信息}
procedure GetBrithStaff(IsMonth: Boolean);
procedure SetActState(AActState: TActState);
public
{ Public declarations }
ID: Integer;
sWhr: string;
procedure LoadTree(ATreeView: TTreeView; AQrySql: string = '');
procedure FindStaffs(const AStaID: string);
end;
var
frmStainfo: TfrmStainfo;
implementation
uses uMain, uData, uGlobal, uDep, uPrint, uWaiting;
var
nIndex: Integer;
{$R *.dfm}
procedure TfrmStainfo.InitData;
begin
actOk.Visible := False;
actCancel.Visible := False;
dmPer.OpenSta;
dmPer.OpenExper;
dmPer.OpenFami;
dmPer.OpenAP;
dmPer.OpenTrain;
end;
procedure TfrmStainfo.LoadTree(ATreeView: TTreeView; AQrySql: string);
procedure RecurTree(ANode: TTreeNode; AID: string);
var
aqDeptc: TADOQuery;
i: Integer;
pNode: TTreeNode;
pId: string;
begin
if ATreeView = tvPer then AddStaffs(tvPer, ANode, AID, AQrySql);
aqDeptc := TADOQuery.Create(Self);
dmPer.OpenQuery(aqDeptc, 'select id, dep from dept where pid=' + AID);
if aqDeptc.Eof then Exit;
for i := 0 to aqDeptc.RecordCount - 1 do
begin
pId := aqDeptc.FieldByName('id').AsString;
pNode := ATreeView.Items.AddChildObject(ANode, aqDeptc.FieldByName('dep').AsString, PInteger(aqDeptc.FieldByName('id').AsInteger));
RecurTree(pNode, pId);
aqDeptc.Next;
end;
aqDeptc.Free;
end;
procedure SetBtnState(AState: Boolean);
begin
actEdit.Enabled := AState;
actAdd.Enabled := AState;
actSearch.Enabled := AState;
actPrior.Enabled := AState;
actNext.Enabled := aState;
actDel.Enabled := AState;
actPrint.Enabled := AState;
end;
var
aqDep, aqSta: TADOQuery;
i: Integer;
pId: string;
tnRoot, tnPar: TTreeNode;
begin
if AQrySql = '' then AQrySql := 'select [id], stano, sname, ename, depid from stainfo where 0=0 and dutystate&''''<>''离职''';
ATreeView.Items.Clear;
aqDep := TADOQuery.Create(Self);
dmPer.OpenQuery(aqDep, 'select id, dep from dept where pid=0');
aqSta := TADOQuery.Create(Self);
dmPer.OpenQuery(aqSta, AQrySql);
if aqDep.Eof then
begin
ATreeView.Items.AddFirst(nil, '请先添加部门!');
aqDep.Free;
aqSta.Free;
SetBtnState(False);
Exit;
end;
ATreeView.OnChange := nil;
ATreeView.Items.BeginUpdate;
tnRoot := ATreeView.Items.AddFirst(nil, '公司机构[' + IntToStr(aqSta.RecordCount) + '人]');
Waiting := TWaiting.Create(Self);
Waiting.iMax := aqDep.RecordCount - 1;
Waiting.Show;
for i := 0 to aqDep.RecordCount - 1 do
begin
Waiting.iPosition := i;
Waiting.Update;
pId := aqDep.FieldByName('id').AsString;
tnPar := ATreeView.Items.AddChildObject(tnRoot, aqDep.FieldByName('dep').AsString, PInteger(aqDep.FieldByName('id').AsInteger));
tnPar.ImageIndex := 0;
RecurTree(tnPar, pId);
aqDep.Next;
end;
Waiting.Free;
ATreeView.Items.EndUpdate;
ATreeView.OnChange := tvPerChange;
aqSta.Free;
aqDep.Free;
if ATreeView.Enabled then ATreeView.SetFocus;
{生日员工信息}
meoBirth.Clear;
GetBrithStaff(True);
GetBrithStaff(False);
{选中有数据的节点}
for i := 0 to ATreeView.Items.Count - 1 do
if (ATreeView = tvPer) and (ATreeView.Items[i].Data <> nil) and (ATreeView.Items[i].ImageIndex = 2) then
begin
ATreeView.Selected := ATreeView.Items[i];
fraStaDetail.ID := Integer(PNodeData(ATreeView.Items[i].Data)^.Id);
Exit;
end
else if (ATreeView = tvPerv) and (ATreeView.Items[i].Data <> nil) then
begin
ATreeView.Selected := ATreeView.Items[i];
Exit;
end;
actEdit.Enabled := False;
actDel.Enabled := False;
if ATreeView.Items.Count > 0 then ATreeView.Items.GetFirstNode.Expanded := True;
end;
procedure TfrmStainfo.FormCreate(Sender: TObject);
begin
Log.Write('进入员工信息管理模块');
Application.OnHint := nil;
fraStaDetail.pcSta.ActivePageIndex := 0;
fraStaDetail.FillData;
InitData;
DoubleBuffered := True;
if frmPer.WindowState <> wsMaximized then WindowState := wsMaximized;
end;
procedure TfrmStainfo.FormDestroy(Sender: TObject);
begin
FreeTree;
Application.OnHint := frmPer.OnHint;
end;
procedure TfrmStainfo.FormShow(Sender: TObject);
begin
meoBirth.Visible := App.StaBirth;
{载入员工树信息}
LoadTree(tvPer);
{载入浏览树信息}
LoadTree(tvPerv);
fraStaDetail.SetState(0, True);
fraStaDetail.pcStaChange(fraStaDetail.pcSta);
meoBirth.Left := tvPer.Left;
meoBirth.Top := tvPer.Top + tvPer.Height - meoBirth.Height;
meoBirth.Width := tvPer.Width;
end;
procedure TfrmStainfo.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := True;
if fraStaDetail.aqStaDetail.State in [dsInsert, dsEdit] then
begin
if MessageBox(Handle, '还有信息没有保存,确定要退出吗?', '提示', mb_IconQuestion + mb_YesNo) = idYes then
fraStaDetail.aqStaDetail.CancelBatch
else CanClose := False;
end;
end;
procedure TfrmStainfo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
frmStaInfo := nil;
end;
procedure TfrmStainfo.FormResize(Sender: TObject);
begin
meoBirth.Left := tvPer.Left;
meoBirth.Top := tvPer.Top + tvPer.Height - meoBirth.Height;
meoBirth.Width := tvPer.Width;
end;
procedure TfrmStainfo.miExpandClick(Sender: TObject);
begin
tvPer.FullExpand;
tvPerv.FullExpand;
end;
procedure TfrmStainfo.miCloseClick(Sender: TObject);
begin
tvPer.FullCollapse;
tvPerv.FullCollapse;
end;
procedure Tfrmstainfo.tvPerGetImageIndex(Sender: TObject; Node: TTreeNode);
begin
if not Node.IsFirstNode then
begin
if Node.HasChildren then
begin
if Node.Expanded then
Node.ImageIndex := 1
else Node.ImageIndex := 0;
end;
end
else if Node.Expanded then
Node.ImageIndex := 4
else Node.ImageIndex := 3;
end;
procedure TfrmStainfo.tvPerGetSelectedIndex(Sender: TObject;
Node: TTreeNode);
begin
Node.SelectedIndex := Node.ImageIndex;
end;
procedure TfrmStainfo.FreeTree;
var
i: Integer;
begin
for i := 0 to tvPer.Items.Count - 1 do
if (tvPer.Items[i].data <> nil) and (tvPer.Items[i].ImageIndex = 2) then
Dispose(tvPer.Items[i].data);
end;
procedure TfrmStainfo.SetActState(AActState: TActState);
begin
case AActState of
asAppend, asEdit:
begin
tvPer.Enabled := False;
actEdit.Visible := False;
actAdd.Visible := False;
actSearch.Visible := False;
actPrior.Visible := False;
actNext.Visible := False;
actDel.Visible := False;
actPrint.Visible := False;
actExit.Visible := False;
actOk.Visible := True;
actCancel.Visible := True;
if AActState = asEdit then
begin
actOk.Caption := '确 定';
fraStaDetail.deStano.Color := ViewColor;
fraStaDetail.deStano.ReadOnly := True;
end
else actOk.Caption := '提 交';
end;
asView:
begin
actOk.Caption := '提 交';
actOk.Visible := False;
actCancel.Visible := False;
tvPer.Enabled := True;
actEdit.Visible := True;
actAdd.Visible := True;
actSearch.Visible := True;
actPrior.Visible := True;
actNext.Visible := True;
actDel.Visible := True;
actPrint.Visible := True;
actExit.Visible := True;
end;
end;
end;
procedure TfrmStainfo.tvPerCollapsed(Sender: TObject; Node: TTreeNode);
begin
tvPer.Repaint;
tvPerv.Repaint;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -