Delphi、C++ Builder & .NET sgcUI 的一部分

sgcPlanner,适用于 Delphi、C++ Builder & .NET 的日程表、甘特图和看板

同一份计划,三种视图。为团队显示为日历,为项目经理显示为甘特图,为执行任务的人显示为看板,全部绑定到同一个数据对象。把卡片拖到“已完成”,甘特图条形和日历颜色会立即随之更新。

VCL、FireMonkey、WinForms、WPF、AvaloniaWin64 上 11 毫秒自动排程 10,000 个任务免费 .NET 社区版包含在 sgcUI Enterprise 中
ProjectPlanner 演示:同样的任务显示在看板、甘特图和日程表上

一份计划,三种视图

十三项功能,服务于团队、项目经理和执行任务的人。标有“注册版”的功能不包含在免费的 .NET 社区版中。

一个数据模型

每个视图都读写同一个 TsgcPlannerData。

一个数据模型

三种视图,一个数据对象,始终同步

日历、项目图表和任务看板不应该互相矛盾。sgcPlanner 可以把任意数量的视图绑定到一个数据对象,因此在看板上拖到“已完成”的卡片会立即在甘特图和日程表中以“已完成”颜色显示,在甘特图中移动的条形会移动日历中的事件,在日程表中创建的事件会变成一张卡片。每次编辑只是一次更新,所以每次放置后各视图只重绘一次。

  • TsgcPlannerData 保存计划,每个视图通过 Data 指向它
  • BarColorMode 设为 pbcStatus 时,甘特图条形按状态着色,与看板一致
  • SyncSelection 通过 SelectedId 共享选中的项目
  • 同一个模型无需任何视图也能工作,可用于服务或单元测试
  • 支持阿拉伯语和希伯来语的从右到左:Scheduler 和 Kanban 的列从右侧开始排列,甘特图任务网格移到右侧,MirrorTimeline 还能让甘特图时间轴从右侧开始
阅读帮助主题
DataSetPlanner 演示:数据集行以及与之绑定的计划视图

一个数据模型

绑定 TDataSet、保存 JSON、渲染 PNG

您的计划本来就保存在数据库里,sgcPlanner 可以直接对接。数据集源把数据对象绑定到任意 TDataSet,例如 FireDAC、TClientDataSet 或 dbExpress,加载项目、资源和依赖关系,跟随数据集的变化,并把在视图中所做的编辑写回。JSON 持久化在所有版本和所有平台上都可用,无界面渲染器可在服务器上把任意视图绘制为 PNG 或 SVG,包括 Linux64。

  • TsgcPlannerSource_DataSet 通过 ItemFields 映射您的字段名
  • SaveToFile 和 LoadFromFile 写入和读取文档化的 JSON 格式
  • TsgcPlannerRenderer 无需窗口即可绘制日程表、甘特图或看板
  • 只使用 DB 单元,因此可用于 VCL、FireMonkey 和控制台应用程序
阅读帮助主题

一个数据模型

撤销和重做对计划所做的每项更改

一次错误的拖放不应该让规划人员白费一下午。数据对象会记录对项目、资源、状态或依赖关系的每一次添加、删除、属性更改和移动,无论由谁发起:视图中的拖动、就地编辑、智能粘贴、排程引擎,还是您自己的代码。绑定到该数据的所有视图共享同一份历史记录,一组更改(例如一次完整的重新排程)可以一步撤销。

  • Data.Undo 提供 Undo、Redo、CanUndo 和 CanRedo
  • BeginGroup 和 EndGroup 把多项更改合并为一步
  • UndoCaption 和 RedoCaption 为菜单项或提示命名下一步操作
  • Limit 限制历史记录的数量,OnChange 用于更新按钮
阅读帮助主题

一个数据模型

直接在视图上输入标题

为了重命名一个项目而打开对话框会拖慢用户。使用就地编辑,按 F2 即可在所选项目上方的小编辑框中修改其标题,在日程表的空白处拖动创建约会后会立即打开标题编辑框,用户拖动后即可输入。日程表、甘特图和看板的工作方式完全相同,每次编辑都会被撤销历史记录下来。

  • InplaceEdit 用于启用它,默认关闭
  • F2 编辑所选项目,Enter 确认,Escape 取消
  • BeginEdit 可从您自己的菜单项打开编辑框
  • IsEditing 告诉窗体快捷键(例如 Ctrl+Z)在用户输入时等待
阅读帮助主题

日程表:会议、人员和会议室

TsgcVCLScheduler 和 TsgcFMXScheduler,以及 .NET 中相同的视图。

TsgcVCLScheduler 日视图
TsgcVCLScheduler 工作周视图
TsgcVCLScheduler 周视图
TsgcVCLScheduler 月视图
TsgcVCLScheduler 议程视图
TsgcVCLScheduler 资源时间线视图

日程表:会议、人员和会议室

