交易和行情数据台
行情板必须在数百个价格每秒变化时仍保持可读。数据源线程用 UpdateRow 写入,从不等待界面,变化时闪烁显示每次变动的方向,尾随模式让成交日志停留在最新一笔。sgcGridWS 桥接可以从 WebSocket、MQTT 或 SSE 读取行情。
- 实时更新
- 变化时闪烁
- 尾随模式
- 实时数据流
专为瞬息万变的数据打造的网格。可从任意线程按键写入行,变化的单元格会闪烁绿色或红色,同一批行还能分组、筛选、编辑和导出。在 Win32 上,100,000 行网格渲染一帧 1080p 画面仅需 3.0 毫秒。
MaxFPS 控制节奏。十八项功能分为五组,每项都链接到对应的帮助主题。
永不停歇的数据流:价格、遥测、队列和日志。
实时数据
行情源、传感器总线或作业队列都可以直接写入网格。每一行都有一个键,工作线程按字段名更新某个键对应的行,无需调用 Synchronize,也不需要自己编写加锁代码。网格只在写入线程上标记自身为脏,并在主线程上以每秒最多 MaxFPS 次的频率重绘。
UpdateRow 设置某个键的指定字段,键为新键时插入该行;UpdateCell 修改单个字段AppendRow 和 DeleteRow 按键添加和删除行,可在任意线程调用BeginUpdate 和 EndUpdate 把一批操作合并为一次通知
实时数据
交易员和操作员需要在不逐个读数字的情况下看到哪些数据发生了变化。FlashChanges 开启时(默认开启),数值上升的单元格会染成绿色,下降的染成红色,然后在 FlashDuration 毫秒(默认 800)内逐渐消退。对于日志和不断增长的数据流,尾随模式会让最新一行保持在视野内,并在用户向上滚动阅读时立即停止跟随。
FlashUpColor、FlashDownColor 和 FlashChangedColor;颜色为 0 时使用主题默认值FlashMode 为背景染色(fmBackground)或为文本染色(fmText)TailMode 跟随最新一行,MaxRows 丢弃无尽日志中最旧的行
实时数据
逾期发票、负余额或失败的作业应该在有人问起之前就显眼可见。格式规则按列的数据类型把该列与某个值比较:数字按数值,日期按日期,文本不区分大小写。匹配的规则可为单元格或整行设置背景色、文字颜色或粗体,并且在实时更新改变底层数值时仍然生效。
TsgcGridFormatRules 按集合顺序计算其规则,后面的匹配会覆盖前面的gfoLess、gfoBetween、gfoContains 和 gfoIsEmpty 等运算符ApplyToRow 为整行的每个单元格设置样式,StopOnMatch 为某个单元格结束规则计算OnGetCellStyle 拥有最终决定权对大型行集进行排序、筛选、分组和嵌套。
整理数据
按地区的销售额、按月的订单、按状态的工单:用户想要的是合计,而不是原始行。GroupBy 按一列或多列对网格分组,每个分组行显示其成员、行数以及各行的汇总。用户可以把列标题拖到分组面板上自行重新分组。分组只是视图状态,因此绑定到网格的图表看到的仍是平铺且已排序的行。
GroupBy 和 ClearGrouping,或为每列设置 GroupIndexShowGroupPanel 添加可拖放的标签;点击标签可翻转分组顺序SummaryType 可取 gsuSum、gsuCount、gsuAverage、gsuMin 或 gsuMax,并用 SummaryFormat 格式化GroupSummaries,ShowFooter 显示总计DisplayFormat 设为 yyyy-mm 时,日期按月分组
整理数据
在数千条记录中找到一位客户,应该只需敲几下键盘。FilterText 保留在任意可见列中格式化文本包含所输入词语的行,OnFilterRow 处理程序可在此基础上加入您自己的规则。点击列标题即可排序,按住 Ctrl 点击可把某列加入多列排序,并且排序是稳定的。一个持续变化但既未排序也未筛选的列完全不会触发重新排序。
SortOrder 和 SortIndex,每次更改后触发 OnSortChangeFilterText 不区分大小写,并按用户看到的文本读取OnFilterRow 用于自定义逻辑,该逻辑变化时调用 InvalidateViewSelectionMode 选择行或单元格,Ctrl+C 将其复制为以制表符分隔的文本
整理数据 仅限注册版
组织结构图或物料清单最适合用树形展示,客户的订单最好直接显示在客户下方。树形行根据键列和父列按深度优先排布。明细带在任意主行下方展开一个由相关行组成的小网格,拥有自己的标题、滚动和排序,数据来自 TsgcGridDataStore、另一个网格或某个事件。
Tree.KeyField 和 Tree.ParentField 开启树形;ExpandNode 和 CollapseNode 可从代码调用Detail.MasterKeyField 和 Detail.DetailKeyField 把明细带与其数据源关联,OnGetDetailData 按需填充.NET 社区版不含此功能,但保留分组。
阅读帮助主题
整理数据
当股票代码或客户名称滚出视野时,宽网格就会失去上下文。FrozenColumns 让前几个可见列固定不动,其余列水平滚动,标题、页脚和分组汇总遵循相同的拆分。用户可以拖动标题边缘调整列宽,无界面渲染器使用相同的设置,因此导出的图像与屏幕一致。左侧的分组折叠箭头同样不会滚动。
FrozenColumns 按可见列计数,一条一像素的线标出冻结边缘FrozenWidth 返回不滚动部分的宽度MinWidth 限制调整大小,OnColumnResized 报告新的宽度
整理数据
用户期望看到 Excel 里那个熟悉的漏斗。ShowFilterButtons 会在每个列标题中放一个:它会打开一个弹出窗口,列出该列的不同值及其行数、一个搜索框,以及最多两个用 And 或 Or 连接的类型化条件。ShowFilterRow 会在标题下方添加一行,边输入边筛选一列,Ctrl+F 则打开查找面板,在每个单元格中高亮文本,并在各个匹配项之间跳转。
Column.Filter 都会修改它,所以三者始终保持一致FilterRowOperator:等于、大于、包含、开头为、为空等等FindText、FindNext 和 FindPrevious 可在代码中使用,FindOnlyMatches 会隐藏没有匹配项的行FilterText 和 OnFilterRow 一起应用,OnFilterChange 会报告每次更改适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格,免费的 .NET 社区版也包含在内。
阅读帮助主题整理数据
右键单击列标题会打开一个菜单,可以排序、分组、调整宽度、筛选,并打开列选择器,这是一个每列带一个复选框的弹出窗口。用户可以拖动标题来移动该列,双击标题边缘则会让宽度适应标题和单元格。SaveLayoutToString 和 LoadLayoutFromString 会把这一切保存成一小段 JSON 文本,所以网格会按用户离开时的样子打开。
HeaderMenu、ColumnMoving 和 BestFitOnDblClick 默认开启,指定的 PopupMenu 优先ShowColumnChooser 可以从你自己的按钮或菜单项打开选择器OnColumnMoved 会报告这次移动BestFitColumn 和 BestFitColumns 会测量标题以及最多 1,000 个采样行,所以一百万行的开销与一千行差不多SaveLayoutToFile 和 LoadLayoutFromFile 使用文件适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格,免费的 .NET 社区版也包含在内。
阅读帮助主题
整理数据
当 Last、Change 和 Trend 位于同一个 Price 标题之下时,交易界面更易阅读。Bands 会在列组上方添加标题,层级数量不限,每一列在 Band 中指明自己的带区。CellKind 会把单元格绘制成图像、进度条或迷你图,而单元格仍保留其原始值,所以排序、分组和导出看到的仍是数字。
Bands.Add 接受一个标题和一个父带区,带区行会堆叠在列标题上方gcdProgress 使用 ProgressMin 和 ProgressMax;gcdSparkline 根据一组数字绘制折线图、面积图或柱状图gcdImage 绘制 CellImages 中的图像,网格会用分配给 Images 的任意图像列表来填充它SelectionMode 的 gsmMultiRow 可用 Ctrl 和 Shift 选择任意一组行,gsmCellRange 选择一个单元格区域,Ctrl+A 选择全部适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格,免费的 .NET 社区版也包含在内。
阅读帮助主题修改数据,与数据库同步,再交给他人。
编辑与导出 仅限注册版
后台办公用户希望直接在网格中修改数量或状态。把 ReadOnly 设为 False 后,按 F2、Enter、输入字符或双击即可在单元格上打开编辑器;如果该列有 PickList,则打开组合框。输入的文本会转换为该列的数据类型,OnValidate 可以修改或拒绝该值,结果通过 UpdateCell 写入,因此排序和闪烁依然适用。
Editable,OnBeforeEdit 可以拒绝编辑StartEdit、CommitEdit 和 CancelEdit 可从代码完成同样的操作OnEditError 保持编辑器打开,OnEdited 报告旧值和新值.NET 社区版不含此功能。
阅读帮助主题
编辑与导出
现有的数据库代码照常工作:TsgcGridSource_DataSet 可从 FireDAC 查询、TClientDataSet 或任何其他 TDataSet 填充网格。设置其 Grid 和 DataSet,将其置为 Active,行就会出现。设置 KeyField 后,网格会同步而不是重新加载,因此变化的行就地更新并闪烁。开启 LiveUpdates 后,每一次已提交的 Append、Edit 和 Delete 都会无需额外代码地到达网格。
AutoColumns 根据数据集字段创建列KeyField 后,新键会被追加,缺失的键会被删除DisableControls,并恢复其当前记录GridLoadFromJSONFile、GridSaveToCSVFile 以及 sgcGrid_IO 的其余函数编辑与导出 仅限注册版
财务部门要的是 Excel 中的数字,而不是截图。SaveToXLSX 无需外部库,即可把网格作为 Office Open XML 工作簿写入文件或流。工作表保留用户所见的内容:按显示顺序排列的可见列及其宽度和数字格式、冻结的标题、作为可折叠分级显示的分组和树形层级,以及作为 SUBTOTAL 公式的分组合计。
SaveToXLSX 接受文件名或流,以及可选的工作表名称DisplayFormat 成为单元格的数字格式.NET 社区版不含此功能,但保留 JSON 和 CSV 导出。
阅读帮助主题
编辑与导出 仅限注册版
启用 WriteBack 后,TsgcGridSource_DataSet 会把网格中的每次修改写入该行的记录。它通过 KeyField 定位记录并提交值。如果提交失败,例如在 BeforePost 检查中失败,记录会被取消,单元格保留旧值。SyncCursor 让当前记录和活动行保持一致,所以同一个数据集上的 TDBNavigator 和 TDBEdit 控件会跟随网格,网格也会跟随它们。
AllowInsert:Ins 追加并提交一条记录,数据集的 OnNewRecord 会填入默认值AllowDelete:在 OnBeforeDelete 同意之后,Ctrl+Del 会删除选中的行及其记录OnEditError 显示数据集的消息;粘贴的值和撤销使用同一条写入路径适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格;.NET 社区版不含此功能。在 .NET 中,数据源写回 DataTable,AddLookup 添加查找列,SyncCursor 仅限 Delphi。
编辑与导出 仅限注册版
每一列都选择用哪个控件来编辑它。EditorKind 可选择日期、时间或日期时间选择器、带箭头的数字框、颜色选择器,或来自 sgcEditors 的令牌编辑器,默认值由列的数据类型决定。Ctrl+V 会粘贴从 Excel 复制的数据块:每个值在写入任何内容之前都会先转换并验证,整个粘贴只算一个撤销步骤。Ctrl+Z 和 Ctrl+Y 会撤销和重做修改与粘贴。
OnCreateEditor 可以把你选择的任意控件放进单元格,例如 TTrackBarPasteText 和 PasteFromClipboard 可在代码中使用,OnBeforePaste 可以修改或拒绝文本OnValidate 拒绝,粘贴就会在写入任何内容之前停止UndoLimit 保留最近 100 步;Undo、Redo 和 CanUndo 可在代码中使用适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia 网格;.NET 社区版不含此功能。
阅读帮助主题百万行数据、实时数据流和自然语言。
扩展与连接
日志归档、传感器历史和已存在于别处的查询结果,不需要复制到内存中。在虚拟模式下,网格不存储任何行:VirtualRowCount 告知行数,当某一行滚动进入视野时,OnGetValue 返回其值。只绘制可见行,因此百万行网格的开销与五十行的网格相当。数据源增长时可随时更改行数。
Virtual 和 VirtualRowCount,由 OnGetValue 提供单元格内容OnGetValue 读取其值MaxRows 配合 TailMode 是基于键的替代方案扩展与连接
并非每位用户都想自己构建筛选条件。TsgcGridAI 可把诸如 price greater than 100 sort by volume descending highlight change less than 0 这样的问题转换为网格上的筛选、排序和行高亮,AI 查询栏则为用户提供输入问题的位置。未指定提供程序时,基于规则的解析器在本地回答,无需网络和 API 密钥。指定提供程序后,则由任意大语言模型来回答:TsgcUIAIEventProvider 把每个请求交给你自己的代码,TsgcUIAIChatProvider 则使用 sgcWebSockets 的 TsgcAIChat 组件。只发送字段目录,即各列的名称、标题、类型和少量示例值,绝不发送行数据。网格无法应用的请求(例如分组或行数限制)会被如实报告,而不是猜测。
TsgcVCLAIQueryBar、TsgcFMXAIQueryBar、TsgcWinFormsAIQueryBar、TsgcWpfAIQueryBar 和 TsgcAvaloniaAIQueryBar,带有最近的问题、建议、取消和撤销OnFilterRow 处理,高亮变成 ApplyToRow 格式规则Undo 可后退一步LastExplanation 说明哪些已被应用、哪些被忽略;提供程序失败时,由基于规则的解析器作答TsgcHTMLAIAssistant 的 TsgcGridAIQuery,还提供 TsgcGridFeedSource_WebSocket、TsgcGridFeedSource_MQTT 和 TsgcGridFeedSource_SSE,它们按键把 JSON 消息写入网格每个版本均可使用,包括社区版,适用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia。sgcWebSockets 提供程序和 sgcGridWS 桥接需要 sgcWebSockets 和注册版。
阅读帮助主题预览显示的内容与打印机和 PDF 得到的完全一致。
打印、预览和 PDF
打印出的页面显示的是网格的内容,而不是屏幕。每一行都按网格显示的样子打印,已应用筛选、排序顺序、分组和查找匹配,而不只是滚动到视图中的行。带区行和列标题在每一页的顶部重复,带汇总的页脚结束每一页,每页只放完整的行,因此行不会被切断。
Print 显示打印对话框或直接打印到默认打印机,ShowPrintPreview 打开带有翻页、缩放、页面设置、打印和 PDF 导出的预览PrintSettings 保存纸张、方向、页边距、缩放以及页眉和页脚文字,打印机、预览和 PDF 都使用它ExportToPDF 写出带真正可搜索文本的矢量页面,默认是带标签的 PDF/UA,每一页都是带标题单元格的真正表格,因此屏幕阅读器会连同标题一起朗读表格TsgcUIPDFOptions 的 PDFALevel 可为归档加上 PDF/A-2a 或 PDF/A-3a,可单独使用,也可与 PDF/UA 同时使用打印和预览包含在每个版本中,包括免费的社区版,可用于 VCL、FireMonkey、WinForms、WPF 和 Avalonia。在 FireMonkey 中,打印在 Windows 和 macOS 上可用,预览和 PDF 导出则适用于所有平台。PDF 导出需要 sgcUIPDF 桥接和已获许可的 sgcPDF(在 .NET 中为 NuGet 包 esegece.sgcUICore.sgcPDF),因此不包含在社区版中。
面向屏幕阅读器的 UI Automation、键盘和高对比度,无需任何设置。
无障碍
sgcGrid 将其内容作为带有列标题、行和单元格的表格向 Microsoft UI Automation 公开,Narrator 和 NVDA 等屏幕阅读器使用的正是这一 API。只会构建可见的行,行数和列数始终是完整的数量,因此拥有一百万行的网格不会带来额外开销。
无障碍功能在每个版本中默认开启,包括免费的社区版,可用于 VCL(Delphi 和 C++Builder 从 Delphi 7 到 Delphi 13 的每个版本)、Windows 上的 FireMonkey,以及 WinForms、WPF 和 Avalonia。在 Delphi 和 C++Builder 中,AccessibleName 和 AccessibleDescription 设置向 UI Automation 公开的名称和说明,在 .NET 中,各框架标准的无障碍名称和帮助文本起同样的作用。请参见无障碍符合性报告。在没有表格模式的 Avalonia 上,每个单元格在其名称和帮助文本中带有自己的列和位置。列宽只能用鼠标调整。
sgcUI 套件演示中的 sgcGrid:使用内置模拟数据、可离线运行的完整应用程序。
持仓按交易台和策略分组,损益单元格着色,成交明细只需点击一次。
Altamira Markets →
按区域分组并带汇总的客户,以及联动的联系人卡片。
Altamira ERP →
按项目集分组、含缓解措施行的风险登记册。
Altamira PMO →
带每辆卡车预计到达时间、余量和状态的车辆表格,旁边是全国地图。
Altamira Fleet →sgcGrid QA 性能关卡最近一次测得的平均值:1920 x 1080 画面,12 列、100,000 行、45 个可见行,在光栅画布上渲染 60 次。在 Win64 上每帧超过 16 毫秒、在 Win32 上超过 25 毫秒时,该关卡判定失败。
| 测量项 | 结果 | 条件 |
|---|---|---|
| 普通帧 | 3.0 毫秒 | Win32 |
| 普通帧 | 4.6 毫秒 | Win64 |
| 普通帧 | 3.7 毫秒 | Linux64 |
| 闪烁加 3 条格式规则 | 3.2 毫秒 | Win32 |
| 闪烁加 3 条格式规则 | 6.8 毫秒 | Win64 |
| LiveTicker 演示,工作线程写入 | 每秒约 1,000 次更新 | 已排序、闪烁的网格,60 fps |
来源:记录这些数据的帮助主题。
行情板必须在数百个价格每秒变化时仍保持可读。数据源线程用 UpdateRow 写入,从不等待界面,变化时闪烁显示每次变动的方向,尾随模式让成交日志停留在最新一笔。sgcGridWS 桥接可以从 WebSocket、MQTT 或 SSE 读取行情。
订单录入、库存清单和开票界面都依托于数据库。绑定现有的 TDataSet,让用户按客户或月份分组并在每个分组行中查看合计,通过验证就地修正数值,再导出一个工作簿,财务部门打开后分组和 SUBTOTAL 公式完好无损。
运维界面展示永不终止的事件流。MaxRows 限制日志大小,格式规则把错误涂成红色,虚拟模式可按需浏览包含数百万行的归档。在 Linux64 服务器上,渲染器可将同一个网格写成 PNG 或 SVG 文件,用于告警邮件。
Delphi、C++ Builder 和 C# 中使用相同的 API:添加列,按键追加行,之后从任意线程更新。
用代码创建的 VCL 网格:带类型的列、按键追加的行,以及从任意线程按字段名进行的更新。
uses
Forms, Classes, Controls,
sgcGrid_Columns, sgcGrid_Data, sgcGrid_VCL;
procedure CreateGrid(aForm: TForm);
var
oGrid: TsgcVCLGrid;
begin
oGrid := TsgcVCLGrid.Create(aForm);
oGrid.Parent := aForm;
oGrid.Align := alClient;
// the columns: FieldName, Caption and DataType
oGrid.Columns.Add('Symbol', 'Symbol');
oGrid.Columns.Add('Price', 'Price', gdtFloat).DisplayFormat := '0.00';
oGrid.Columns.Add('Volume', 'Volume', gdtInteger);
// one row per key, the values in column order
oGrid.Data.AppendRow('MSFT', ['MSFT', 412.5, 1200]);
oGrid.Data.AppendRow('AAPL', ['AAPL', 228.1, 3400]);
// later, from any thread: update the row of a key by field name
oGrid.Data.UpdateRow('MSFT', ['Price', 'Volume'], [413.1, 1350]);
end;C++ Builder 中使用生成的 sgcGrid 头文件实现的同一个网格。
#include "sgcGrid_Columns.hpp"
#include "sgcGrid_Data.hpp"
#include "sgcGrid_VCL.hpp"
void __fastcall CreateGrid(TForm *Form)
{
TsgcVCLGrid *Grid = new TsgcVCLGrid(Form);
Grid->Parent = Form;
Grid->Align = alClient;
// the columns: FieldName, Caption and DataType
Grid->Columns->Add("Symbol", "Symbol", gdtText);
Grid->Columns->Add("Price", "Price", gdtFloat)->DisplayFormat = "0.00";
Grid->Columns->Add("Volume", "Volume", gdtInteger);
// one row per key, the values in column order
Grid->Data->AppendRow("MSFT", OPENARRAY(Variant,
(Variant("MSFT"), Variant(412.5), Variant(1200))));
Grid->Data->AppendRow("AAPL", OPENARRAY(Variant,
(Variant("AAPL"), Variant(228.1), Variant(3400))));
// later, from any thread: update the row of a key by field name
Grid->Data->UpdateRow("MSFT",
OPENARRAY(String, (String("Price"), String("Volume"))),
OPENARRAY(Variant, (Variant(413.1), Variant(1350))));
}带闪烁单元格、负变化规则和深色主题的 WinForms 网格。
using System.Windows.Forms;
using esegece.sgcGrid;
using esegece.sgcUICore;
internal class MainForm : Form
{
private readonly TsgcWinFormsGrid Grid = new TsgcWinFormsGrid();
public MainForm()
{
Grid.Dock = DockStyle.Fill;
// the columns: field name, caption and data type
Grid.Columns.Add("symbol", "Symbol");
Grid.Columns.Add("price", "Price", TsgcGridDataType.gdtFloat).DisplayFormat = "#,##0.00";
Grid.Columns.Add("change", "Change", TsgcGridDataType.gdtFloat).DisplayFormat = "+0.00;-0.00;0.00";
Grid.Columns.Add("volume", "Volume", TsgcGridDataType.gdtInteger).DisplayFormat = "#,##0";
// changed cells flash and fade, negative rows are tinted red
Grid.FlashChanges = true;
Grid.FormatRules.Add("change", TsgcGridFormatOperator.gfoLess, "0", 0x30E53935).ApplyToRow = true;
Grid.Theme = TsgcUITheme.utDark;
// one row per key, the values follow the column order
Grid.Data.AppendRow("MSFT", "MSFT", 412.5, 0.0, 1200);
Grid.Data.AppendRow("AAPL", "AAPL", 228.1, 0.0, 3400);
Controls.Add(Grid);
}
// call it from any thread: TsgcGridData is thread safe
public void OnQuote(string aSymbol, double aPrice, double aChange, int aVolume)
{
Grid.Data.UpdateRow(aSymbol, new[] { "price", "change", "volume" },
new object[] { aPrice, aChange, aVolume });
}
}dotnet add package esegece.sgcGrid.WinForms15 个 Delphi 演示(其中三个为 FireMonkey)、11 个 C++ Builder 演示,以及 18 个适用于 WinForms、WPF 和 Avalonia 的 .NET 演示。
工作线程每秒通过 UpdateRow 推送约 1,000 次价格更新,配合已排序视图、闪烁单元格和针对负变化的格式规则。支持 VCL、FireMonkey、C++ Builder、WinForms、WPF 和 Avalonia。
一个 TsgcGridSource_DataSet 绑定到包含 200 条记录的 TClientDataSet,使用 KeyField、AutoColumns 和 LiveUpdates,并支持 JSON 和 CSV 的导出与导入。
100,000 张订单按 Region 和 Category 分组,带分组面板、Count、Sum 和 Average 汇总、页脚和两个冻结列。.NET 中称为 Grouping。
10 万行销售数据,配有漏斗弹出窗口、筛选行和查找面板,另有列选择器、最佳列宽,以及保存到文件后再重新加载的布局。适用于 VCL、FireMonkey、C++ Builder、WinForms、WPF 和 Avalonia。
2,000 个交易品种,位于 Instrument、Live data、Price 和 Position 带区之下,带有迷你图、进度条和图像单元格、多行选择以及 Copy 按钮。适用于 VCL、C++ Builder 和 WinForms。
一个下拉列表列、一个用空格键切换的布尔列、拒绝负数量的 OnValidate、OnEditError 以及 OnEdited 日志,另有来自 sgcEditors 的日期、时间、数字、颜色和令牌编辑器,通过 OnCreateEditor 放入的 TTrackBar,以及粘贴、撤销和重做。
产品和类别存放在两个 TClientDataSet 中,TDBNavigator 和两个 TDBEdit 与网格共用同一批记录:包括 WriteBack、SyncCursor、查找列、插入、删除和撤销。适用于 VCL、C++ Builder 和 WinForms(带 AddLookup 的 DataTable)。
一个组织结构图树,以及带有订单明细带的客户,明细带通过 TsgcGridDataStore 填充。
一个分组网格和一个树形网格通过 SaveToXLSX 保存,并在电子表格应用中打开,分级显示和汇总得以保留。
仪表板上的一个网格磁贴和一个图表磁贴:TsgcChartDataSource_Table 绘制网格中的行。需要 sgcCharts 和 sgcDashboard。
TsgcGridAI 和 AI 查询栏根据自然语言问题对 200 只股票进行筛选、排序和高亮,无需网络和 API 密钥,并与 TsgcGridAIQuery 桥接并列展示。需要 sgcWebSockets。
进程内 WebSocket 服务器广播包含 50 个代码的 JSON 批次,TsgcGridFeedSource_WebSocket 按键把它们写入网格。支持 Delphi 和 .NET。
免费的社区版是 NuGet 上的 esegece.sgcGrid.Community。一个项目引用社区版包或注册版包之一,不能同时引用两者。
| 功能 | 社区版(免费) | 注册版 |
|---|---|---|
| 从任意线程实时更新、变化时闪烁、尾随模式 | ✓ | ✓ |
| 格式规则和主题 | ✓ | ✓ |
| 排序、筛选和选择 | ✓ | ✓ |
| 分组、分组面板和汇总 | ✓ | ✓ |
| 冻结列和调整列宽 | ✓ | ✓ |
| 虚拟模式 | ✓ | ✓ |
| DataTable 绑定、JSON 和 CSV | ✓ | ✓ |
| 无界面 PNG 和 SVG | ✓ | ✓ |
| 列筛选器、筛选行和查找面板 | ✓ | ✓ |
| 列选择器、列移动、最佳列宽和布局 | ✓ | ✓ |
| 带区、图像、进度和迷你图单元格、多选 | ✓ | ✓ |
| 向网格提问:TsgcGridAI、AI 查询栏和任意 LLM 提供程序 | ✓ | ✓ |
| 就地编辑 | − | ✓ |
| 双向 DataTable 编辑、粘贴、撤销和重做、sgcEditors 单元格编辑器 | − | ✓ |
| 树形行和主从明细 | − | ✓ |
| Excel 导出 | − | ✓ |
| 实时数据流、TsgcGridAIQuery 和 sgcWebSockets AI 提供程序(sgcGridWS 和 sgcUICoreWS 桥接) | − | ✓ |
| 组件 | 目标 |
|---|---|
| TsgcVCLGrid | Delphi 和 C++ Builder,VCL(sgcGrid_VCL) |
| TsgcFMXGrid | 自 XE6 起的 Delphi FireMonkey,支持 Windows、macOS、iOS 和 Android(sgcGrid_FMX) |
| TsgcGridData, TsgcGridColumns, TsgcGridFormatRules, TsgcGridLineView, TsgcGridRenderer | 与框架无关的行存储、列、格式规则和渲染器,也支持 Linux64 |
| TsgcGridAI | 与框架无关的自然语言查询引擎,每个版本均可使用,也支持 Linux64(sgcGrid_AI) |
| TsgcVCLAIQueryBar, TsgcFMXAIQueryBar, TsgcUIAIEventProvider | sgcUICore 的 AI 查询栏和 AI 提供程序,每个版本均可使用 |
| TsgcUIAIChatProvider | sgcUICoreWS 桥接:以 sgcWebSockets 的 TsgcAIChat 作为 AI 提供程序(注册版) |
| TsgcGridSource_DataSet, TsgcGridDataStore | TDataSet 绑定,以及主从明细带的行存储 |
| TsgcGridFeedSource_WebSocket, TsgcGridFeedSource_MQTT, TsgcGridFeedSource_SSE, TsgcGridAIQuery | 与 sgcWebSockets 配合的 sgcGridWS 桥接(注册版) |
| TsgcWinFormsGrid, TsgcWpfGrid, TsgcAvaloniaGrid | .NET,WinForms、WPF 和 Avalonia |
| TsgcGridAI, TsgcWinFormsAIQueryBar, TsgcWpfAIQueryBar, TsgcAvaloniaAIQueryBar | .NET,面向 WinForms、WPF 和 Avalonia 的自然语言查询和 AI 查询栏 |
| 目标 | 组件 | 平台 |
|---|---|---|
| Delphi 7 至 13,VCL | TsgcVCLGrid | Win32,自 XE2 起支持 Win64 |
| Delphi XE6 至 13,FireMonkey | TsgcFMXGrid | Windows、macOS、iOS 和 Android |
| C++ Builder 2007 至 13 | TsgcVCLGrid, TsgcFMXGrid | 生成的 .hpp 头文件和静态库 |
| Delphi 10.2 至 13,与框架无关 | 模型、格式化、渲染器、JSON 和 CSV | Linux64,例如在服务器上渲染网格图像 |
| .NET Framework 4.7.2、.NET 8、9 和 10 | TsgcWinFormsGrid,以及 WPF 和 Avalonia 网格 | WinForms、WPF、Avalonia,无界面 PNG 和 SVG |
可以。网格数据的 AppendRow、UpdateRow、UpdateCell 和 DeleteRow 都是线程安全的,因此工作线程可以按键直接写入行。网格在主线程上以每秒最多 MaxFPS 次的频率重绘。请参阅实时更新。
只绘制可见行,因此一帧的开销取决于窗口,而不是行数。QA 关卡测得 100,000 行网格的 1080p 画面在 Win32 上为 3.0 毫秒,在 Win64 上为 4.6 毫秒。对于存放在别处的数据,虚拟模式不存储任何行,而是在行滚动进入视野时请求其值。请参阅性能。
可以。TsgcGridSource_DataSet 可从任意 TDataSet 填充网格,通过 AutoColumns 创建列,并在开启 LiveUpdates 时跟随数据集的每一次 Append、Edit 和 Delete。设置 KeyField 后,变化的行会就地更新而不是重新加载。在 .NET 中,同一个数据源读取 DataTable。请参阅数据集绑定。
可以。TsgcVCLGrid 是普通的 VCL 控件,因此可以与现有的 TStringGrid 或 TDBGrid 并排放在同一窗体上。TDBGrid 界面保留其数据集并添加一个 TsgcGridSource_DataSet;TStringGrid 界面则用 AppendRow 和 UpdateRow 按键写入行。现有窗体不会自动转换。
就地编辑、双向 DataTable 编辑、粘贴、撤销和重做、sgcEditors 单元格编辑器、树形行、主从明细行、Excel 导出和 sgcGridWS 桥接。排序、筛选、筛选行和查找面板、分组、汇总、冻结列、列选择器、布局、带区、图像、进度和迷你图单元格、多选、格式规则、虚拟模式、JSON 和 CSV、无界面输出以及使用 TsgcGridAI 的向网格提问在每个版本中都有。请参阅版本。
支持。GroupIndent 和 GroupPanelHeight 等尺寸采用与设备无关的像素,VCL 网格会按其所在显示器的 DPI 缩放,自 Delphi 10.3 起支持按显示器缩放。Theme 在 utLight 和 utDark 之间切换,AccentColor 设置选中和闪烁的强调色。