直接从 Delphi、C++ Builder 和 .NET 构建完整、现代的 Web 界面。sgcHTML 是一个服务器端组件框架,提供 109 个现成的数据感知控件 — 图表、网格、表单、仪表板、聊天等等 — 它们可直接绑定到 TDataSet,渲染为 Bootstrap 5 标记,并通过 htmx 保持交互。您编写 Object Pascal 或 C#,sgcHTML 负责生成 HTML、CSS 和 JavaScript。
用 Delphi 构建完整的 Web 界面,服务端组件搭配 Bootstrap 5 标记和 htmx,无需 JavaScript 构建步骤。
下面的每一个界面,都是通过 sgcHTML 输出自身 HTML 的 Delphi 应用程序。无需 JavaScript 构建步骤,也无需独立的前端项目。用各登录页上已预填的凭据登录即可。
一个数据网格、一个数据透视表和一个表单,均由自然语言驱动:对 26,000 行订单数据进行筛选、排序和分组,配备 AI 列助手和智能粘贴。无需 API 密钥即可运行。
打开在线演示 →一个在 ChatGPT、Claude 或 VS Code 内部渲染的 Delphi 应用:MCP 工具返回 sgcHTML 页面,由宿主显示,页面上的按钮在其中依然可以正常使用。
打开在线演示 →
Gantt 计划器、Chart.js 系列、仪表盘、迷你图、树状图和热力图,全部由您的 Pascal 或 C# 代码生成。您只需设置数据,sgcHTML 负责输出标记和客户端脚本。
用户选择维度、度量和聚合方式,交叉表即从 TFDQuery 重新生成。中间没有 REST 层,页面在进程内直接读取数据库。
每个组件都渲染响应式 Bootstrap 5 标记,因此仓库终端布局只是同一套组件库在手机宽度下的呈现,而不是另一份移动端代码。
每段视频都是这些应用程序实际运行时的屏幕录像,配有讲解和字幕。按下播放之前不会下载任何内容。
一个 7.7 MB 的 Delphi 可执行文件,身边不带任何 DLL,基于 SQLite 提供完整的 Web ERP。
遍览 109 个组件,从表格、图表到 Kanban 面板和签名板。
排序、筛选、分页、行内编辑、选择和数据集绑定,全部由 Pascal 驱动。
片段替换如何取代整页刷新,以及它在 Delphi 代码里的写法。
服务器指标推送为带外片段,卡片和图表随数据变化实时更新。
销售点演示在进程内直接读取数据库,中间没有 JSON API。
面向 27,000 条订单明细的仪表板、透视构建器和探索视图。
仓库演示逐屏清点它所依赖的组件库。
同一个应用同时运行在桌面看板和手机上,保持同步。
一个二进制文件、一个数据库,严格的按租户隔离,用演示而非口头保证。
登录之后自助管理订单、个人资料和支持工单。
边输入边搜索,行内新增、编辑和删除,全部以 htmx 片段替换完成。
注册、工单会话和状态变更,全部由服务端渲染。
商店助手依据商品目录作答,而不是凭空编造。
导航、侧边栏和页面组合,全部由 Site 组件构建。
为现有的 Delphi WebBroker 应用添加 sgcHTML 输出。
在您已有的服务层之上提供现代化前端。
MCP 工具以页面而不是文本作答,页面由与任何网页相同的组件构建,并由 ChatGPT、Claude 和 VS Code 渲染。需要 Enterprise 或 All-Access 版本,或者 sgcAI 包。参见 MCPApp。
描述一个页面,或者把截图交给设计器,它会用您自己的组件构建出该页面。它根据由您的注册表构建的 schema 作答,因此不会提到您没有提供的类,并且在您接受之前不会应用任何内容。它需要 Enterprise 或 All-Access 版本的 AI 单元,或者 sgcAI 包。阅读指南。
一张表的列表、搜索、分页、表单、删除和写入路径,集于一个组件,基于数据集或您自己的 SQL。IDE 向导可以创建它。参见 CRUD。
用自然语言提出的问题会变成筛选、排序、分组和高亮,在应用任何内容之前,先根据您自己的列进行验证。它通过内置解析器无需 API 密钥即可工作,当您的版本包含 AI 单元时,还支持七个提供商。参见 AIAssistant。
面向屏蔽 WebSocket 的网络的服务器发送事件,面向未运行浏览器的 Web Push,以及通知收件箱和偏好设置表。Web Push 需要 Enterprise 或 All-Access 版本。参见 WebPush。
Cookie 会话、CSRF 令牌、登录限流,以及按角色的路由保护。路由上的路径参数和方法过滤器,来自页面模板的单页导航,以及用于测试所生成标记的辅助方法。参见 Auth。
如果您用 Telerik 或 DevExpress 的方式构建 ASP.NET Core MVC 或 Razor Pages 应用,sgcHTML 现在说着同样的语言。<sgc-grid>、<sgc-form>、<sgc-dialog> 和 <sgc-chart> 等 Tag Helper,以及 Html.Sgc() 下与之对应的流式写法,会在服务器端渲染 Bootstrap 5 HTML,并通过 htmx 与您的控制器通信。无需学习 JavaScript 框架,也无需编写 JSON 数据源。Razor 层包含在 esegece.sgcHTML.AspNetCore NuGet 包中,Community 版同样可用,并将随即将发布的 2026.10.0 版本到来。
<sgc-grid> 在服务器端完成分页、排序、筛选(文本和范围)、搜索,并可导出为 XLSX 和 PDF。控制器只需返回 this.SgcGrid(request, query),EF Core 会把每一次点击转换为参数化 SQL。push-url 会把页码、排序和筛选条件保存在地址栏中,因此刷新页面和后退按钮都能正常工作。
<sgc-textbox>、<sgc-select>、<sgc-datepicker>、<sgc-checkbox> 和 <sgc-autocomplete> 通过 asp-for 绑定到您的模型,并在每个输入框下方显示 ModelState 错误。<sgc-form hx="true"> 通过 htmx 提交,保存成功后 this.SgcRedirect(url) 负责跳转。
任何带有 sgc-dialog="name" 的元素都会把其 URL 加载到 <sgc-dialog> 中。提交成功后,this.SgcCloseDialog("edit-order", refresh: "orders") 会关闭对话框并重新加载网格,这就是无需自己编写脚本的弹窗编辑模式。
<sgc-chart> 可以渲染静态数据,可以用 refresh-every="5s" 轮询某个 action,也可以设置 live="true":后台服务调用 hub.BroadcastChartAsync(...),每个打开的浏览器都会通过 sgcHTML WebSocket 重绘图表。Telerik 和 DevExpress 的图表需要 SignalR 相关代码才能实现服务器推送,而 sgcHTML 已内置此功能。
@* Views/Orders/Index.cshtml, page 1 renders inline from the model *@
@model IQueryable<OrderRow>
<sgc-grid name="orders" key="Id" items="Model"
asp-action="Read" asp-export-action="Export" export="xlsx,pdf"
page-size="15" sortable="true" filterable="true"
searchable="true" push-url="true">
<sgc-column field="Reference" searchable="true" />
<sgc-column field="Customer" searchable="true" />
<sgc-column field="OrderDate" title="Date" format="{0:yyyy-MM-dd}" filter="range" />
<sgc-column field="Total" format="{0:N2}" align="right" filter="range" />
<sgc-column field="Paid" />
</sgc-grid>
// Program.cs
builder.Services.AddControllersWithViews();
builder.Services.AddSgcHtml(o => o.ServeRootPage = false); // the MVC app owns "/"
builder.Services.AddSgcHtmlRazor(); // SgcDataRequest binder, grid state, /sgcHTML.css
// ...
app.UseWebSockets(); // before UseSgcHtml, needed by live charts
app.UseSgcHtml();
app.MapDefaultControllerRoute();
// Controllers/OrdersController.cs
public class OrdersController : Controller
{
private readonly ShopDb FDb;
public OrdersController(ShopDb db) { FDb = db; }
// An IQueryable projection: EF Core turns paging, sort and filters into SQL.
private IQueryable<OrderRow> Rows() =>
FDb.Orders.AsNoTracking().Select(o => new OrderRow
{
Id = o.Id, Reference = o.Reference, Customer = o.Customer.Name,
OrderDate = o.OrderDate, Total = o.Total, Paid = o.Paid
});
public IActionResult Index() => View(Rows());
// Every page, sort, filter and search click of the grid lands here.
public IActionResult Read(SgcDataRequest request) => this.SgcGrid(request, Rows());
// The toolbar export links: the filtered and sorted rows as XLSX or PDF.
public IActionResult Export(SgcDataRequest request) =>
this.SgcGridExport(request, Rows(), "orders");
}
@* The same grid with the fluent builder, the twin of Html.Kendo().Grid<T>() *@
@(Html.Sgc().Grid<OrderRow>("orders")
.Key(o => o.Id)
.Columns(c =>
{
c.Bound(o => o.Reference).Searchable();
c.Bound(o => o.Customer).Searchable();
c.Bound(o => o.OrderDate).Title("Date").Format("{0:yyyy-MM-dd}").Filter(SgcGridFilterKind.Range);
c.Bound(o => o.Total).Format("{0:N2}").Align("right").Filter(SgcGridFilterKind.Range);
c.Bound(o => o.Paid);
})
.Items(Model)
.Read("Read")
.Export(SgcExportFormat.Xlsx, SgcExportFormat.Pdf)
.ExportAction("Export")
.Pageable(15)
.Sortable().Filterable().Searchable().PushUrl())
@* _Layout.cshtml: live="ws" opens the WebSocket that live charts listen to *@
<sgc-scripts live="ws" />
@* The view *@
<sgc-chart name="live-orders" type="line" height="260" live="true">
<sgc-series name="Orders / s" data="new double[] { 0 }" color="#dc3545" />
</sgc-chart>
// builder.Services.AddHostedService<LiveSalesFeed>();
public sealed class LiveSalesFeed : BackgroundService
{
private readonly ISgcHtmlHub FHub;
private readonly Queue<string> FLabels = new Queue<string>();
private readonly Queue<double> FValues = new Queue<double>();
public LiveSalesFeed(ISgcHtmlHub hub) { FHub = hub; }
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var oRandom = new Random();
while (!stoppingToken.IsCancellationRequested)
{
await Task.Delay(1000, stoppingToken);
FLabels.Enqueue(DateTime.Now.ToString("HH:mm:ss"));
FValues.Enqueue(oRandom.Next(0, 20));
if (FValues.Count > 20) { FLabels.Dequeue(); FValues.Dequeue(); }
// One WebSocket message redraws the chart in every open browser.
await FHub.BroadcastChartAsync("live-orders", FLabels.ToArray(),
new SgcChartSeries("Orders / s", FValues.ToArray(), "#dc3545"));
}
}
}
从 Telerik UI for ASP.NET Core 或 DevExpress 迁移?[DataSourceRequest] 变为 SgcDataRequest,ToDataSourceResult 变为 this.SgcGrid(request, query)(只需要数据时用 query.ToSgcDataResult(request)),Html.Kendo().TextBoxFor(m => m.X) 变为 Html.Sgc().TextBoxFor(m => m.X)。可运行的 MVC 演示 22.RazorMvc 是用 sgcHTML 在 EF Core 之上重写的 Telerik 订单示例。
sgcHTML 将您现有的 Delphi、C++ Builder 或 .NET 后端变成一个 Web 应用服务器。每个组件都是一个发出 Bootstrap 5 HTML 的原生类;htmx 让页面保持交互和实时,无需手写一行 JavaScript。
每个控件都是一个类 — TsgcHTMLComponent_Chart、TsgcHTMLComponent_Grid、TsgcHTMLComponent_Form 等 86 个。设置其属性,然后读取其 HTML 属性,即可获得干净、可直接服务的 Bootstrap 5 标记。
放置一个 TsgcHTMLEngine_Server(或将 HTML 接入现有的 TsgcWebSocketHTTPServer)。请求到达您的 OnCommandGet 处理器;您用由组件构建的页面进行响应。无需外部 Web 技术栈。
sgcHTML 并不绑定于 sgcWebSockets 服务器。通过 TsgcHTMX_Engine_Server_WebBroker,从任何 Embarcadero WebBroker 应用程序提供同一批由组件构建的页面,或者从 DataSnap 服务器提供,并在与您的 REST 端点相同的端口上实现实时 WebSocket 推送。
添加一个 TsgcHTMX_Engine_Server,点击、表单提交和实时更新便会往返于您的 Pascal/C# 事件处理器。服务器就地替换 HTML 片段 — 拥有 SPA 般的体验,却没有任何 JavaScript 构建链。
由于 htmx 运行在 sgcWebSockets 服务器之上,您可以向每个已连接的浏览器推送实时 HTML。仪表板、监控器和聊天窗口会在您的数据变化的瞬间更新 — 由服务器驱动,无需轮询。 在代理屏蔽 WebSocket 的地方,同一页面可以改为通过服务器发送事件接收更新。
TsgcHTMLTemplate_Bootstrap 将您的内容包装成一个完整的响应式文档;TsgcHTMLThemeController 和 TsgcHTMLThemeBuilder 提供明亮/暗黑主题和共享样式表。Bootstrap 5.3 和 htmx 已内嵌发布 — 运行时无需 CDN。
Grid、DataTable、Chart、Select、TreeView、Scheduler、Timeline 和 Form 通过 LoadFromDataSet / DataSource 直接绑定到 TDataSet。将组件指向一个查询,它便会渲染出这些行。
sgcHTML 内置了 17 种语言的 UI 文本(按钮、标签、验证消息):英语、西班牙语、法语、德语、葡萄牙语、意大利语、荷兰语、瑞典语、挪威语、波兰语、捷克语、土耳其语、俄语、中文、日语、韩语和阿拉伯语。使用 sgcHTMLSetLanguage 选择其中一种,组件便会以访问者的语言渲染,并采用正确的原生文字,包括中日韩文字、西里尔文和阿拉伯文。阿拉伯语、希伯来语等从右到左的语言会让整个页面自动翻转:页面以 dir="rtl" 渲染,加载 Bootstrap 的 RTL 样式表,并镜像侧边栏、网格、步骤条、聊天及其他组件,无需修改代码。
每个组件都会将其动态文本、属性、内联 JavaScript 和 URL 通过自动的 HTML、属性、JavaScript 和 URL 编码以及 URL 净化(sgcHTMLEncode、sgcHTMLAttrEncode、sgcJSEncode、sgcHTMLSanitizeURL)进行处理,因此用户数据无法突破其上下文并注入脚本。XSS 和注入防护无需额外工作即可启用。
从导航框架到数据网格、图表、表单、覆盖层和 AI 聊天 — 完整的 Bootstrap 5 词汇表,皆为原生组件。每一个都链接到自己的页面,附有 Delphi、C++ Builder 和 .NET 示例。
NavBar、Sidebar、Breadcrumb、Tabs、Pagination、Toolbar、TreeView、Stepper、Dropdown、ButtonGroup、ListGroup、DashboardLayout、Splitter。
查看组件 →Grid、DataTable、TreeGrid、PivotTable、Calendar、Scheduler、Timeline、ActivityFeed、KanbanBoard、Gantt — 可排序、可筛选、可导出、可绑定数据集。
查看组件 →Chart(Chart.js)、CandlestickChart、Gauge、Heatmap、Sparkline、TreeMap、Diagram(SVG 流程图)、Map(Leaflet)、QRCode、Barcode — 来自您自己数据集的数据驱动视觉效果。
查看组件 →Form、Edit、Memo、CheckBox、RadioGroup、Select、MultiSelect、InputGroup、AutoComplete、DatePicker、TimePicker、ColorPicker、Slider、FileUpload、RichEditor、Rating、SignaturePad、Transfer。
查看组件 →Panel、StatCard、Accordion、Carousel、Image、Avatar、Video、Badge、PDFViewer — 用于仪表板的卡片、媒体和 KPI 磁贴。
查看组件 →Modal、Offcanvas、Popover、Toast、Snackbar、Notification、Spinner、Placeholder、ContextMenu、ProgressBar、JobProgress、LogViewer — 对话框和状态展示。
查看组件 →Login、SocialLogin(OAuth)、OAuthCallback、WebAuthnLogin(通行密钥)、UserManagement、RolesPermissions — 现成的登录流程和管理界面。
查看组件 →Gauge、LinearGauge、LED、LEDBar、SegmentDisplay、Odometer、AnalogClock、Compass、VUMeter、Knob、ToggleSwitch、PushButton、NumericStepper、StripChart、Oscilloscope、Annunciator、SCADAPanel。控制室面板由服务器保持实时更新,并支持 MQTT 绑定。
查看组件 →EngineServer、HTMXEngine、PageBuilder、TemplateBootstrap、ThemeController、ThemeBuilder、HTMXFragment、HTMXRouter — 提供页面服务并保持其实时性的非可视化部件。
查看组件 →启动一个 HTTP 服务器,附加 htmx 引擎,然后用由组件构建的页面响应请求。Delphi、C++ Builder 和 .NET 中是相同的 API。
uses
sgcWebSocket_Server, sgcHTMX_Engine_Server,
sgcHTML_Template_Bootstrap, sgcHTML_Component_Chart;
// 1. Start a server and attach the htmx engine
FServer := TsgcWSHTTPServer.Create(nil);
FServer.Port := 8080;
FServer.OnCommandGet := HandleGet;
FHTMX := TsgcHTMX_Engine_Server.Create(nil);
FHTMX.Server := FServer; // realtime htmx over WebSocket
FServer.Active := True;
// 2. Build the page from components
function TForm1.BuildDashboard: string;
var
oChart: TsgcHTMLComponent_Chart;
oPage: TsgcHTMLTemplate_Bootstrap;
begin
oChart := TsgcHTMLComponent_Chart.Create(nil);
oPage := TsgcHTMLTemplate_Bootstrap.Create(nil);
try
oChart.ChartType := ctBar;
oChart.AddLabel('Q1'); oChart.AddLabel('Q2'); oChart.AddLabel('Q3');
oChart.AddDataset('Revenue', [1200, 1900, 1500],
'#7C3AED', 'rgba(124,58,237,.25)', True);
oPage.Title := 'Dashboard';
oPage.BodyContent := oChart.HTML; // component -> HTML
Result := oPage.GetHTML; // full Bootstrap document
finally
oPage.Free;
oChart.Free;
end;
end;
// includes: sgcWebSocket_Server.hpp, sgcHTMX_Engine_Server.hpp,
// sgcHTML_Template_Bootstrap.hpp, sgcHTML_Component_Chart.hpp
// 1. Start a server and attach the htmx engine
FServer = new TsgcWSHTTPServer(this);
FServer->Port = 8080;
FServer->OnCommandGet = HandleGet;
FHTMX = new TsgcHTMX_Engine_Server(this);
FHTMX->Server = FServer; // realtime htmx over WebSocket
FServer->Active = true;
// 2. Build the page from components
String __fastcall TForm1::BuildDashboard()
{
TsgcHTMLComponent_Chart *oChart = new TsgcHTMLComponent_Chart(NULL);
TsgcHTMLTemplate_Bootstrap *oPage = new TsgcHTMLTemplate_Bootstrap(NULL);
try
{
oChart->ChartType = ctBar;
oChart->AddLabel("Q1"); oChart->AddLabel("Q2"); oChart->AddLabel("Q3");
oChart->AddDataset("Revenue", OPENARRAY(double, (1200, 1900, 1500)),
"#7C3AED", "rgba(124,58,237,.25)", true);
oPage->Title = "Dashboard";
oPage->BodyContent = oChart->HTML; // component -> HTML
return oPage->GetHTML(); // full Bootstrap document
}
__finally
{
delete oPage;
delete oChart;
}
}
using esegece.sgcWebSockets;
// 1. Start a server and attach the htmx engine
var server = new TsgcWebSocketHTTPServer();
server.Port = 8080;
server.OnCommandGet += HandleGet;
var htmx = new TsgcHTMX_Engine_Server();
htmx.Server = server; // realtime htmx over WebSocket
server.Active = true;
// 2. Build the page from components
string BuildDashboard()
{
var chart = new TsgcHTMLComponent_Chart();
chart.ChartType = TsgcHTMLChartType.ctBar;
chart.AddLabel("Q1"); chart.AddLabel("Q2"); chart.AddLabel("Q3");
chart.AddDataset("Revenue", new double[] { 1200, 1900, 1500 },
"#7C3AED", "rgba(124,58,237,.25)", true);
var page = new TsgcHTMLTemplate_Bootstrap();
page.Title = "Dashboard";
page.BodyContent = chart.HTML; // component -> HTML
return page.GetHTML(); // full Bootstrap document
}
当您想用一行代码实现一个控件时,使用现成的组件;当您需要完全控制标记时,则深入到节点层。
109 个 TsgcHTMLComponent_* 控件。配置属性,可选地绑定数据集,读取 HTML。许多组件还提供一个静态 Build(...) 辅助方法,用于一行内联使用。
TsgcHTMLContainer(带有用于自闭合标签的 Void 标志)、TsgcHTMLCard、TsgcHTMLForm、TsgcHTMLField、TsgcHTMLButton、TsgcHTMLTable 等基本元素可组合成任意布局,然后用 TsgcHTMLTemplate_Bootstrap 渲染。节点集还包含 Bootstrap 构建块,例如 TsgcHTMLModal、TsgcHTMLOffcanvas、TsgcHTMLAccordion、TsgcHTMLCarousel、TsgcHTMLToast、TsgcHTMLProgress、TsgcHTMLSpinner、TsgcHTMLListGroupNode、TsgcHTMLInputGroup、TsgcHTMLButtonGroupNode、TsgcHTMLRadio、TsgcHTMLBreadcrumb、TsgcHTMLNavbarNode 和 TsgcHTMLImage。
TsgcHTMLPageBuilder 及其设计时编辑器让您在 IDE 中组装页面,而 TsgcHTMLThemeController 在整个应用范围内管理明亮/暗黑主题。
通过 sgcCustomization HTML,您描述所需的应用,eSeGeCe 团队即使用 sgcHTML + sgcWebSockets 组件为您构建。三个一次性套餐,价格自 €149 起,您将收到一个可以使用已授权组件编译、扩展和重新设计样式的完整项目。
将 sgcHTML 与我们的其他 Delphi、C++ Builder 和 .NET 组件库搭配使用。
企业级 WebSocket、HTTP/2、MQTT、AMQP、WebRTC 和 AI/LLM 组件。为您的 sgcHTML 应用添加实时消息传递和完整的网络技术栈。
了解更多 →面向 Delphi、C++ Builder 和 .NET 的 QUIC 与 HTTP/3 客户端和服务器组件。通过 HTTP/3 提供 sgcHTML 渲染的界面,在不稳定网络上实现更低延迟的页面加载。
了解更多 →面向 Delphi 和 C++ Builder 的完整 WebRTC 媒体引擎:音视频通话、数据通道和屏幕共享。sgcWebSockets Enterprise 的附加组件。
了解更多 →面向 Delphi 和 C++ Builder 的 15 个 AI、LLM 和 MCP 组件。一个聊天组件即可接入 OpenAI、Anthropic、Gemini、DeepSeek、Ollama、Grok 和 Mistral。独立产品,已包含 sgcWebSockets Core 运行时。
了解更多 →面向 Delphi 和 C++ Builder 的 MQTT 3.1.1 和 5.0、AMQP 0.9.1、AMQP 1.0、Apache Kafka 与 STOMP 客户端组件。独立产品,已包含 sgcWebSockets Core 运行时。
了解更多 →面向 Delphi 和 C++ Builder 的通用密码学库:对称与非对称加密算法、哈希和后量子算法。自 sgcWebSockets Standard 起免费提供。
了解更多 →