七种日历视图,人员和会议室并排显示

用户早已熟悉日历应有的行为,因此日程表提供他们期望的视图:日、工作周、周、月、年、议程和资源时间线。年视图显示十二个小月历,每一天按繁忙程度着色,双击即可打开当天。可以把人员、会议室或机器添加为资源,并为每个资源设置颜色,再按资源对日或周分组,这样诊所可以按列查看每位医生,车间可以查看每个工位。工作时间、可见的日范围和导航都是属性和一行调用。

  • View:psvDay、psvWorkWeek、psvWeek、psvMonth、psvYear、psvAgenda、psvTimeline
  • AddResource 可指定颜色,Options.GroupByResource 让每个资源独占一列
  • DayStartHour、DayEndHour 和 SlotMinutes 决定时间网格
  • GoToday、Prior、Next 和 ScrollToTime 用于浏览

资源时间线视图为注册版功能,在社区版中该视图会显示提示。

阅读帮助主题

日程表:会议、人员和会议室

拖动创建、移动和调整大小

预订会议应该像画出来一样简单。在空闲时段上拖动,日程表就会创建一个事件,您的 OnItemCreate 处理程序可以设置标题或拒绝该时段。把事件拖到另一个时间、日期或资源列,或拖动边缘改变时长,每次移动都会对齐到时段大小。其他视图中的手势相同:甘特图中的条形可以移动和调整大小,看板中的卡片可以在列之间移动。

  • OnItemCreate 为新事件命名或拒绝新事件
  • 移动和调整大小会对齐到 Options.SlotMinutes
  • 预览跟随指针,视图在边缘处滚动,按 Esc 取消
  • 支持鼠标、手写笔和触摸;OnCardMoving 可以否决看板上的移动
阅读帮助主题
月视图,每个周二都有每周二站会

日程表:会议、人员和会议室 仅限注册版

按标准规则生成重复会议

每周站会或每月评审只应输入一次。为项目设置 iCalendar RRULE 后,日程表会在任何视图和任何时间段中显示每一次发生。该规则采用 Google 日历、Outlook 和 Apple 日历使用的 RFC 5545 格式,因此重复事件在导入或导出 .ics 文件时会保留其规则,您的代码也可以向数据对象查询任意日期范围内的发生情况,例如检查会议室是否冲突。

  • RecurrenceRule := 'FREQ=WEEKLY;BYDAY=TU' 每周二重复
  • 项目的 Start 和 Finish 是第一次发生
  • GetOccurrences 返回任意时间段内的发生情况
  • 可通过 iCalendar 文件导入和导出

社区版只显示一次重复项目,并保留其规则。

阅读帮助主题
ICalSubscription 演示:假日日历合并到日程表中

日程表:会议、人员和会议室 仅限注册版

Google 日历、Outlook、CalDAV 和 .ics 导入与导出

您的用户的日程早已存在于其他日历中。TsgcPlannerICalendar 可导入和导出 .ics 文件,这是 Google 日历、Outlook 和 Apple 日历使用的格式。借助 sgcPlannerWS 桥接,订阅可以跟随任何只读的 .ics URL,例如公共假日列表或共享日历,三个同步组件则让计划与一个 Google 日历、一个通过 Microsoft Graph 访问的 Microsoft 365 或 Outlook.com 的 Outlook 日历,或一个 Nextcloud、iCloud、Fastmail、Radicale 或任何其他 CalDAV 服务器的 CalDAV 日历双向保持一致。每个组件只读取上次同步以来的更改,并有清晰的冲突规则。

  • TsgcPlannerICalendar,使用 ImportFromFile 和 ExportToFile
  • TsgcPlannerICalSubscription,使用 URL 和 RefreshInterval,采用 ETag 和 If-Modified-Since
  • TsgcPlannerGoogleSync,使用 CalendarId、Direction 和 AutoSyncInterval
  • TsgcPlannerGraphSync,使用 CalendarId 和 OAuth2 AccessToken,采用 Graph 增量查询
  • TsgcPlannerCalDAVSync,使用 CalendarURL、UserName 和 Password,采用同步令牌和 ETag
  • 发生冲突时以较新的更改为准,OnConflict 可以另作决定

注册版。这些桥接组件还需要注册版 sgcWebSockets;在 .NET 中它们位于 esegece.sgcPlanner.sgcWebSockets。

阅读帮助主题

日程表:会议、人员和会议室

带稍后提醒和忽略的提醒

没有人记得的会议,就没有人会参加。为项目设置开始前若干分钟的提醒后,TsgcPlannerReminders 会找出到期的提醒,并为每一个触发事件。您的应用程序通过自己的定时器调用它,并决定如何显示提醒,是弹出窗口、通知还是声音。重复项目在每次出现时都会再次提醒,提醒可以稍后提醒或忽略。

  • ReminderMinutes(项目属性):-1 表示无,0 表示开始时
  • Check 为每个到期的提醒触发 OnReminder
  • Snooze 和 Dismiss 作用于当前或下一次出现
  • 保存为 JSON,并由撤销历史记录
