<?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[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>回复:1 浏览:36</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>回复:17 浏览:455</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 浏览:180</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 浏览:265</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>回复:14 浏览:507</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 浏览:243</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 浏览:235</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 浏览:413</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 浏览:168</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 浏览:444</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 浏览:256</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 浏览:135</comments>
<pubDate>Sun, 30 Aug 2026 07:08:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[Delphi 13 奇怪的现象]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768304</link>
<author>pcplayer </author>
<description><![CDATA[电脑上装了 Delphi 13，桌面上有图标。双击图标，Delphi 13 启动。一切正常。
在 https://github.com/standard-software/WindowTabs/releases 下载了这个 WinTabs 的 ZIP 包，解压缩后是几个文件，其中一个是 WindowTabs.exe，双击 WindowTabs.exe，这个 EXE 没启动，Delphi 13 启动了。反复验证，每次都是启动 Delphi 13]]></description>
<comments>回复:9 浏览:463</comments>
<pubDate>Wed, 26 Aug 2026 12:08:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[适用于 Delphi 13.1 的 E45Formatter (Ctrl+D) 已更新！支持长目录名称 (07/Sep/2026) [含附件]]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768284</link>
<author>emailx45 </author>
<description><![CDATA[How to install and use:

1) Choose to install for either your 32-bit or 64-bit IDE (there are two builds available).
2) In the IDE, use Delphi's "Install Components" menu.
3) Specify the location of the "BPL" file for your chosen platform;
3.1) You can place this file in any folder you wish;
3.2) The directory path can use either long or short filenames;
3.3) Testing was performed using English names, but it should work with other languages.
4) Once done, a new menu will appear in the IDE allowing you to configure the two required parameters:
4.1) Specify the location of the "Formatter.exe" executable on your system;
4.2) Specify the location of the "Formatter" configuration file (i.e., "E45Formatter.config");
4.3) You can place these files in any directory you wish;
4.4) The directory path for these two files can use long filenames or not.
5) That's it—you're all set!
6) To format your code, have the file open in the Delphi code editor and press "Ctrl+D".
7) To check for any errors, press "Ctrl+F2".
8) To uninstall the plugin, reverse the installation steps by removing the "BPL" file from the IDE settings.
9) Happy coding!

----------

安装和使用方法：

1) 选择在您的 32 位或 64 位 IDE 中安装（有两个版本）
2) 在 IDE 中，使用 Delphi 的“安装组件”菜单
3) 指定所选平台的“BPL”文件所在位置；
3.1) 您可以将此文件放在任何文件夹中；
3.2) 目录名称可以是长名称或短名称
3.3) 仅测试了英文名称，但应该也适用于其他语言
4) 完成后，您将在 IDE 菜单中看到一个新菜单，用于配置两个必要的参数：
4.1) 您必须指定“Formatter.exe”可执行文件在您系统中的位置
4.2) 您必须指定“Formatter”配置文件（即“E45Formatter.config”文件）的位置
4.3) 您可以将它们放在任何目录中。
4.4) 这两个文件所在的目录名称可能很长，也可能很短。
5) 完成以上步骤后，就可以开始使用了！
6) 要格式化代码，您必须在 Delphi 代码编辑器中打开该文件，然后按“Ctrl+D”键。
7) 要检查是否出现任何错误，请使用“Ctrl+F2”键。
8) 要卸载插件，请反向执行安装过程，从 IDE 设置中删除“BPL”文件。
9) 祝您编码愉快！


New revision of my "Formatter" plugin (Ctrl+D) for Delphi 13.1
1) The code has been revised, and a lot of "bloat" has been removed.
2) It is now possible to use directory names that are long and contain spaces.
3) Testing in Chinese is required due to the use of Unicode characters.
4) It has been tested with long directory names containing spaces in English and Portuguese, so it should work in other languages.
5) You can place the files (all of them) in any directory you like; they do not need to be inside the RAD Studio directory!
6) The files do not need to be in the same directory; you choose where to place them!

Delphi 13.1 的“格式化程序”（Ctrl+D）插件新版本发布

1) 代码已更新，移除了许多冗余代码
2) 现在可以处理包含长名称和空格的目录
3) 由于使用了 Unicode 字符，需要用中文进行测试
4) 已在英文和葡萄牙文中测试过包含长名称和空格的目录，因此应该也能在其他语言中正常工作
5) 您可以将（所有）文件放置在任何您想要的目录中，它们无需位于 RAD Studio 目录内！
6) 文件无需位于同一目录，您可以自行选择放置位置！

[b]( LINK DELETED ) --> USE LINK BELOW...
（链接已移除）--> 请使用以下链接……
[/b]
...]]></description>
<comments>回复:16 浏览:491</comments>
<pubDate>Tue, 25 Aug 2026 14:08:00 GMT</pubDate>
</item>
<item>
<title><![CDATA[delphi编译间歇出现“应用程序控制策略已阻止此文件”问题 [含附件]]]></title>
<link>https://bbs.2ccc.com/topic.asp?topicid=768276</link>
<author>yhli </author>
<description><![CDATA[以下这个问题间歇出现：“Unable to create process:应用程序控制策略已阻止此文件。”：OS是Windows11/64位（新近重装）；使用的是 delphi13.0 社区版；已在安全中心将BDS.exe添加到排除项；已设置管理员权限运行BDS.exe；没有安装360/电脑管家。delphi12.1社区版也有同样的问题，这个问题困扰多时，如何彻底解决，请大侠出手相助，非常感谢！]]></description>
<comments>回复:3 浏览:133</comments>
<pubDate>Tue, 25 Aug 2026 03:08:00 GMT</pubDate>
</item>
</channel></rss>