delphi实现执勤表

按周循环排班, 员工人数及值班人数可自定义.

单元文件

unit Unit15;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm15 = class(TForm)
    mmo1: TMemo;
    cbb_Month: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure cbb_MonthChange(Sender: TObject);
  private
    type
      //定义周
      TWeekEnum = (wkSunday, wkMonday, wkTuesday, wkWednesday, wkThursday, wkFriday, wkSaturday);
    const
      //定义每周中各天的值班人数
      weekArr: array[TWeekEnum] of Integer = (2, 1, 1, 1, 1, 1, 2);
      //定义值班员工数
      FEmployeeCount = 13;
    { Private declarations }
  private
    FCurrEmployee : integer;
  public
    { Public declarations }
  end;

var
  Form15: TForm15;

implementation
uses DateUtils;
{$R *.dfm}
procedure TForm15.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  FCurrEmployee := 1; //从第1个员工开始

  //初始化月份
  cbb_Month.Clear;
  for i := 1 to 12 do
    cbb_Month.Items.Add(IntToStr(i));

  cbb_Month.ItemIndex := 0;   //从1月开始排班
  cbb_MonthChange(cbb_Month); //触发排班事件
end;

procedure TForm15.cbb_MonthChange(Sender: TObject);
  //获得当天值班的员工名单
  function getEmployees(const AweekDay : TWeekEnum) : string;
    function getEmployee: string;
    begin
      Result := Format('员工%d ', [FCurrEmployee]);

      Inc(FCurrEmployee);
      if FCurrEmployee > FEmployeeCount then
        FCurrEmployee := 1;
    end;
  var
    i: Integer;
  begin
    Result := '';
    for i := 1 to weekArr[AweekDay] do
      Result := Result + getEmployee;
  end;
var
  i: Integer;
  vWeekDay: TWeekEnum;
  days : integer;
begin
  //当月天数
  days := DaysInAMonth(2013, strtoint(cbb_Month.Text));
  //当月第一天的星期起始数
  vWeekDay := TWeekEnum(DayOfWeek(StrToDateTime('2013' + DateSeparator + cbb_Month.Text + DateSeparator + '01')) - 1);

  //打印排班表
  mmo1.Lines.BeginUpdate;
  try
    mmo1.clear;
    for i := 1 to days do
    begin
      mmo1.Lines.Add(Format( '2013-%s-%d(星期%d), 值班员工:%s',
        [cbb_Month.Text, i, Ord(vWeekDay), getEmployees(vWeekDay)]
        ));

      if vWeekDay = wkSaturday then
        vWeekDay := wkSunday
      else
        vWeekDay := TWeekEnum(ord(vWeekDay) + 1);
    end;
  finally
    mmo1.Lines.EndUpdate;
  end;
end;

end.


窗体文件

object Form15: TForm15
  Left = 0
  Top = 0
  Caption = 'Form15'
  ClientHeight = 562
  ClientWidth = 712
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 106
  TextHeight = 14
  object mmo1: TMemo
    Left = 216
    Top = 72
    Width = 481
    Height = 482
    Lines.Strings = (
      'mmo1')
    ScrollBars = ssBoth
    TabOrder = 0
  end
  object cbb_Month: TComboBox
    Left = 8
    Top = 72
    Width = 145
    Height = 22
    TabOrder = 1
    OnChange = cbb_MonthChange
  end
end


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
全自动排班使用说明 1、在设置好年份与头。 "2、每年1月1日,在中按一个排班周期设置好人员名单,将自动生成全年排班,   第一行就是1月1日上班人员,如使用该时不是1月1日,可以通过调整中   的排班次序来获得之后日期的正确排班。单元格内的多行人员代当天几个班   (如三行就是早中晚),当天增加一个班,就在人员单元格内按[Alt-Enter]换行。" 3、在中,请自行增加本年的节日,假日会以红底黑字增亮显示 4、在中设置好班次与工时。 5、在中可以自动统计每人每月或全年的工作量 "6、对于不规则情况的排班,如换班,可以在当月人员名单中手动更改,另外,如果每天   的班次大于三个,会出现单元格显示不下的情况,这时可以用快捷键来修改字体大小。" "7、快捷键:   Ctrl-q 所有保护状态,只有人员显示栏可以更改   Ctrl-e 取消所有的保护状态,所有栏都可编辑   Ctrl-r 所有人员名称字体加大   Ctrl-t 所有人员名称字体减小 Ctrl-p 下打印排班 Alt-F4 退出EXECL" "8、注意事项:理论上没有限制,但由于单元格显示宽高度有限(字体太小影响显示效果),       本建议适用一个班最多三人,一天最多四个班上班(四行)的情况,不符合       该条件的可以使用《排班(考勤版)》解决。"

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值