阅读帮助主题

日程表:会议、人员和会议室

每个项目的时区

分布在多个办公室的团队按各自的当地时间预订会议。每个项目都可以带有自己的时区,因此纽约时间 10:00 安排的通话始终是纽约时间 10:00,而视图会在同一个显示时区中展示所有项目。更改显示时区后,项目会移动到新时区中的墙上时间,而浮动项目和全天项目保持原位。

  • Item.TimeZone 是 Start 和 Finish 的时区,浮动项目为空
  • Data.DisplayTimeZone 是视图显示的时区,为空表示本地时区
  • 只有在显示项目时才进行转换
  • 提醒也按显示时区运行
阅读帮助主题

甘特图:规划项目并跟踪关键路径

TsgcVCLGantt 和 TsgcFMXGantt:任务、链接、时间刻度和排程引擎。

ProjectGantt 演示:带完成到开始和开始到开始链接的 WBS 树

甘特图:规划项目并跟踪关键路径 仅限注册版

带依赖关系和延迟的甘特图

甘特图显示带有摘要行、里程碑的工作分解树,每个条形上都显示进度,并用箭头绘制任务之间的链接。可以用代码链接任务,也可以从一个条形末端拖到另一个条形,可选择完成到开始、开始到开始、完成到完成或开始到完成,并以工作时间添加延迟。时间刻度可以从 5 分钟缩放到数年。

  • 通过 ParentId 实现工作分解,用 UpdateSummaries 汇总
  • AddDependency 配合 TsgcPlannerDependencyKind:pdkFS、pdkSS、pdkFF、pdkSF
  • Lag 按工作日历计算
  • 每个项目都有 Milestone 和 Progress,TimeScale 用于缩放

社区版会存储和保存链接,但不绘制它们,拖动创建链接为注册版功能。

阅读帮助主题
高亮显示关键路径的甘特图,假日按工作日历加阴影

甘特图:规划项目并跟踪关键路径 仅限注册版

自动排程并查看关键路径

一个任务延期时,项目经理现在就需要新的完成日期,而不是花一下午去移动条形。排程引擎会按工作日历把每个任务尽早安排在其前置任务之后,跳过非工作日和假日,计算每个任务的浮动时间,并标出关键路径,即决定项目结束时间的任务链。可以按需运行,也可以在每次编辑后运行,还可以在没有任何视图的数据对象上运行。

  • Schedule 运行引擎,AutoSchedule 在每次编辑后运行
  • ShowCriticalPath 高亮显示决定完成日期的任务
  • TotalSlack 给出任务可延期的工作分钟数
  • 工作日历设置 WorkDays、WorkTime 和 Holidays

在社区版中,Schedule 会引发 EsgcPlannerError,ShowCriticalPath 不起作用。

阅读帮助主题
当前条形下方带有灰色基线条形的甘特图,其中两个任务延期

甘特图:规划项目并跟踪关键路径 仅限注册版

基线让延期一目了然

干系人很少问计划是什么,他们问的是计划偏离了多少。计划获批时保存一个基线,甘特图会在每个当前条形下方绘制一条细条,这样无需阅读任何日期就能看出延期的任务。基线日期随项目一起存储,保存在 JSON 中,并可通过 Microsoft Project XML 交换,您的代码也可以读取它们来生成自己的偏差报告。

  • SetBaseline 一次更新即可复制每个项目的 Start 和 Finish
  • ShowBaseline 绘制基线条形
  • 每个项目都有 BaselineStart 和 BaselineFinish
  • 保存在 JSON 中,并可从 Microsoft Project XML 读取

社区版会存储和保存基线日期,但不绘制它们;SetBaseline 会引发 EsgcPlannerError。

阅读帮助主题

甘特图:规划项目并跟踪关键路径 仅限注册版

与 Microsoft Project 交换计划

项目办公室会收到来自 Microsoft Project 的计划,也会把计划发回去。TsgcPlannerMSProject 可导入和导出 Microsoft Project XML(MSPDI),这是 Project 打开和保存的 XML 格式,包含任务、链接、日历、资源、分配和基线。导入可以替换计划,也可以合并到计划中,格式不正确的文档会引发带行号的错误。在 Win64 开发测量中,导入 10,000 个任务和 15,000 条链接用时 264 毫秒。资源和分配会随任务一起导入。

  • ImportFromFile、ImportFromStream 和 ImportFromString
  • ExportToFile 写入 Microsoft Project 可以打开的 XML
  • ImportMode:pmiReplace(默认)或 pmiMerge
  • 格式错误的 XML 会引发带行号的 EsgcPlannerError

不包含在社区版中,社区版的文件格式为 JSON。

