认识 sgcChat。
应用程序内置的聊天。
一个以格式化 Markdown 流式输出答案的 AI 助手,以及一个带有在线状态、输入提示、已读回执和表情回应的团队聊天。适用于 Delphi、C++ Builder 和 .NET 的原生控件。
- VCL
- FireMonkey
- WinForms
- WPF
- Avalonia
- 无界面 SVG 和 PNG
今天我们发布 sgcUI 2026.11。它新增了一款产品 sgcChat,可在您自己的应用程序中加入 AI 助手聊天和团队聊天,同时补全了整个套件中的一系列小缺口:可接收用户输入的仪表盘、双向跟随数据集的数据绑定、发布为网页的仪表板、计划器中的 Outlook 重复系列、报表中的脚本等。
sgcChat 是第十六款 sgcUI 产品。它可在 Delphi 和 C++ Builder 的 VCL 与 FireMonkey 上运行,也可在 .NET 的 WinForms、WPF 和 Avalonia 上运行,并包含在 sgcUI Enterprise 和 All-Access 中。它不作为单独的包销售。
sgcChat:应用程序中的 AI 助手
AI 的答案是一小段一小段到达的,用户希望在答案生成的同时就能阅读。TsgcChatAI 将一次对话绑定到提供者,发送历史记录和系统提示词,并在每一段到达时立即以格式化 Markdown 显示。提供者在工作线程中运行,因此窗口始终保持响应,聊天面板还为每个答案提供停止、重新生成以及编辑后重新发送的功能。
- 流式 Markdown,答案生成时显示光标。
- 工具调用卡片,显示工具名称、参数、结果,以及运行中、已完成或出错状态。
- 对话历史可保存为 JSON 并从 JSON 加载。
sgcChat 不会将您绑定到某一家 AI 厂商。TsgcChatAIProvider_AIChat 连接到 sgcWebSockets 的 TsgcAIChat,后者可对接 OpenAI、Anthropic、Gemini、DeepSeek、Ollama、Grok 和 Mistral。TsgcChatAIProvider_UICore 使用所有 sgcUI 产品共享的 AI 提供者层,而 TsgcChatAIEventProvider 允许您在事件中从自己的后端进行流式输出。下面是 TsgcChatAI 绑定使用 OpenAI 应答的方式:
uses
SysUtils, Classes,
// sgcWebSockets
sgcAI, sgcAI_Chat,
// sgc
sgcChat_AI, sgcChatWS_AI;
procedure UseOpenAI(aAI: TsgcChatAI; const aApiKey: string);
var
oChat: TsgcAIChat;
oProvider: TsgcChatAIProvider_AIChat;
begin
oChat := TsgcAIChat.Create(aAI.Owner);
oChat.Provider := aicpOpenAI;
oChat.ChatOptions.ApiKey := aApiKey;
oChat.ChatOptions.Model := 'gpt-4o-mini';
oProvider := TsgcChatAIProvider_AIChat.Create(aAI.Owner);
oProvider.Chat := oChat;
aAI.Model := oChat.ChatOptions.Model;
aAI.Provider := oProvider;
end;
修改 Provider 即可改用 Anthropic、Gemini、DeepSeek、Ollama、Grok 或 Mistral。完整的快速入门请参阅 sgcChat 帮助。
与 Claude、OpenAI、Gemini 及其他 LLM 提供程序的通信需要 sgcWebSockets,All-Access 中已包含。TsgcChatAIProvider_AIChat 位于 sgcChatWS 桥接包中(.NET:esegece.sgcChat.sgcWebSockets)。如果不使用 sgcWebSockets,可通过 TsgcChatAIEventProvider 让您自己的代码调用任何 AI 服务。
sgcChat:运行在您自己服务器上的团队聊天
客服台、外勤团队和内部工具都需要一个用户本来就会用的聊天。聊天视图按作者将消息分组,并显示头像和名称,显示谁在线、离开或忙碌,显示谁正在输入,并将每条消息标记为已发送、已送达或已读。用户可以回复消息、对消息做出回应、编辑或删除自己的消息,还可以发送带有图片缩略图和文件标签的附件。
聊天不依赖某一台特定的服务器。TsgcChatEventTransport 会把每条消息、输入状态变化、回执和回应,以有文档说明的 JSON 帧交给您的代码。借助 sgcWebSockets,TsgcChatTransport_WebSocket 负责连接客户端,TsgcChatServer_WebSocket 则在同一频道的客户端之间转发消息、维护每位用户的在线状态,并把最近的消息发送给稍后加入的用户。中继可以在服务或控制台程序中运行:
function CreateRelay(aOwner: TComponent; aPort: Integer)
: TsgcChatServer_WebSocket;
var
oServer: TsgcWebSocketServer;
begin
oServer := TsgcWebSocketServer.Create(aOwner);
oServer.Port := aPort;
// the relay needs no main thread
oServer.NotifyEvents := neNoSync;
Result := TsgcChatServer_WebSocket.Create(aOwner);
Result.Server := oServer;
// the last 100 messages of every channel go to late joiners
Result.HistoryCount := 100;
oServer.Active := True;
end;
以上两个 Delphi 示例均原样复制自 sgcChat 帮助示例,这些示例已使用 Delphi 13 (Win32) 针对 sgcUI 和 sgcWebSockets 源代码编译通过。
WebSocket 团队聊天需要 sgcWebSockets,All-Access 中已包含。TsgcChatTransport_WebSocket 和 TsgcChatServer_WebSocket 位于 sgcChatWS 桥接包中(.NET:esegece.sgcChat.sgcWebSockets)。如果不使用 sgcWebSockets,TsgcChatEventTransport 可将聊天连接到任何后端。
sgcChat:原生 Markdown 查看器
聊天气泡背后的引擎本身也是一个独立的控件。TsgcVCLMarkdownViewer 和 TsgcFMXMarkdownViewer 可显示标题、强调、引用、列表、任务列表、表格、链接和图片,并对 Pascal、C#、C++、JavaScript、Python、JSON、SQL 等语言的代码块进行语法高亮。AppendMarkdown 会在文本到达时追加内容,用户可以选择并复制文本,或通过复制按钮复制整个代码块。可用于发行说明、帮助页面以及以 Markdown 编写的消息。
sgcChat 与套件其余部分无缝契合
聊天遵循 sgcUI 的浅色、深色和 Fluent 主题。阿拉伯语或希伯来语的对话会镜像显示,控件文本已翻译为 sgcUI 的 12 种语言。在 Windows 上,聊天视图是供屏幕阅读器读取的消息列表,并包含每条消息的作者和时间。对话模型、Markdown 文档和视图都不依赖 VCL 或 FireMonkey,因此服务可以在没有窗口的情况下将对话或 Markdown 文档渲染为 SVG 或 PNG,在 Linux64 上同样如此。
组件包括 TsgcVCLChatPanel、TsgcVCLChatView、TsgcVCLChatInput 和 TsgcVCLMarkdownViewer,FireMonkey 使用带 TsgcFMX 前缀的同一组组件,WinForms、WPF 和 Avalonia 则有相同的控件,例如 TsgcWinFormsChatPanel、TsgcWpfChatPanel 和 TsgcAvaloniaChatPanel。演示程序涵盖 AI 助手、团队聊天客户端及其中继服务器,以及 Markdown 查看器,适用于 VCL、FireMonkey、C++ Builder、WinForms、WPF 和 Avalonia。
sgcChat 作为 sgcUI Enterprise 和 All-Access 套装的一部分销售,后者还包含用于 AI 提供者和 WebSocket 桥接的 sgcWebSockets。请参阅 sgcChat 页面和功能矩阵。
整个套件:输入、数据与输出
本次发布的其余部分补全了各产品中的一些小缺口:可接收用户输入的控件、双向跟随数据集的数据绑定,以及更多将界面输出到应用程序之外的方式。
sgcGauges:输入型仪表盘与皮肤
四种输入型仪表盘 TsgcVCLKnobGauge、TsgcVCLSliderGauge、TsgcVCLToggleSwitchGauge 和 TsgcVCLPushButtonGauge(FireMonkey 使用 TsgcFMX,WinForms、WPF 和 Avalonia 使用相同的名称),让用户通过鼠标、触摸、滚轮或键盘设置数值。OnUserChange 仅在用户进行更改时触发,屏幕阅读器会将它们识别为滑块、切换开关和按钮。sgcGauges 现在共有十六种仪表盘类型,其中包括下文 HMI 套件的水箱和过程符号仪表盘。
Skin 为每个仪表盘带来全新外观:Classic、Modern、Industrial、ISA101、Dark,或使用 sgcGaugesRegisterSkin 注册的自定义皮肤。TsgcGaugeDataLink 可在任意仪表盘上显示数据集字段,并将输入型仪表盘的更改写回该字段。请参阅 sgcGauges 功能和输入型仪表盘帮助。
实时与双向数据绑定
各产品会在 Delphi 的 TDataSet(.NET 中为 DataTable)发生变化时同步跟随,而支持编辑的产品会把用户的更改写回:
- sgcPlanner:
TsgcPlannerSource_DataSet通过OnWriteBack报告每次写入,可在OnBeforeWriteBack中拒绝写入,并在写入被拒绝或失败时让计划器恢复到数据的状态。Throttle会合并快速的连续更改,FollowCursor会选中当前记录对应的条目。 - sgcDiagram:
TsgcDiagramDataBinding按 Id 跟随节点和连线数据集,保存节点的位置和大小,并通过WriteBack将用户添加、移动、编辑或删除的节点和连线写回数据。 - sgcPivotGrid 和 sgcDashboard:数据透视的 DataSet 源和仪表板数据源会跟随数据集,并通过
Throttle将快速的连续更改合并为一次刷新。
sgcDiagram、sgcPivotGrid、sgcGauges 和 sgcDashboard 在 .NET 中具有相同的绑定。sgcUI 功能矩阵列出了各版本所包含的内容。
sgcPlanner:Outlook 系列、Google 提醒与容量
TsgcPlannerGraphSync 现在会把 Outlook 重复系列导入为带有 RRULE 的单个重复条目,把已更改的实例导入为修改后的实例,把已取消的实例导入为例外,并把在计划器中创建的系列回传到 Outlook。TsgcPlannerGoogleSync 在更新事件时,会把在计划器中更改的提醒发送到 Google 日历,并读回在 Google 中更改的提醒。每个资源的 Capacity(1 表示一名全职人员,0.5 表示半职,3 表示三人团队)决定负载直方图中的容量线,并在 Microsoft Project XML 中以 MaxUnits 读取和写入。请参阅 sgcPlanner 功能。
sgcDashboard:发布到网页,地图磁贴随处可用
SaveToHTML 会把仪表板写成一个自包含的 HTML 页面。每个磁贴都由与打印相同的代码绘制为 SVG,布局基于遵循仪表板断点的 CSS 网格,并且每个磁贴都有标题和供屏幕阅读器使用的文本替代内容。如果没有刷新 URL,页面完全不含脚本。在 .NET 中,WPF 和 Avalonia 现在也提供地图磁贴,地图会出现在仪表板的打印、PDF 和 HTML 输出中。请阅读发布到网页帮助和 sgcDashboard 功能。
sgcMaps:在任意画布上绘制地图
TsgcVCLMap、TsgcFMXMap 以及 WinForms 的 SgcMapControl 上的 DrawTo,会把已加载磁贴的当前视图绘制到任意 sgcUI 画布的某个矩形中,WPF 和 Avalonia 的地图也可以渲染到任意 sgcUI 画布上。仪表板磁贴中的地图正是通过这种方式进入打印、PDF 和 HTML 页面的。请参阅 sgcMaps 功能。
sgcWizard:过渡动画与摘要页
Transition 以滑动、淡入淡出或二者结合的方式为页面切换添加动画,在从右到左的布局中会镜像,ReduceMotion 则遵循 Windows 的动画设置。启用 ShowSummary 后,向导会添加最后一页,列出用户在每个访问过的页面中输入的字段和值,密码会被遮蔽,并提供返回各页面的“编辑”链接。请参阅 sgcWizard 功能和摘要页帮助。
sgcReports:脚本与适用于所有平台的 FireMonkey 预览
TsgcReport.Script 以一种类似 Pascal 的小型语言保存过程,并存储在报表定义和 JSON 中。报表会在开始和结束时运行脚本,每个带区和每个条目在打印前后也会运行脚本,因此脚本可以在当前打印中隐藏某个带区,或更改条目的文本、字体颜色或高度。VCL、FireMonkey、WinForms、WPF 和 Avalonia 的设计器都可以编辑脚本,并提供“检查”按钮,用于显示错误所在的行和列。FireMonkey 预览可在 Windows、macOS、iOS 和 Android 上运行,支持触摸平移和双指缩放,在 iOS 和 Android 上,打印和保存 PDF 会打开系统的分享面板。请参阅 sgcReports 功能和脚本帮助。
.NET 版 sgcPDF:在 WPF 和 Avalonia 中编辑批注并填写表单
WPF 和 Avalonia 查看器现在具备 WinForms 查看器的能力:用户可以用鼠标创建、移动、调整大小、编辑和删除批注(AnnotationEditing 和 AnnotationTool),并通过 FormFilling 填写文本字段、复选框、单选按钮、组合框和列表框,按 Tab 键即可按 Tab 顺序在字段之间移动。请参阅 sgcPDF 功能。
在所有平台上检查无障碍
每个产品演示的 UI Automation 树,也就是讲述人和 NVDA 等屏幕阅读器所读取的树,已在 VCL、FireMonkey、WinForms、WPF 和 Avalonia 上使用 UI Automation 客户端进行了检查,发现的问题均已修复。VCL 编辑器现在会朗读字段的标签而不是其值,扁平的导航栏是列表而不是树,WinForms 和 WPF 的状态栏不再获取键盘焦点,Avalonia 网格的单元格不再重复其列名,Avalonia 控件的图表数据点和其他绘制条目会报告其在屏幕上的位置。
Visual Studio 智能标记与 XAML
全部 69 个 WinForms 工具箱组件的智能标记都在设计图面上进行了测试:每个属性、集合编辑器、数据源列表、操作和谓词。在 WPF 和 Avalonia 中,sgcDashboard 的磁贴和 sgcGauges 的皮肤与其他产品的列、字段和序列一样,在 XAML 中使用相同的 sgc 前缀声明。
sgcEditors:布局控件和数据表单
全新的布局控件 TsgcVCLLayoutControl 和 TsgcFMXLayoutControl(WinForms、WPF 和 Avalonia 中名称相同)可以把窗体上的控件排布为分组、选项卡分组和多列,标题对齐到同一宽度,带有用户可拖动的分隔条,并支持从右到左的布局。SaveLayout 和 LoadLayout 以 JSON 形式保存用户做出的排布。布局控件包含在每个版本中,社区版也不例外。Delphi 社区版没有 sgcEditors 的设计时包,因此在那里需要用代码创建。
数据表单建立在它之上。TsgcVCLDataForm 和 TsgcFMXDataForm 可以根据 TDataSet,或通过 BindObject 根据类的 published 属性生成完整的编辑窗体,而 WinForms、WPF 和 Avalonia 的数据表单接受 DataTable、列表或对象。每个字段都有一个 sgcEditors 控件、sgcUICore 验证器的规则,以及在某个分组或选项卡中的位置,导航条用于浏览、添加、编辑、删除和提交记录。智能粘贴通过编辑器已在使用的 AI 层,用粘贴的文本填充整条记录,并标出它填充的字段。数据表单属于注册版,适用于 VCL、FireMonkey、C++Builder、WinForms、WPF 和 Avalonia:
uses
Forms, Controls, DB,
sgcUICore_AI, sgcEditors_DataForm, sgcEditors_VCL_DataForm;
function CreateCustomerForm(aOwner: TForm; aSource: TDataSource;
aProvider: TsgcUIAIProvider): TsgcVCLDataForm;
var
oField: TsgcDataFormField;
begin
Result := TsgcVCLDataForm.Create(aOwner);
Result.Parent := aOwner;
Result.Align := alClient;
// an open dataset: one field, one editor and one rule per TField
Result.DataSource := aSource;
oField := Result.Fields.FindField('EMAIL');
oField.Kind := edfEmail;
oField.Required := True;
oField.Group := 'Contact';
Result.Fields.FindField('PHONE').Group := 'Contact';
Result.RebuildEditors;
// the Smart Paste button of the navigator fills every field from the
// clipboard; without a provider a local parser reads "Name: value" lines
Result.Provider := aProvider;
end;
请参阅 sgcEditors 功能和数据表单帮助。
sgcUI HMI 套件:水箱、P&ID、报警和 NumPad
HMI 套件为 sgcUI 带来过程画面:操作员面板、油罐区、泵站和其他工厂显示界面。它不是新产品。每一部分都位于其所扩展的产品中并遵循该产品的版本,支持 VCL 和 FireMonkey、C++Builder,以及 .NET 中的 WinForms、WPF 和 Avalonia。只需调用一次 sgcUIApplyISA101,每个 sgcUI 控件就会切换到灰色的 ISA-101 配色方案,颜色只保留给异常状态和报警。
- sgcGauges:水箱和容器仪表盘
TsgcVCLTankGauge,有四种形状,带 HH、H、L 和 LL 限值及回差;以及过程符号仪表盘TsgcVCLSymbolGauge,可把阀门、泵、电机、风机、换热器或传感器绘制为关、开、故障、打开、关闭或过渡状态,运行时泵和风机会旋转。sgcGaugesWS 桥接通过 MQTT、WebSocket 或 SSE 为两者提供数据,ValueMap则把RUNNING等工厂代码转换为符号状态。 - sgcDiagram:56 个 ISA-5.1 风格的 P&ID 模具,涵盖泵、阀门、容器、传热设备、管道和仪表,并通过
TsgcDiagramStatusBinding的规则提供过程状态和动画管道。 - sgcGrid:ISA-18.2 报警列表。
TsgcGridAlarmModel保存优先级为 1 到 4 的报警及六种状态,支持 Acknowledge、Shelve、筛选以及 JSON 和 CSV 导出。TsgcGridAlarmLink在表格中以优先级颜色和闪烁行显示它们,报警菜单则为操作员提供这些命令。 - sgcEditors:
TsgcVCLNumPad,用于触摸面板的 NumPad,可停靠在窗体上或以下拉形式出现,可向微调编辑框和货币编辑框、标准编辑框以及旋钮和滑块仪表盘中输入内容。
工厂仍由应用程序掌控:它从自己的驱动程序、数据库或仪表盘桥接获取数值,并决定何时触发报警。这里没有 OPC UA 或 Modbus 驱动程序。水箱和过程符号仪表盘、报警列表和 NumPad 包含在每个版本中,社区版也不例外,而 P&ID 模具、过程状态和动画管道、仪表盘数据源以及报警确认日志属于注册版。HMI 套件演示在一个由模拟器驱动的小型油罐区上把这些部分组合在一起。请阅读 sgcUI HMI 套件页面和 HMI 套件帮助。
sgcUI Realtime UI 套件:在线状态、通知、活动源和实时日志
Realtime UI 套件为 sgcUI 带来适用于 Delphi、C++Builder 和 .NET 的实时画面所需的各个部分。它不是新产品。每个部分都放在它所扩展的产品中。sgcUICore 增加了带头像、头像组和在线状态指示器的在线状态模型。sgcNavigation 增加了通知中心,包括弹出通知、按天分组的收件箱以及按类别和渠道设置的偏好,而 sgcToolbar 的 TsgcToolbarBadgeLink 会在工具栏或功能区项目上显示未读数量。sgcDashboard 增加了活动源和审核跟踪,既可作为独立控件,也可作为仪表板磁贴,sgcGrid 则增加了带级别、筛选、跟随末尾、暂停和导出的实时日志查看器。
每个模型每次变化接收一条 JSON 消息。在注册版中,sgcUICoreWS 桥接的 WebSocket、MQTT 和 SSE 实时数据源无需编写代码即可从 sgcWebSockets 为它们供数。每个控件随其所属产品的版本提供。没有服务器时,或在社区版构建中,应用程序改为通过各模型的 API 更新模型。请阅读 sgcUI Realtime UI 套件页面。
每款产品的入门指南
每款 sgcUI 产品现在都附带五个适用于 Delphi (VCL) 的 QuickStart 演示和一份入门指南,指南既有演示旁边的 HTML 版本,也有 PDF 版本。演示从第一个窗体一直到一个小型的完整应用程序,指南则讲解每一步。可以先阅读 sgcGrid 指南、sgcCharts 指南或 sgcChat 指南。
全部 16 份指南都列在 sgcUI 快速入门的指南部分中。
有问题或反馈?欢迎联系我们,您将得到编写代码的工程师的亲自回复。
