<?xml version='1.0' encoding='gb2312'?>
<rss version='2.0'>
<channel>
<title>盒子论坛</title>
<description>DELPHI盒子技术论坛</description>
<link>https://bbs.2ccc.com/</link>
<language>zh-cn</language>
<copyright>Copyright 2004, bbs.2ccc.com</copyright>
<webMaster>root@2ccc.com</webMaster>
<docs>https://bbs.2ccc.com/rss.asp</docs>
<generator>Rss Generator By bbs.2ccc.com</generator>
<item>
<title><![CDATA[Steema TeeGrid Pro v1.17]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768481</link>
<author>tms2021 </author>
<description><![CDATA[控件下载请加QQ群：462884906

请勿转发！

通过网盘分享的文件：Steema TeeGrid Pro v1.17.7z
链接: https://pan.baidu.com/s/19iURNLGUX43vmhaoOSKt4A 提取码: 88xf 
--来自百度网盘超级会员v7的分享]]></description>
<comments>回复:7 浏览:141</comments>
<pubDate>Tue, 15 Sep 2026 03:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[TMS VCL UI Pack v13.6.9.0]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768480</link>
<author>tms2021 </author>
<description><![CDATA[控件下载请加QQ群：462884906

请勿转发！

通过网盘分享的文件：TMS VCL UI Pack v13.6.9.0 for Delphi & CB 7-13 Florence Full Source.7z
链接: https://pan.baidu.com/s/1PR0sW2W1dFvWLcFBHLTl2w 提取码: 6ak4 
--来自百度网盘超级会员v7的分享]]></description>
<comments>回复:0 浏览:65</comments>
<pubDate>Tue, 15 Sep 2026 03:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[windows11下delphi10.4.2无法使用attach to process进行调试]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768474</link>
<author>hh2001howlong </author>
<description><![CDATA[在windows11系统里，delphi10.4.2在用 run 菜单里的attach to process进行调试时，一开始就会卡住，怎么解决？]]></description>
<comments>回复:4 浏览:95</comments>
<pubDate>Mon, 14 Sep 2026 02:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[delphi面向模型编程]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768465</link>
<author>hnxxcxg </author>
<description><![CDATA[unit core.recordModel;
// cxg 2026
interface

uses
  Classes, Rtti,
  SysUtils, JSON, json.Serializers
  ;

type
  ByteStr = RawByteString;
  PByteStr = PRawByteString;

type
  // record&lt;-->json(binary)
  TRecordSerial&lt;T> = record
  public
    // json-->record
    class procedure unjson(const AJson: UTF8String; var AResult: T); static;
    // record-->json
    class procedure json(const ARecord: T; var AResult: UTF8String); static;
    //record-->binary
    class procedure bytes(const ARecord: T; var AResult: TBytes); static;
    class procedure bytestr(const ARecord: T; var AResult: ByteStr); static;
    class procedure stream(const ARecord: T; var AResult: TStream); static;
    //binary-->record
    class procedure unbytes(const ABytes: TBytes; var AResult: T); static;
    class procedure unbytestr(const AByteStr: ByteStr; var AResult: T); static;
    class procedure unstream(const AStream: TStream; var AResult: T); static;
  end;

type
  // Generate transaction SQL from a record
  TRecordCrud&lt;T> = record
    TableName: string;  //table name
    KeyFields: string;  //Primary keys
    NonSaveFields: string; //Do not save fields
    function SelectSQL(const ARecord: T): string;
    function InsertSQL(const ARecord: T): string;
    function DeleteSQL(const ARecord: T): string;
    function UpdateSQL(const ARecord: T): string;
  private
    function ProcessValue(const ARttiField: TRttiField; const ARecord: T): string;
  end;


implementation

{ TRecordSerial&lt;T> }

class procedure TRecordSerial&lt;T>.json(const ARecord: T; var AResult: UTF8String);
begin
  if @ARecord = nil then Exit;
  var LJsonSerializer: TJsonSerializer := TJsonSerializer.Create;
  try
    AResult := UTF8Encode(LJsonSerializer.Serialize&lt;T>(ARecord));
  finally
    LJsonSerializer.Free;
  end;
end;

class procedure TRecordSerial&lt;T>.stream(const ARecord: T; var AResult: TStream);
begin
  if @ARecord = nil then Exit;
  if AResult = nil then
    AResult := TMemoryStream.Create;
  AResult.Write(ARecord, SizeOf(ARecord));
  AResult.Position := 0;
end;

class procedure TRecordSerial&lt;T>.bytes(const ARecord: T; var AResult: TBytes);
var len: Integer;
begin
  if @ARecord = nil then Exit;
  len := SizeOf(ARecord);
  SetLength(AResult, len);
  Move(ARecord,  PByte(AResult)^, len);
end;

class procedure TRecordSerial&lt;T>.bytestr(const ARecord: T; var AResult: RawByteString);
var len: Integer;
begin
  if @ARecord = nil then Exit;
  len := SizeOf(ARecord);
  SetLength(AResult, len);
  Move(ARecord, PByteStr(AResult)^, len);
end;

class procedure TRecordSerial&lt;T>.UnJson(const AJson: UTF8String; var AResult: T);
begin
  if AJson = '' then
    Exit;
  var LJsonSerializer: TJsonSerializer := TJsonSerializer.Create;
  try
    AResult := LJsonSerializer.Deserialize&lt;T>(string(AJson));
  finally
    LJsonSerializer.Free;
  end;
end;

class procedure TRecordSerial&lt;T>.unstream(const AStream: TStream; var AResult: T);
begin
  if AStream = nil then Exit;
  AStream.Read(AResult, AStream.Size);
end;

class procedure TRecordSerial&lt;T>.unbytes(const ABytes: TBytes; var AResult: T);
var len: Integer;
begin
  len := Length(ABytes);
  if len = 0 then Exit;
  Move(PByte(ABytes)^, AResult, len);
end;

class procedure TRecordSerial&lt;T>.unbytestr(const AByteStr: RawByteString; var AResult: T);
var len: Integer;
begin
  len := Length(AByteStr);
  if len = 0 then Exit;
  Move(PByteStr(AByteStr)^, AResult, len);
end;

{ TRecordCrud&lt;T> }

function TRecordCrud&lt;T>.DeleteSQL(const ARecord: T): string;
var
  LRttiContext: TRttiContext;
  LRttiType: TRttiType;
  LRttiField: TRttiField;
  LWhere, LValue: string;
begin
  if (@ARecord = nil) or (TableName = '') or (KeyFields = '') then
    Exit;
  LRttiContext := TRttiContext.Create;
  try
    LRttiType := LRttiContext.GetType(TypeInfo(T));
    LValue := '';
    LWhere := '';
    for LRttiField in LRttiType.GetFields do
    begin
      if Pos(LRttiField.Name, KeyFields) = 0 then //Only primary keys can be used as WHERE conditions
        Continue;
      LValue := ProcessValue(LRttiField, ARecord);
      LWhere := LWhere + ' and ' + LRttiField.Name + '=' + LValue;
    end;
    System.Delete(LWhere, 1, 5);
    Result := 'delete from ' + TableName + ' where ' + LWhere;
  finally
    LRttiContext.Free;
  end;
end;

function TRecordCrud&lt;T>.InsertSQL(const ARecord: T): string;
var
  LRttiContext: TRttiContext;
  LRttiType: TRttiType;
  LRttiField: TRttiField;
  LFields, LValues, LValue: string;
begin
  if (@ARecord = nil) or (TableName = '') then
    Exit;
  LRttiContext := TRttiContext.Create;
  try
    LRttiType := LRttiContext.GetType(TypeInfo(T));
    LFields := '';
    LValues := '';
    LValue := '';
    for LRttiField in LRttiType.GetFields do
    begin
      if Pos(LRttiField.Name, NonSaveFields) &lt;> 0 then //Do not save fields
        Exit;
      LFields := LFields + ',' + LRttiField.Name;
      LValue := ProcessValue(LRttiField, ARecord);
      LValues := LValues + ',' + LValue;
    end;
    System.Delete(LFields, 1, 1);
    System.Delete(LValues, 1, 1);
    Result := 'insert into ' + TableName + ' (' + LFields + ') values (' +
      LValues + ')';
  finally
    LRttiContext.Free;
  end;
end;

function TRecordCrud&lt;T>.ProcessValue(const ARttiField: TRttiField; const ARecord: T): string;
begin
  if (@ARecord = nil) or (ARttiField = nil) then
    Exit;
  //TDateTime convert to string
  if ARttiField.FieldType.ToString = 'TDateTime' then
    Result := FormatDateTime('yyyy-mm-dd hh:nn:ss',
      ARttiField.GetValue(@ARecord).AsType&lt;TDateTime>)
  else if ARttiField.FieldType.ToString = 'TDate' then
    Result := FormatDateTime('yyyy-mm-dd', ARttiField.GetValue(@ARecord)
      .AsType&lt;TDate>)
  else if ARttiField.FieldType.ToString = 'TTime' then
    Result := FormatDateTime('hh:nn:ss', ARttiField.GetValue(@ARecord)
      .AsType&lt;TTime>)
  else
    Result := ARttiField.GetValue(@ARecord).ToString;
  //QuotedStr() process sql-string
  if (ARttiField.FieldType.ToString = 'string') or
    (ARttiField.FieldType.ToString = 'TDateTime') or
    (ARttiField.FieldType.ToString = 'TDate') or
    (ARttiField.FieldType.ToString = 'TTime') then
    Result := QuotedStr(Result);
end;

function TRecordCrud&lt;T>.SelectSQL(const ARecord: T): string;
var
  LRttiContext: TRttiContext;
  LRttiType: TRttiType;
  LRttiField: TRttiField;
  LFields: string;
begin
  if (@ARecord = nil) or (TableName = '') then
    Exit;
  LRttiContext := TRttiContext.Create;
  try
    LRttiType := LRttiContext.GetType(TypeInfo(T));
    LFields := '';
    for LRttiField in LRttiType.GetFields do
    begin
      LFields := LFields + ',' + LRttiField.Name;
    end;
    System.Delete(LFields, 1, 1);
    Result := 'select ' + LFields + ' from ' + TableName;
  finally
    LRttiContext.Free;
  end;
end;

function TRecordCrud&lt;T>.UpdateSQL(const ARecord: T): string;
var
  LRttiContext: TRttiContext;
  LRttiType: TRttiType;
  LRttiField: TRttiField;
  LWhere, LValue, LSet: string;
begin
  if (@ARecord = nil) or (TableName = '') or (KeyFields = '') then
    Exit;
  LRttiContext := TRttiContext.Create;
  try
    LRttiType := LRttiContext.GetType(TypeInfo(T));
    LValue := '';
    LWhere := '';
    LSet := '';
    for LRttiField in LRttiType.GetFields do
    begin
      if Pos(LRttiField.Name, NonSaveFields) &lt;> 0 then //Do not save fields
        Exit;
      LValue := ProcessValue(LRttiField, ARecord);
      LSet := LSet + ',' + LRttiField.Name + '=' + LValue;
      if Pos(LRttiField.Name, KeyFields) = 0 then //Only primary keys can be used as WHERE conditions
        Continue;
      LWhere := LWhere + ' and ' + LRttiField.Name + '=' + LValue;
    end;
    System.Delete(LWhere, 1, 5);
    System.Delete(LSet, 1, 1);
    Result := 'update ' + TableName + ' set ' + LSet + ' where ' + LWhere;
  finally
    LRttiContext.Free;
  end;
end;

end.]]></description>
<comments>回复:8 浏览:316</comments>
<pubDate>Sun, 13 Sep 2026 07:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[发现一个有意思的项目：Kylix]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768446</link>
<author>pcplayer </author>
<description><![CDATA[https://kylix.top/

Kylix 是 Pascal 的现代化重构：双后端编译（Go 转译 + LLVM 原生）。
带类型推导、泛型、注解语法、KylixBoot Web 框架、WASM/WASI 支持，
以及完整 IDE 工具链 — Pascal 的清晰，Go 的速度，现代语言的力量。]]></description>
<comments>回复:20 浏览:673</comments>
<pubDate>Thu, 10 Sep 2026 11:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[看了一下 Delphi 官方网站关于 KAI 的新文章，顺藤摸瓜]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768436</link>
<author>pcplayer </author>
<description><![CDATA[让 DeepSeek 解释了一下 KAI 用到的新东西。以下内容是 DeepSeek 生成的：

## 一、译文

Kai 1.1 最大的变化是集成了 ACP Registry。

此前，与不同 CLI AI 引擎的集成是随 Kai 一起发布的。到了 1.1 版本，这些集成会在安装完成后从公共注册中心下载。这让 Kai 能够接入一个更广泛、且持续演进的 agent 生态系统。

ACP Registry 是一个 AI agent 的公共注册中心，由 JetBrains 和 Zed Industries 共同拥有并维护，Kai 1.1 用它来管理自身的集成。ACP Registry 目前包含 35 个以上的 agent，既包括已经支持的 agent，如 Claude、GPT-5 和 Gemini CLI，也包括新的选项，如 Antigravity、Grok、Mistral、Cursor、Devin、Kilo Code 和 Junie。用户可以搜索该注册中心、筛选 agent、直接从 Kai 中安装它们，并在 Kai 配置中直接看到何时有更新可用。

---

## 二、概念解释

### 1. Kai 1.1 的最大变化：从“内置集成”变成“注册中心分发”

旧模式是：Kai 安装包里直接带着各种 CLI AI 引擎的集成。也就是说，Kai 发布新版本时，才可能顺带更新这些集成。

新模式是：Kai 本体先安装，然后从 ACP Registry 这个公共注册中心下载所需集成。  
这类似于：

- 以前：软件自带所有插件，插件更新要等软件发新版；
- 现在：软件像“应用商店客户端”，插件从商店按需下载和更新。

所以，真正的变化不只是“支持了更多 AI”，而是**集成的分发方式、更新方式和生态模式变了**。

### 2. ACP Registry 是什么？

ACP Registry 可以理解为一个“AI agent 的应用商店/目录/注册中心”。

- **Registry**：注册中心、目录，不是模型本身，也不是聊天记录，而是列出、管理和分发 agent 的地方。
- **ACP**：通常指 Agent Client Protocol，即“代 理客户端协议”。它让 IDE、编辑器或客户端，比如 Kai、Zed，能够用相对统一的方式连接和调用不同的 AI agent。
- **公共注册中心**：说明它不是完全私有的内置列表，而是对外开放、可搜索、可筛选、可安装的目录。
- **由 JetBrains 和 Zed Industries 共同拥有并维护**：这说明它想成为跨 IDE、跨编辑器的开放生态，而不是 JetBrains 一家独占的私有集成列表。

因此，ACP Registry 的作用是：让支持 ACP 的客户端发现 agent，让 agent 提供方分发自己，让用户按需安装和更新。

### 3. CLI AI 引擎和 Agent 是什么？

**CLI AI 引擎**：以命令行方式运行或交互的 AI 工具。例如 Claude Code、Gemini CLI 这类工具。它们通常不只是回答问题，还能执行命令、读取文件、修改代 码等。

**Agent**：AI 代 理。它比普通聊天机器人更自主，通常可以规划任务、调用工具、读写文件、运行命令、完成多步操作。  
文中把 Claude、GPT-5、Gemini CLI、Antigravity、Grok、Mistral、Cursor、Devin、Kilo Code、Junie 等都称为 agent。严格来说，它们中有些是模型，有些是 CLI 工具，有些是代 理产品，但在这里都被视为可以接入 Kai 的 AI 能力。

### 4. 对用户意味着什么？

用户可以：

- 在 ACP Registry 中搜索 agent；
- 按条件筛选 agent；
- 直接从 Kai 中安装；
- 在 Kai 配置里看到哪些 agent 有更新；
- 不再只能使用 Kai 安装包中预置的固定集成。

这意味着 Kai 从“自带一批固定 AI 集成”的工具，变成了一个更像“AI agent 客户端/管理器”的平台。用户的选择更多，更新也更快。

### 5. 对生态意味着什么？

对 Kai：

- 减少把每个集成都打包进安装包的压力；
- 不必等 Kai 发新版才能更新某个 agent 集成；
- 可以接入更广、持续演进的 agent 生态。

对 agent 提供方：

- 可以通过公共注册中心分发；
- 可以独立更新；
- 可以触达 Kai、Zed 以及其他支持 ACP 的客户端。

对用户：

- 更灵活、更可插拔；
- 但也要关注权限、安全、兼容性、质量和注册中心治理问题。

### 6. 一句话总结

Kai 1.1 把 AI agent 集成从“随 Kai 安装包内置发布”，改成了“通过 JetBrains 与 Zed 共建的 ACP Registry 按需安装和更新”。这使 Kai 更像一个可插拔的 AI agent 客户端和应用商店，而不是一个把所有集成都捆绑在自身版本里的封闭工具。
Kai 1.1 把 AI agent 集成从“随 Kai 安装包内置发布”，改成了“通过 JetBrains 与 Zed 共建的 ACP Registry 按需安装和更新”。这使 Kai 更像一个可插拔的 AI agent 客户端和应用商店，而不是一个把所有集成都捆绑在自身版本里的封闭工具。]]></description>
<comments>回复:5 浏览:234</comments>
<pubDate>Thu, 10 Sep 2026 06:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[ChromeTabs 控件的使用问题]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768426</link>
<author>pcplayer </author>
<description><![CDATA[刚刚下载了一个 ChromeTabs 控件。看它的 Demo 程序，设计期，这个 ChromeTabs 在 Form 的顶部，在 Form 的 Caption 底下。运行期，它直接占用了 Form 的 Caption 区域，但 Form 的 Caption 区域右边的最大化，最小化按钮还在。这样的外观看起来和 Chrome 浏览器一致。

我自己新建一个工程，放一个 ChromeTabs 上去，置顶，在设计期看到的情况和它的 Demo 一样。但运行起来，看到的是 Form 的 Caption 还在，ChromeTabs 在 Form 的 Caption 下方。

请教各位大咖，这里是需要单独做什么设置吗？]]></description>
<comments>回复:7 浏览:287</comments>
<pubDate>Tue, 08 Sep 2026 06:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[各位论坛成员请注意。Help Help Help]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768385</link>
<author>emailx45 </author>
<description><![CDATA[各位论坛成员请注意。

[b]我的YouTube频道还需要9个订阅才能达到500个订阅者。[/b]

请问有人可以订阅我的频道，帮我达成这个目标吗？

非常感谢所有能够提供帮助的成员。

www.youtube.com/@emailx45


I’d like to ask for the attention of my fellow forum members. 

[b]I need 9 more subscribers to reach the 500-subscriber mark on my YouTube channel. [/b]

Would anyone be willing to subscribe so I can hit this goal?

Many thanks to all the members who are able to help.

www.youtube.com/@emailx45]]></description>
<comments>回复:15 浏览:535</comments>
<pubDate>Thu, 03 Sep 2026 18:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[Free Video Downloader 桌面端无水印视频下载器 [含附件]]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768374</link>
<author>wntee </author>
<description><![CDATA[基于 Tauri v2 + React 18 + TypeScript + Vite + Tailwind CSS 构建的高性能跨平台桌面端短视频无水印下载工具。
https://github.com/MufeeSama/FreeVideoDownloader
下载地址:https://wwaqx.lanzoum.com/iMJiN45ll6cf]]></description>
<comments>回复:3 浏览:252</comments>
<pubDate>Thu, 03 Sep 2026 01:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[现代化客服与聊天快捷话术与智能吸附助手 [含附件]]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768362</link>
<author>wntee </author>
<description><![CDATA[https://github.com/MufeeSama/ChatHelper

基于 Python 3 + pywebview (Microsoft Edge WebView2) + Vue 3 (Vite) 打造的现代化客服与聊天快捷话术与智能吸附助手。专为电商客服、社群运营、销售团队及多会话重度用户设计，提供 0 延迟原生贴边跟随、多模态附件发送、智能变量插值与优雅的 Fluent 毛玻璃界面。]]></description>
<comments>回复:5 浏览:242</comments>
<pubDate>Wed, 02 Sep 2026 08:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[TMS 2026年9月合集]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768356</link>
<author>tms2021 </author>
<description><![CDATA[感谢007

控件下载请加QQ群：462884906

请勿转发！

通过网盘分享的文件：TMS20260901.7z
链接: https://pan.baidu.com/s/1zMijS7EmwjBvDgBMM6ObHg 提取码: x2c7 
--来自百度网盘超级会员v7的分享]]></description>
<comments>回复:10 浏览:441</comments>
<pubDate>Wed, 02 Sep 2026 02:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[求助Delphi的正则表达式问题 [含附件]]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768353</link>
<author>mp654kk </author>
<description><![CDATA[在IDE的文本替换窗口里使用正则表达式替换
举例比如我想把字符串 数组名称[行][列] 替换成 函数(行,列)

我在记事本里用notpad++的替换功能使用
数组名称\[(.*)\]\[(.*)\]
替换为
函数\(\1,\2\)

结果正确,Delphi里咋就不行呢 替换后结果变成了 函数(,)]]></description>
<comments>回复:4 浏览:173</comments>
<pubDate>Tue, 01 Sep 2026 16:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[需要编译x64及linux，哪个版本的delphi最稳定？]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768349</link>
<author>pherody </author>
<description><![CDATA[我现在用delphi 11 update3.]]></description>
<comments>回复:7 浏览:474</comments>
<pubDate>Tue, 01 Sep 2026 01:09:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[delphi-toolbox.source-archive.zip [含附件]]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768345</link>
<author>keymark </author>
<description><![CDATA[backup]]></description>
<comments>回复:2 浏览:259</comments>
<pubDate>Mon, 31 Aug 2026 06:08:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[cnpack遇到特殊字符格式化有点问题]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768336</link>
<author>mp654kk </author>
<description><![CDATA[delphi13.1
fmx 
cw版本 1.8.0.1366_Nightly Build 2026.08.17

https://bbs.cnpack.org/viewthread.php?tid=241229&extra=page%3D1

注:之所以直接用来命名是为了代码提示用起来方便]]></description>
<comments>回复:3 浏览:138</comments>
<pubDate>Sun, 30 Aug 2026 07:08:00 GMT</pubDate>
</item>
</channel></rss>