阅读帮助主题

甘特图:规划项目并跟踪关键路径

三层时间刻度和资源直方图

较长的计划在表头上有更多上下文会更易读,人员超负荷也应该在计划发布之前就能看到。甘特图的时间刻度可以显示第三层,例如月份在周之上、周在天之上。图表底部的直方图窗格会为每个刻度绘制每个资源相对其工作时间的工作量,超过 100% 的部分以关键路径颜色绘制。

  • TimeScale.TierCount 设为 3 会增加顶层,TopFormat 设置其标签
  • ShowHistogram 和 HistogramHeight 显示该窗格
  • HistogramResourceId 显示一个资源,或以各自的颜色堆叠显示所有资源
  • 该窗格跟随图表的滚动和缩放
阅读帮助主题

看板:跟随计划的看板

TsgcVCLKanban 和 TsgcFMXKanban:每个状态一列,与甘特图使用相同的数据。

看板,含五个状态列、标签、负责人首字母、截止日期和进度条

看板:跟随计划的看板

团队可以直接使用的任务看板

执行任务的人想要的是看板,而不是图表。看板视图为每个状态构建一列,带有数量徽章和折叠箭头,每张卡片显示标题、标签、资源首字母、截止日期和进度。把卡片放到另一列会改变其在共享数据中的状态和排序,因此甘特图和日程表会立即更新,您的代码也可以在移动发生之前否决任何移动。看板与其他视图一样遵循浅色或深色主题。

  • ColumnSource 根据状态构建列,也可以使用您自己的 Columns
  • CardOptions 选择卡片显示的内容
  • OnCardMoving 接受或拒绝放置
  • 列宽和折叠在所有版本中均可用
阅读帮助主题
TaskBoard 演示:五列,按资源划分的三条泳道,以及一个超出限制的列

看板:跟随计划的看板 仅限注册版

泳道和 WIP 限制让工作保持顺畅

泳道按资源、父任务或标签把看板分成水平条带,使每个人或每个史诗都有一行,在制品限制则为每一列设置上限,并跨所有泳道计数。在警告模式下,超过限制的列会被标记;在阻止模式下,会突破限制的卡片无法放下。在 Win64 上,布局 8 列 6 条泳道共 5,000 张卡片用时 5 毫秒。

  • SwimlaneBy:pslResource、pslParent 或 pslTag
  • 每个列条目都有 WIPLimit,0 表示无限制
  • WIPMode:pwmWarn 标记该列,pwmBlock 拒绝放置
  • 泳道和限制与其他视图使用相同的数据

社区版会忽略 SwimlaneBy 和 WIP 限制;列、列宽和折叠可用。

阅读帮助主题

无障碍

面向屏幕阅读器的 UI Automation、键盘和高对比度,无需任何设置。

无障碍

规划器的每个视图都无需鼠标即可阅读和操作

sgcPlanner 将日程表、时间线、甘特图和看板视图向 Microsoft UI Automation 公开:日期、泳道和列、带时间的项目,以及甘特图依赖关系。所有用鼠标拖动完成的操作也都可以用键盘完成。

  • 日程表和时间线:Ins 在焦点时间槽添加项目,Del 删除,Ctrl+方向键移动项目,Ctrl+Shift+方向键更改其结束时间
  • 甘特图:Ctrl+Left 和 Ctrl+Right 将任务移动一个刻度,Ctrl+K 开始一个依赖关系,Ctrl+Shift+K 在焦点任务的依赖关系之间循环
  • 看板:Ctrl+Left 和 Ctrl+Right 将卡片移到相邻列,Ctrl+Up 和 Ctrl+Down 重新排序
  • 在 Windows 高对比度主题下,应用程序的项目颜色被带轮廓的系统颜色取代,因此没有任何信息仅依赖颜色

无障碍功能在每个版本中默认开启,包括免费的社区版,可用于 VCL(Delphi 和 C++Builder 从 Delphi 7 到 Delphi 13 的每个版本)、Windows 上的 FireMonkey,以及 WinForms、WPF 和 Avalonia。在 Delphi 和 C++Builder 中,AccessibleName 和 AccessibleDescription 设置向 UI Automation 公开的名称和说明,在 .NET 中,各框架标准的无障碍名称和帮助文本起同样的作用。请参见无障碍符合性报告。

阅读帮助主题

查看 sgcPlanner 的实际效果

sgcUI 套件演示中的 sgcPlanner:使用内置模拟数据、可离线运行的完整应用程序。

基于真实工作负载的实测数据

Win64 发布版本在 1920 x 1080 下的开发测量。Win32 大约慢 1.5 到 1.7 倍。

