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

📄 ustainfo.pas

📁 这是一个门禁系统的应用程序,用 delphi编写,希望与大家交流.
💻 PAS
📖 第 1 页 / 共 4 页
字号:
unit ustainfo;

interface        

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, XPMenu, StdCtrls, Mask, DBCtrls, ADODB,
  ImgList, DB, Buttons, Grids, DBGrids, jpeg, Menus, DBCtrlsEh, DateUtils,
  DBGridEh, ToolWin, TeEngine, Series, TeeProcs, Chart, ExtDlgs;

type
  TSetState = (ssSta, ssExper, ssFami, ssAP, ssTrain);
  TOpeType = (otEdit, otAdd, otCancel);
  TStatType = (stDep, stSex, stLevel, stCap, stAge, stYear, stMonth);

  TfrmStainfo = class(TForm)
    tvPer: TTreeView;
    sptsta: TSplitter;
    ilTree: TImageList;
    gbPer: TGroupBox;
    pcSta: TPageControl;
    tsStainfo: TTabSheet;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Label23: TLabel;
    Label22: TLabel;
    Label24: TLabel;
    pnlimg: TPanel;
    imgi: TImage;
    btnEditi: TButton;
    btnDeli: TButton;
    edtStano: TDBEdit;
    edtName: TDBEdit;
    edtProvi: TDBEdit;
    edtCardno: TDBEdit;
    edtRecno: TDBEdit;
    edtSlevel: TDBEdit;
    edtHealth: TDBEdit;
    edtPcode: TDBEdit;
    edtAddress: TDBEdit;
    dcbLevel: TDBComboBox;
    dcbMarried: TDBComboBox;
    edtDes: TDBEdit;
    dcbDep: TDBComboBox;
    tsExper: TTabSheet;
    tsFami: TTabSheet;
    tsAP: TTabSheet;
    tsTrain: TTabSheet;
    btnEdit: TButton;
    btnAdd: TButton;
    btnPrior: TButton;
    btnNext: TButton;
    btnDel: TButton;
    btnClose: TButton;
    Label25: TLabel;
    Label26: TLabel;
    Label27: TLabel;
    Label28: TLabel;
    Label29: TLabel;
    deDuty: TDBEdit;
    deCom: TDBEdit;
    imgexper: TImage;
    imghome: TImage;
    Label30: TLabel;
    dbeName: TDBEdit;
    Label31: TLabel;
    dbeCom: TDBEdit;
    Label32: TLabel;
    dbeTel: TDBEdit;
    Label33: TLabel;
    Label34: TLabel;
    dbFami: TDBComboBox;
    deTopic: TDBEdit;
    Label35: TLabel;
    Label36: TLabel;
    Label37: TLabel;
    Label38: TLabel;
    dbSort: TDBComboBox;
    Label39: TLabel;
    dmDes: TDBMemo;
    deCourse: TDBEdit;
    Label40: TLabel;
    Label41: TLabel;
    Label42: TLabel;
    deTrcom: TDBEdit;
    deDLimit: TDBEdit;
    Label43: TLabel;
    Label44: TLabel;
    imgtrain: TImage;
    deCerti: TDBEdit;
    Label45: TLabel;
    btnInqu: TButton;
    imgb: TImage;
    imgr: TImage;
    odimg: TOpenDialog;
    pmTree: TPopupMenu;
    pniinqu: TMenuItem;
    pmiadd: TMenuItem;
    pmiedit: TMenuItem;
    pmidel: TMenuItem;
    mnuexpand: TMenuItem;
    mnuclose: TMenuItem;
    btnPrint: TButton;
    aqStaInfo: TADOQuery;
    deInDate: TDBDateTimeEditEh;
    deBarstart: TDBDateTimeEditEh;
    deBarend: TDBDateTimeEditEh;
    dcbSpecial: TDBComboBox;
    edtBarYear: TDBEdit;
    Label46: TLabel;
    deSDate: TDBDateTimeEditEh;
    deEdate: TDBDateTimeEditEh;
    deDep: TDBEdit;
    xmStaInfo: TXPMenu;
    dbDep: TDBComboBox;
    deDate: TDBDateTimeEditEh;
    dteSDate: TDBDateTimeEditEh;
    dteEDate: TDBDateTimeEditEh;
    dgExper: TDBGridEh;
    dgFami: TDBGridEh;
    dgAP: TDBGridEh;
    dgTrain: TDBGridEh;
    dcbSex: TDBComboBox;
    deBirth: TDBDateTimeEditEh;
    cboPoli: TDBComboBox;
    dcbFolk: TDBComboBox;
    tsStat: TTabSheet;
    cbStatTop: TCoolBar;
    Label47: TLabel;
    sbDep: TSpeedButton;
    sbSex: TSpeedButton;
    sbElevel: TSpeedButton;
    sbAge: TSpeedButton;
    sbYear: TSpeedButton;
    sbMonth: TSpeedButton;
    dgStat: TDBGridEh;
    chrStaInfo: TChart;
    Series1: TPieSeries;
    dsStat: TDataSource;
    sbSaveAs: TSpeedButton;
    spdChart: TSavePictureDialog;
    dcbSort: TDBComboBox;
    dcbCap: TDBComboBox;
    sbCap: TSpeedButton;
    Image1: TImage;
    dmDesf: TDBMemo;
    Label48: TLabel;
    deLeftr: TDBEdit;
    meoBirth: TMemo;
    Label49: TLabel;
    dcbSDep: TDBComboBox;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure tvPerGetImageIndex(Sender: TObject; Node: TTreeNode);
    procedure tvPerCollapsed(Sender: TObject; Node: TTreeNode);
    procedure tvPerGetSelectedIndex(Sender: TObject; Node: TTreeNode);
    procedure tsStainfoShow(Sender: TObject);
    procedure btnEditClick(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnInquClick(Sender: TObject);
    procedure btnPriorClick(Sender: TObject);
    procedure btnNextClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure btnPrintClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
    procedure tsExperShow(Sender: TObject);
    procedure tsFamiShow(Sender: TObject);
    procedure tsAPShow(Sender: TObject);
    procedure tsTrainShow(Sender: TObject);
    procedure tvPerClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure btnEditiClick(Sender: TObject);
    procedure btnDeliClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure mnuexpandClick(Sender: TObject);
    procedure mnucloseClick(Sender: TObject);
    procedure tsStatShow(Sender: TObject);
    procedure sbDepClick(Sender: TObject);
    procedure sbSexClick(Sender: TObject);
    procedure sbElevelClick(Sender: TObject);
    procedure sbAgeClick(Sender: TObject);
    procedure sbYearClick(Sender: TObject);
    procedure sbMonthClick(Sender: TObject);
    procedure sbSaveAsClick(Sender: TObject);
    procedure tvPerChange(Sender: TObject; Node: TTreeNode);
    procedure sbCapClick(Sender: TObject);
    procedure tvPerMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure dcbDepExit(Sender: TObject);
  private
    { Private declarations }
    procedure FreeTree;
    procedure SetState(aCon: TSetState = ssSta; aState: Boolean = true); overload;
    procedure SetState(aCon: TSetState = ssSta; aOtype: TOpeType = otEdit); overload;
    procedure AddData(aCon: TSetState = ssSta);
    procedure UpdateData(aCon: TSetState = ssSta);
    procedure AddStatData(aStatType: TStatType = stDep);
    procedure BeforeShow;
    procedure AfterShow(aStatType: TSetState = ssSta);
    procedure GetBrithStaff(IsMonth: Boolean);
  public
    { Public declarations }
    ID: Integer;
    sWhr: string;
    procedure FillData;
    procedure DrawTree(aSql: string = '');
  end;

var
  frmStainfo: TfrmStainfo;
  sm, sd: string;
  iCur: Integer = 0;

type
  Psid = ^TNodeData;
  TNodeData = record
    ID: Integer;
    sNo, sEn: string;
end;

implementation

uses umain, udata, uglobal, udep, uprint;

var
  nIndex: Integer = 0;

{$R *.dfm}

procedure TfrmStainfo.DrawTree(aSql: string);
  procedure SetBtnState(aState: Boolean);
  begin
    btnEdit.Enabled := aState;
    btnAdd.Enabled := aState;
    btnInqu.Enabled := aState;
    btnPrior.Enabled := aState;
    btnNext.Enabled := aState;
    btnDel.Enabled := aState;
    btnPrint.Enabled := aState;
  end;
var
  aqDep, aqSDep, aqSta: TADOQuery;
  i, j, k: Integer;
  Nodeo, Nodep, Nodec: TTreeNode;
  sid: Psid;
begin
  if aSql = '' then aSql := 'select id, stano, [name], ename, dep, sdep from stainfo order by [name]';
  tvPer.Items.Clear;
  aqDep := TADOQuery.Create(self);
  with aqDep do
  begin
    Connection := dmPer.acPer;
    SQL.Text := 'select dep from dept order by ornum';
    Open;
  end;
  aqSDep := TADOQuery.Create(self);
  with aqSDep do
  begin
    Connection := dmPer.acPer;
    SQL.Text := 'select sdep, dep from sdep order by ornum';
    Open;
  end;
  aqSta := TADOQuery.Create(self);
  with aqSta do
  begin
    Connection := dmPer.acPer;
    SQL.Text := aSql;
    Open;
  end;
  if not aqDep.Eof then
  begin
    SetBtnState(true);
    tvPer.AutoExpand := true;
    tvPer.ReadOnly := true;
    Nodeo := tvPer.Items.AddFirst(nil, '公司机构[' + IntToStr(aqSta.RecordCount) + '人]');
    for i := 0 to aqDep.RecordCount - 1 do
    begin
      with aqSta do
      begin
        Filtered := false;
        Filter := 'dep = ' + QuotedStr(aqDep.FieldByName('dep').AsString);
        Filtered := true;
      end;
      Nodep := tvPer.Items.AddChild(Nodeo, aqDep.FieldByName('dep').Asstring+'[' + IntToStr(aqSta.RecordCount) + ']');
      with aqSta do
      begin
        Filtered := false;
        Filter := '(dep = ' + QuotedStr(aqDep.FieldByName('dep').AsString);
        Filter := Filter + ' and sdep = '''')';
        Filter := Filter + ' or (dep = ' + QuotedStr(aqDep.FieldByName('dep').AsString);
        Filter := Filter + ' and sdep = null)';
        Filtered := true;
      end;
      if not aqSta.Eof then
        for j := 0 to aqSta.RecordCount - 1 do
        begin
          New(sid);
          sid^.ID := StrToInt(aqSta.FieldByName('id').AsString);
          sid^.sNo := aqSta.FieldByName('stano').AsString;
          sid^.sEn := aqSta.FieldByName('ename').AsString;
          tvPer.Items.AddChildObject(Nodep, aqSta.FieldByName('name').AsString, sid);
          aqSta.Next;
        end;
      {添加单位b}
      with aqSDep do
      begin
        Filtered := false;
        Filter := 'dep = ' + QuotedStr(aqDep.FieldByName('dep').AsString);
        Filtered := true;
      end;
      if not aqSDep.Eof then
        for j := 0 to aqSDep.RecordCount - 1 do
        begin
          Nodec := tvPer.Items.AddChild(Nodep, aqSDep.FieldByName('sdep').AsString);
          with aqSta do
          begin
            Filtered := false;
            Filter := 'sdep = ' + QuotedStr(aqSDep.FieldByName('sdep').AsString);
            Filtered := true;
          end;
          if not aqSta.Eof then
            for k := 0 to aqSta.RecordCount - 1 do
            begin
              New(sid);
              sid^.ID := StrToInt(aqSta.FieldByName('id').AsString);
              sid^.sNo := aqSta.FieldByName('stano').AsString;
              sid^.sEn := aqSta.FieldByName('ename').AsString;
              tvPer.Items.AddChildObject(Nodec, aqSta.FieldByName('name').AsString, sid);
              aqSta.Next;
            end;
          aqSDep.Next;
        end;
      {添加单位e}
      aqDep.Next;
    end;
  end
  else
  begin
    tvPer.Items.AddFirst(nil, '请先添加部门!');
    SetBtnState(false);
  end;
  aqSta.Close;
  FreeAndNil(aqSta);
  aqDep.Close;
  FreeAndNil(aqDep);
  if tvPer.Enabled then tvPer.SetFocus;

  meoBirth.Clear;
  GetBrithStaff(true);
  GetBrithStaff(false);
  for i := 0 to tvPer.Items.Count - 1 do
    if tvPer.Items[i].Data <> nil then
    begin
      tvPer.Selected := tvPer.Items[i];
      Exit;
    end;
  btnEdit.Enabled := false;
  btnDel.Enabled := false;
  if tvPer.Items.Count > 0 then tvPer.Items.GetFirstNode.Expanded := true;
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
    else
      if Node.Level > 1 then
      begin
        if Node.Data <> nil then
          Node.ImageIndex := 2
        else
          if Node.Expanded then
            Node.ImageIndex := 1
          else
            Node.ImageIndex := 0;
      end
      else
        if Node.Expanded then
          Node.ImageIndex := 1
        else
          Node.ImageIndex := 0;
  end
  else
  begin
    if Node.HasChildren then
      if Node.Expanded then
        Node.ImageIndex := 4
      else
        Node.ImageIndex := 3;
  end;
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 then
      Dispose(tvPer.Items[i].data);
end;

function GetEn(const CnString: string): string;
const
  ChinaCode: array[0..25, 0..1] of Integer = ((1601, 1636), (1637, 1832), (1833, 2077),
    (2078, 2273), (2274, 2301), (2302, 2432), (2433, 2593), (2594, 2786), (9999, 0000),
    (2787, 3105), (3106, 3211), (3212, 3471), (3472, 3634), (3635, 3722), (3723, 3729),
    (3730, 3857), (3858, 4026), (4027, 4085), (4086, 4389), (4390, 4557), (9999, 0000),
    (9999, 0000), (4558, 4683), (4684, 4924), (4925, 5248), (5249, 5589));
var
  i, j, HzOrd: integer;
begin
  i := 1;
  while i <= Length(CnString) do
  begin
    if (CnString[i] >= #160) and (CnString[i + 1] >= #160) then
    begin
      HzOrd := (Ord(CnString[i]) - 160) * 100 + Ord(CnString[i + 1]) - 160;
      for j := 0 to 25 do
      begin
        if (HzOrd >= ChinaCode[j][0]) and (HzOrd <= ChinaCode[j][1]) then
        begin
          Result := Result + char(byte('a') + j);
          break;
        end;
      end;
      Inc(i);
    end else Result := Result + CnString[i];
    Inc(i);
  end;
end;

⌨️ 快捷键说明

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