测量项结果条件
自动排程 10,000 个任务(1,000 个摘要,3 层),含 15,000 条链接和 30 个假日,包括关键路径11 毫秒Win64 发布版本
滚动含 15,000 条链接的 10,000 个任务时的甘特图帧11 毫秒Win64 发布版本,1920 x 1080
8 列 6 条泳道共 5,000 张卡片的看板布局5 毫秒Win64 发布版本
含 2,000 个定时项目的日程表周视图,布局1 毫秒Win64 发布版本
从 MS Project XML 导入 10,000 个任务和 15,000 条链接264 毫秒Win64 发布版本

来源:记录这些数据的帮助主题。

谁在用 sgcPlanner 构建应用

项目与工程软件

项目办公室和工程公司

把项目规划为工作分解,链接任务,让引擎按公司日历排程,同时关键路径显示决定完成日期的因素。在批准时保存基线,延期情况就会显示在每个条形下方。计划来自 Microsoft Project,也以 XML 形式返回给它,同样的任务还会显示在团队的看板上。

  • 带依赖关系的甘特图
  • 自动排程和关键路径
  • 基线
  • MS Project XML
运行 ProjectGantt 演示

预订和预约系统

诊所、车间和会议室预订

把每位医生、每个工位或每个会议室显示为单独的一列,让员工通过在空闲时段上拖动来预订。重复预约来自标准规则,公共假日通过 .ics 订阅获取,Google 日历桥接让从业人员自己的日历保持同步。数据集源把每次预订直接写回您的表。员工在每个视图中看到的预订都相同。

  • 日程表视图和资源
  • 重复
  • DataSet 绑定
  • Google 日历同步
运行 TeamScheduler 演示

任务跟踪和服务台工具

敏捷团队和服务台

为团队提供一个按人员划分泳道、按列设置在制品限制的看板,并为经理提供同一批工单的甘特图。把卡片移到“已完成”会立即改变条形和日历事件的颜色,因为三个视图共享同一个数据对象。用于夜间邮件的状态图片可以在服务器上无界面渲染。

  • 看板
  • 泳道和 WIP 限制
  • 同步视图
  • 无界面渲染
运行 TaskBoard 演示

几行代码实现团队日程表

Delphi、C++ Builder 和 C# 中的同一套 API:两个人、由重复规则生成的每日站会,以及允许用户拖动创建新会议的周视图。

VCL 周日程表:两个人作为资源,由重复规则生成每日站会,拖动创建。

unit frmTeam;

interface

uses
  Classes, Controls, Forms, SysUtils,
  sgcUICore_Theme, sgcPlanner_Data, sgcPlanner_Scheduler,
  sgcPlanner_Scheduler_VCL;

type
  TFormTeam = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FData: TsgcPlannerData;
    FScheduler: TsgcVCLScheduler;
    procedure DoItemCreate(Sender: TObject; const aStart, aFinish: TDateTime;
      const aResourceId: string; var aTitle: string; var aAccept: Boolean);
  end;

implementation

procedure TFormTeam.FormCreate(Sender: TObject);
var
  vItem: TsgcPlannerItem;
  vMonday: TDateTime;
begin
  vMonday := Date - DayOfWeek(Date) + 2;
  FData := TsgcPlannerData.Create(Self);
  FData.Resources.AddResource('ana', 'Ana').Color := $FF2563EB;
  FData.Resources.AddResource('luis', 'Luis').Color := $FF0F766E;
  // a daily stand-up from an iCalendar recurrence rule
  vItem := FData.AddItem('standup');
  vItem.Title := 'Daily stand-up';
  vItem.Start := vMonday + EncodeTime(9, 0, 0, 0);
  vItem.Finish := vMonday + EncodeTime(9, 15, 0, 0);
  vItem.RecurrenceRule := 'FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR';
  vItem.Resources := 'ana,luis';
  vItem := FData.AddItem('review');
  vItem.Title := 'Design review';
  vItem.Start := vMonday + 1 + EncodeTime(14, 0, 0, 0);
  vItem.Finish := vMonday + 1 + EncodeTime(15, 30, 0, 0);
  vItem.Resources := 'ana';

  FScheduler := TsgcVCLScheduler.Create(Self);
  FScheduler.Parent := Self;
  FScheduler.Align := alClient;
  FScheduler.Data := FData;
  FScheduler.Theme := utDark;
  FScheduler.View := psvWeek;
  FScheduler.Options.DayStartHour := 8;
  FScheduler.Options.DayEndHour := 18;
  FScheduler.Options.GroupByResource := True;
  FScheduler.OnItemCreate := DoItemCreate;
  FScheduler.ScrollToTime(vMonday + EncodeTime(8, 0, 0, 0));
end;

procedure TFormTeam.DoItemCreate(Sender: TObject; const aStart,
  aFinish: TDateTime; const aResourceId: string; var aTitle: string;
  var aAccept: Boolean);
begin
  // the user dragged an empty slot: name the new meeting
  aTitle := 'New meeting';
  aAccept := True;
end;

end.

阅读帮助主题 →

C++ Builder 中的同一个日程表。

#include <vcl.h>
#pragma hdrstop
#include <System.DateUtils.hpp>
#include "sgcUICore_Theme.hpp"
#include "sgcPlanner_Data.hpp"
#include "sgcPlanner_Scheduler.hpp"
#include "sgcPlanner_Scheduler_VCL.hpp"

class TTeamHandlers : public TObject
{
public:
	// the user dragged an empty slot: name the new meeting
	void __fastcall ItemCreate(TObject *Sender, const TDateTime aStart,
		const TDateTime aFinish, const UnicodeString aResourceId,
		UnicodeString &aTitle, bool &aAccept)
	{
		aTitle = "New meeting";
		aAccept = true;
	}
};

void __fastcall BuildTeamScheduler(TForm *Form)
{
	static TTeamHandlers *vHandlers = new TTeamHandlers();
	TDateTime vMonday = Date() - DayOfWeek(Date()) + 2;
	TsgcPlannerData *vData = new TsgcPlannerData(Form);
	vData->Resources->AddResource("ana", "Ana")->Color = 0xFF2563EB;
	vData->Resources->AddResource("luis", "Luis")->Color = 0xFF0F766E;
	// a daily stand-up from an iCalendar recurrence rule
	TsgcPlannerItem *vItem = vData->AddItem("standup");
	vItem->Title = "Daily stand-up";
	vItem->Start = vMonday + EncodeTime(9, 0, 0, 0);
	vItem->Finish = vMonday + EncodeTime(9, 15, 0, 0);
	vItem->RecurrenceRule = "FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR";
	vItem->Resources = "ana,luis";
	vItem = vData->AddItem("review");
	vItem->Title = "Design review";
	vItem->Start = vMonday + 1 + EncodeTime(14, 0, 0, 0);
	vItem->Finish = vMonday + 1 + EncodeTime(15, 30, 0, 0);
	vItem->Resources = "ana";

	TsgcVCLScheduler *vScheduler = new TsgcVCLScheduler(Form);
	vScheduler->Parent = Form;
	vScheduler->Align = alClient;
	vScheduler->Data = vData;
	vScheduler->Theme = utDark;
	vScheduler->View = psvWeek;
	vScheduler->Options->DayStartHour = 8;
	vScheduler->Options->DayEndHour = 18;
	vScheduler->Options->GroupByResource = true;
	vScheduler->OnItemCreate = vHandlers->ItemCreate;
	vScheduler->ScrollToTime(vMonday + EncodeTime(8, 0, 0, 0));
}

阅读帮助主题 →

适用于 WinForms 的 C# 版本。

using System;
using System.Windows.Forms;
using esegece.sgcPlanner;
using esegece.sgcUICore;

namespace TeamPlanner
{
    internal class MainForm : Form
    {
        public MainForm()
        {
            Text = "Team scheduler";
            DateTime monday = DateTime.Today.AddDays(-(((int)DateTime.Today.DayOfWeek + 6) % 7));

            var data = new TsgcPlannerData();
            data.Resources.AddResource("ana", "Ana").Color = 0xFF2563EB;
            data.Resources.AddResource("luis", "Luis").Color = 0xFF0F766E;

            // a daily stand-up from an iCalendar recurrence rule
            var item = data.AddItem("standup");
            item.Title = "Daily stand-up";
            item.Start = monday.AddHours(9);
            item.Finish = monday.AddHours(9).AddMinutes(15);
            item.RecurrenceRule = "FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR";
            item.Resources = "ana,luis";

            item = data.AddItem("review");
            item.Title = "Design review";
            item.Start = monday.AddDays(1).AddHours(14);
            item.Finish = monday.AddDays(1).AddHours(15.5);
            item.Resources = "ana";

            var scheduler = new TsgcWinFormsScheduler { Dock = DockStyle.Fill, Data = data, Theme = TsgcUITheme.utDark };
            scheduler.View = TsgcPlannerSchedulerViewKind.psvWeek;
            scheduler.Options.DayStartHour = 8;
            scheduler.Options.DayEndHour = 18;
            scheduler.Options.GroupByResource = true;
            // the user dragged an empty slot: name the new meeting
            scheduler.OnItemCreate = (object sender, DateTime start, DateTime finish, string resourceId,
                ref string title, ref bool accept) => { title = "New meeting"; accept = true; };
            Controls.Add(scheduler);
            scheduler.ScrollToTime(monday.AddHours(8));
        }

        [STAThread]
        static void Main() { Application.EnableVisualStyles(); Application.Run(new MainForm()); }
    }
}
dotnet add package esegece.sgcPlanner.WinForms

阅读帮助主题 →

Delphi 中的甘特图

三个任务、两条链接、一个基线、关键路径和排程引擎(此处的甘特图功能均为注册版功能)。

unit frmGantt;

interface

uses
  Classes, Controls, Forms, SysUtils,
  sgcUICore_Theme, sgcPlanner_Data, sgcPlanner_Gantt, sgcPlanner_Gantt_VCL;

type
  TFormGantt = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

implementation

procedure TFormGantt.FormCreate(Sender: TObject);
var
  vData: TsgcPlannerData;
  vGantt: TsgcVCLGantt;
  vItem: TsgcPlannerItem;
  vStart: TDateTime;
begin
  vStart := Date + EncodeTime(8, 0, 0, 0);
  vData := TsgcPlannerData.Create(Self);
  vData.ProjectStart := vStart;
  vItem := vData.AddItem('1');
  vItem.Title := 'Design';
  vItem.Start := vStart;
  vItem.Finish := vStart + 3 + EncodeTime(9, 0, 0, 0);
  vItem.Progress := 100;
  vItem := vData.AddItem('2');
  vItem.Title := 'Build';
  vItem.Start := vStart;
  vItem.Finish := vStart + 6 + EncodeTime(9, 0, 0, 0);
  vItem.Progress := 40;
  vItem := vData.AddItem('3');
  vItem.Title := 'Release';
  vItem.Start := vStart;
  vItem.Finish := vStart;
  vItem.Milestone := True;
  // Build starts when Design finishes, Release when Build finishes
  vData.Dependencies.AddDependency('1', '2');
  vData.Dependencies.AddDependency('2', '3');

  vGantt := TsgcVCLGantt.Create(Self);
  vGantt.Parent := Self;
  vGantt.Align := alClient;
  vGantt.Data := vData;
  vGantt.Theme := utDark;
  vGantt.ShowCriticalPath := True;
  vGantt.SetBaseline;
  // the schedule engine moves the tasks to honour the links
  vGantt.Schedule;
end;

end.

重复规则以及甘特图的 Schedule 和 SetBaseline 调用为注册版功能。免费社区版只显示一次重复项目。

运行 sgcPlanner 演示

编译好的演示可执行文件位于 sgcUI_bin.zip,无需安装。每个演示的源代码都随软件包提供,涵盖 Delphi、C++ Builder 和 .NET。

ProjectPlanner

ProjectPlanner

甘特图、看板和日程表基于同一个数据对象,始终同步。

TeamScheduler

TeamScheduler

含年视图的七种视图、资源分组、重复会议、提醒、时区、撤销和重做以及就地编辑。

仅限注册版 ProjectGantt

链接、自动排程、关键路径、基线、Microsoft Project XML、三层时间刻度和资源直方图。

仅限注册版 TaskBoard

看板上的状态列、按资源划分的泳道和 WIP 限制。

DataSetPlanner

DataSetPlanner

项目、资源和依赖关系绑定到 TDataSet,编辑写回。

仅限注册版 ICalendarSync

导入和导出 .ics 文件。

ICalSubscription

仅限注册版 ICalSubscription

跟随只读 .ics URL,例如假日列表。

仅限注册版 GoogleCalendarSync

通过 sgcWebSockets 与一个 Google 日历双向同步。

仅限注册版 OutlookCalendarSync

通过 Microsoft Graph 与一个 Microsoft 365 或 Outlook.com 的 Outlook 日历双向同步。

仅限注册版 CalDAVSync

与一个 CalDAV 日历双向同步,例如 Nextcloud、iCloud、Fastmail 或 Radicale。

HeadlessReport

无需窗口即可把视图渲染为图像文件。

PlannerFMX

FireMonkey 应用程序中的三种视图。

预编译演示

每款 sgcUI 产品的可直接运行的可执行文件,无需安装。

下载 sgcUI_bin.zip →

sgcPlanner 包含在哪些版本中

sgcPlanner 是 sgcUI 企业版的一部分,也可单独购买。sgcPlanner 同样包含在全场授权套件中。

sgcPlanner 单品包

€249 / 开发者,含完整源代码,1 年更新。

购买 sgcPlanner → 查看价格 →

sgcUI Enterprise

全部 14 款 sgcUI 产品,起价 €699。

查看 Enterprise →

.NET

.NET 版本价格相同。免费社区版在 NuGet 上提供,名为 esegece.sgcPlanner.Community。

查看价格 →

免费社区版是 NuGet 上的 esegece.sgcPlanner.Community。下表列出了其包含的内容。

功能社区版(免费)注册版
日程表的日、工作周、周、月和议程视图✓✓
甘特图任务树、摘要、里程碑和进度✓✓
看板的列、折叠和卡片选项✓✓
每个视图都支持拖放✓✓
DataSet 绑定、JSON、主题以及无界面 PNG 和 SVG✓✓
日程表年视图✓✓
提醒和每个项目的时区✓✓
撤销和重做、就地编辑✓✓
三层甘特图时间刻度和资源直方图✓✓
重复−✓
日程表资源时间线视图−✓
依赖关系箭头和拖动创建链接−✓
自动排程、关键路径和基线−✓
泳道和 WIP 限制−✓
iCalendar 和 Microsoft Project XML−✓
Google 日历、Outlook 和 CalDAV 同步以及 iCal 订阅(sgcPlannerWS)−✓

支持的框架与平台

sgcPlanner 中的组件

组件功能
TsgcPlannerData共享模型:项目、资源、状态、依赖关系和工作日历。
TsgcVCLScheduler, TsgcFMXScheduler日、工作周、周、月、年、议程和时间线视图。
TsgcVCLGantt, TsgcFMXGantt任务树、条形、链接、排程引擎、关键路径和基线。
TsgcVCLKanban, TsgcFMXKanban状态列、卡片、泳道和 WIP 限制。
TsgcPlannerSource_DataSet来自 TDataSet 的计划。
TsgcPlannerICalendar, TsgcPlannerMSProject读写 iCalendar .ics 文件和 Microsoft Project XML(注册版)。
TsgcPlannerRenderer无界面 PNG 和 SVG 输出。
TsgcPlannerGoogleSync, TsgcPlannerGraphSync, TsgcPlannerCalDAVSync, TsgcPlannerICalSubscription (sgcPlannerWS)通过 sgcWebSockets 实现与 Google 日历、通过 Microsoft Graph 与 Outlook 和 Microsoft 365、与 CalDAV 服务器的双向同步,以及 iCal 订阅。仅限注册版。
目标组件平台
Delphi 7 至 13,VCL日程表、甘特图、看板Win32 和 Win64
Delphi XE6 至 13,FireMonkeyTsgcFMXScheduler, TsgcFMXGantt, TsgcFMXKanbanWindows、macOS、iOS 和 Android
C++ Builder 2007 至 13VCL 和 FMX 视图生成的 .hpp 头文件和静态库
Delphi 10.2 至 13,框架中立数据、引擎、JSON、iCalendar、Microsoft Project、渲染器Linux64,例如在服务器上渲染计划
.NET Framework 4.7.2、.NET 8、9 和 10TsgcWinFormsScheduler、Gantt 和 Kanban,以及对应的 WPF 和 Avalonia 版本WinForms、WPF、Avalonia,无界面 PNG 和 SVG

常见问题解答

可以,在注册版中。TsgcPlannerMSProject 读取和写入 Microsoft Project XML(MSPDI),包含任务、链接、日历、资源、分配和基线。支持的是 XML 格式,因此请在 Project 中把计划另存为 XML。

可以,而且是双向的。Google 日历通过 TsgcPlannerGoogleSync 同步,Microsoft 365 和 Outlook.com 的 Outlook 日历通过 Microsoft Graph 使用 TsgcPlannerGraphSync 同步,CalDAV 日历(例如 Nextcloud、iCloud、Fastmail 或 Radicale)则使用 TsgcPlannerCalDAVSync 同步。任何发布 .ics URL 的其他日历都可以用 TsgcPlannerICalSubscription 以只读方式跟随,.ics 文件则可用 TsgcPlannerICalendar 导入和导出。这些桥接需要注册版和 sgcWebSockets。

帮助中公布了 Win64 发布版本的开发测量:自动排程 10,000 个任务和 15,000 条链接用时 11 毫秒,滚动同样 10,000 个任务时的一帧用时 11 毫秒。5,000 张卡片的看板布局用时 5 毫秒。Win32 大约慢 1.5 到 1.7 倍。

三种视图及其拖放、摘要、里程碑、进度、工作日历、DataSet 绑定、JSON 和无界面输出。重复、自动排程、绘制的依赖关系、关键路径、基线、时间线视图、泳道、WIP 限制、iCalendar、Microsoft Project XML 和桥接为注册版功能。

可以。TsgcPlannerSource_DataSet 把数据对象绑定到任意 TDataSet,例如 FireDAC、TClientDataSet 或 dbExpress。它通过字段映射加载项目、资源和依赖关系,跟随数据集的变化,并把在视图中所做的编辑写回。

可以,通过 FireMonkey:TsgcFMXScheduler、TsgcFMXGantt 和 TsgcFMXKanban 自 Delphi XE6 起可在 Windows、macOS、iOS 和 Android 上运行。在 Linux64 上,数据模型、引擎、JSON、iCalendar、Microsoft Project XML 和渲染器自 Delphi 10.2 起可编译。

可以。TsgcPlannerRenderer 无需窗口即可把数据对象的日程表、甘特图或看板绘制为 PNG 或 SVG,可在 Windows 或 Linux64 上使用浅色或深色主题。

sgcPlanner 帮助

3,000+开发者
20+年
761+组件
30+API 集成
5平台
30 天退款保证不满意?可在购买后 30 天内申请全额退款。 查看退款政策

立即试用 sgcPlanner

sgcUI 试用版包含 sgcPlanner 和所有其他 sgcUI 产品。