AI摘要 WebView4Delphi是一个开源项目，用于将基于Edge/Chromium的浏览器嵌入使用Delphi或Lazarus/FPC为Windows制作的应用程序中。它使用Microsoft Edge WebView2 Runtime和Microsoft.Web.WebView2 NuGet包将Web浏览器嵌入到VCL、FMX和LCL应用程序中。WebView4Delphi是TWebBrowser和TEdgeBrowser组件的替代品，是WebView2框架的完整实现，经常更新，并且还支持旧版本的Delphi。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); WebView4Delphi描述WebView4Delphi 是一个开源项目，由Salvador Díaz Fau创建，用于将基于 Edge/Chromium 的浏览器嵌入使用 Delphi 或 Lazarus/FPC 为 Windows 制作的应用程序中。WebView4Delphi 是 TWebBrowser 和 TEdgeBrowser 组件的替代品。它是 WebView2 框架的完整实现，经常更新，并且还支持旧版本的 Delphi。介绍WebView4Delphi 使用Microsoft Edge WebView2 Runtime和Microsoft.Web.WebView2 NuGet 包将 Web 浏览器嵌入到 VCL、FMX 和 LCL 应用程序中。WebView4Delphi 加载 NuGet 包中的 WebView2Loader.dll 库并实现 WebView2 文档中描述的所有接口。最新的 WebView4Delphi 版本使用 Microsoft.Web.WebView2 NuGet 包版本 1.0.3485.44。您可以自行下载以提取 WebView2Loader.dll 库，或使用存储库 bin32 和 bin64 目录中提供的副本。下图描述了 WebView4Delphi 的工作原理：链接WebView4Delphi项目：GitHub 存储库论坛从 GitHub 下载Microsoft Edge WebView2 运行时：GitHub 反馈存储库文档API 参考下载Microsoft.Web.WebView2 NuGet 包：NuGet 库Chromium项目：Chromium 项目Chromium 问题代码搜索命令行开关DevTools 协议文档Chromium 文档兼容性Microsoft Edge WebView2 Runtime 创建了一个基于 Chromium 的 Web 浏览器，需要 Windows 10、11 或更新版本才能运行。微软曾计划支持 MacOS 和 Linux，但他们决定停止这些计划。WebView2 仅适用于 Windows。如果您需要在 MacOS、Linux 和 Windows 中嵌入 Web 浏览器，请考虑使用CEF4Delphi。关于 WebView2 运行时WebView2 运行时可以安装在运行嵌入式浏览器的每台计算机上。这称为常绿版本，由 Windows 更新自动更新。或者，您可以部署 WebView2 运行时的固定版本，并在每次更新应用程序时手动更新它。常绿版本允许您为您的应用程序安装一个小型安装程序，并且 Windows 将使用最新的安全补丁更新 WebView2 运行时。嵌入式 Web 浏览器也将自动更新，这意味着您的应用程序应该定期进行测试，以防止因弃用的浏览器功能、内部浏览器问题等引起的问题。您还必须记住，并非所有计算机都会同时更新。一些企业用户可能会很晚才收到某些 Windows 更新，因此您的应用程序必须准备好与多个浏览器版本完美兼容。为了避免所有这些问题，您也可以使用 WebView2 Runtime 的固定版本，但随后您必须手动更新它以修补浏览器中的安全问题，并且安装程序会更大。Windows 11 和大多数 Windows 10 设备中已包含 Microsoft Edge WebView2 运行时的常绿版本。所有演示均配置为使用常绿版本。安装要在 Delphi XE2、XE3、XE4、XE6、XE7、XE8、10、11、12 或 13 中构建和安装 WebView4Delphi，您需要遵循以下步骤：从GitHub下载最新版本的 WebView4Delphi 。将 WebView4Delphi 解压到一个目录中，并确保您的用户在该目录中具有写权限。运行 Delphi。打开文件​packages\WebView4Delphi_group.groupproj​。如果要安装 FMX 和 VCL 组件，请选择​“项目”→“构建所有项目”​菜单选项。如果此选项失败，请分别构建 WebView4DelphiVCLRTL.bpl、WebView4DelphiFMXRTL.bpl、WebView4DelphiVCL_designtime.bpl 和 WebView4DelphiFMX_designtime.bpl（按此顺序）。构建过程结束后，请在 WebView4DelphiVCL_designtime.bpl 和 WebView4DelphiFMX_designtime.bpl 中选择“安装”上下文菜单选项。如果您只想安装 VCL 组件，那么构建 WebView4DelphiVCLRTL.bpl 并安装 WebView4DelphiVCL_designtime.bpl。要在 Delphi 6、7、8、2005、2006、2007、2009、2010 或 XE 中编译和安装 WebView4Delphi，您需要遵循以下步骤：从GitHub下载最新版本的 WebView4Delphi 。将 WebView4Delphi 解压到一个目录中，并确保您的用户在该目录中具有写权限。运行 Delphi。从具有 VCL 组件的 Delphi打开文件WebView4Delphi.dpk 。单击编译按钮。单击​“安装”​按钮。要在 Lazarus 中编译和安装 WebView4Delphi，您需要遵循以下步骤：从GitHub下载最新版本的 WebView4Delphi 。将 WebView4Delphi 解压到一个目录中，并确保您的用户在该目录中具有写权限。运行 Lazarus。从包→打开包文件 (.lpk)...菜单打开文件packages\webview4delphi.lpk 。*单击包窗口中的“编译”按钮。单击​“使用”​按钮并选择​“安装”​选项。当 Lazarus 询问您是否要重建 Lazarus 时，按“是”按钮。Lazarus 将在几秒钟内安装 WebView4Delphi 并重新启动。第一步强烈建议在开始使用 WebView4Delphi 之前阅读 Microsoft Edge WebView2 运行时文档。安装 WebView2 Runtime 和 WebView4Delphi 包后，您可以构建 SimpleBrowser 演示。请注意，主单元有一个初始化部分，用于创建和配置 GlobalWebView2Loader。该部分的最后一步是 GlobalWebView2Loader.StartWebView2 调用，它将加载 WebView2Loader.dll 库并异步创建全局浏览器环境。您不必担心 GlobalWebView2Loader 的破坏，因为 WebView4Delphi 会在其最终完成部分之一中为您完成此操作。GlobalWebView2Loader 创建的全局浏览器环境将被应用程序创建的所有浏览器使用。无法预测哪一个会首先被创建：环境还是主要形式。SimpleBrowser 尝试在 Tform.OnShow 事件中创建浏览器，但它使用计时器以防全局环境需要更多时间来创建。WebView4Delphi 使用两个组件来创建浏览器。对于 VCL 或 LCL 应用程序，它使用 TWVBrowser 和 TWVWindowParent。对于 FMX 应用程序，它使用 TWVFMXBrowser 和 TWVFMXWindowParent。TWVWindowParent 和 TWVFMXWindowParent 只是 WebView2 用来显示浏览器内容的控件。最重要的组件是 TWVBrowser 和 TWVFMXBrowser，因为它们封装了大多数 WebView2 方法、属性和事件。WindowParent组件和Browser组件是关联的，您需要设置它们的Browser属性。TWVWindowParent.Browser 必须设置为 TWVBrowser 实例，而 TWVFMXWindowParent.Browser 需要设置为 TWVFMXBrowser 实例。浏览器是通过 TWVBrowser.CreateBrowser 或 TWVFMXBrowser.CreateBrowser 调用异步创建的。TWVBrowser.OnAfterCreated 事件将在浏览器完全初始化后触发，然后您就可以开始调用其方法了。SimpleBrowser 将在触发OnAfterCreated事件之前开始加载在 TWVBrowser.DefaultURL 属性中设置的 URL 。如果您检查其他演示或开始使用 TWVBrowser 事件，您会注意到 TWVBrowser 将WebView2 委托中声明的所有Invoke回调作为事件公开。所有这些事件的参数类型与Invoke回调几乎相同，并且大多数都包含一个aArgs参数。如果您需要使用该接口，可以使用 uWVCoreWebView2Args 单元中相应的包装器。例如，TWVBrowser.OnDownloadStarting 事件具有一个 ICoreWebView2DownloadStartingEventArgs 类型的 aArgs 参数。正如您在 MiniBrowser 演示中看到的，我们需要用它用 TCoreWebView2DownloadStartingEventArgs 类包装它，如下所示：TempArgs := TCoreWebView2DownloadStartingEventArgs.Create(aArgs);所有 WebView2 接口都有一个同名的包装器，但用T替换了首字母I。您还会注意到，大多数字符串类型的参数已被新的wvstring类型取代，因为 WebView2 在内部使用 WideStrings。Delphi 用户可以直接将字符串分配给 wvstring 变量，但 Lazarus 用户必须使用 UTF8Decode 和 UTF8Encode 来转换它们。关于名字WebView4Delphi 只是一个数字缩写，应该理解为​WebView for Delphi​，并不意味着它基于 WebView4。
AI摘要 本文介绍了一个使用Delphi编写的示例应用程序，该程序展示了如何使用`TEdgeBrowser` VCL组件。`TEdgeBrowser`是`TWebBrowser`的替代品，它使用Edge浏览器的WebView2控件。使用`TEdgeBrowser`需要安装Edge浏览器和WebView2控件加载器DLL。文章还提供了`TEdgeBrowser`组件事件处理程序的示例，并附有WebView2的文档链接。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); EdgeBrowser demoThis sample Delphi application demonstrates the use of the TEdgeBrowser VCL component.TEdgeBrowser is a successor to TWebBrowser. Where TWebBrowser uses the Internet Explorer WebBrowser control as its browser UI, TEdgeBrowser uses Edge browser's WebView2 control. Because of this TEdgeBrowser relies on:the Edge browser being installedthe WebView2 control loader DLL being available (part of the Microsoft WebView2 SDK)Please see the documentation for TEdgeBrowser for full details on how to get it up and running with the Edge (Chromium) browser and the WebView2 browser controlThe sample includes event handlers for all of the TEdgeBrowser component's events and these mostly surface events of the WebView2 control itself.WebView2 documentation can be found at:https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2https://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2/gettingstartedhttps://docs.microsoft.com/en-us/microsoft-edge/hosting/webview2/reference-webview2
AI摘要 RAD Studio 13.0引入了SmartCore AI组件包，旨在帮助客户将AI功能添加到现有应用程序中或构建新的AI为中心的应用程序。该组件包模块化，简化了从Delphi和C++Builder应用程序调用AI提供商的过程，并可通过重写虚拟方法或创建新的驱动程序组件来扩展驱动程序。它包括新的AI连接组件、AI请求组件，以及针对不同数据类型的组件，可以直接与UI控件绑定以显示结果。用户可以利用这些组件集成AI到应用程序中，解决多种AI用例，如内容创建、本地化支持、智能见解和数据分析等。安装后，用户可以通过连接向导编辑和测试参数，或手动配置参数。此外，还提供了多个演示指南，帮助用户快速入门和理解如何使用SmartCore AI组件包。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); SmartCore AI 组件包从 13.0 版开始，RAD Studio 继续在 IDE 中提供 AI 驱动的编码帮助，引入一组新的核心 AI 组件，旨在帮助客户将 AI 功能添加到其现有应用程序中，或使用 Delphi 或 C++Builder 构建全新的以 AI 为中心的应用程序。这是一个模块化组件套件，用于简化从 Delphi 和 C++Builder 应用程序调用 AI 提供商（OpenAI、Claude、Gemini、Ollama）。它将运行时单元（组件、驱动程序、类型、LiveBindings）与设计时单元（属性编辑器、连接向导、帮助程序）分开。可以通过重写虚拟方法或创建新的驱动程序组件来扩展驱动程序。注意： 要使用 SmartCore AI 组件包，特定 AI 服务（可通过免费或付费帐户获得）或引擎的本地安装（如果是 Ollama），需要API 密钥。一、概述SmartCore AI 组件功能是未来的构建块和基础。这是一个核心架构，我们的客户和第三方供应商可以在其基础上构建和扩展，以与其他 AI 引擎和 UI 控件集成。此套餐包括：新的 AI 连接组件（其角色类似于 FireDAC 中的数据库连接）。这是一个与 AI 引擎无关的组件，它使用特定的驱动程序通过 REST与不同的 AI 引擎（包括 OpenAI、Claude、Gemini 和 Ollama）进行通信。SmartCore AI引擎提供了添加额外驱动程序的能力，使 AI 提供商能够随着市场的发展扩展您的项目功能。配置通过易于使用的 AI 连接向导进行管理。一组针对不同数据类型（如文本、图像、结构化数据）的 AI 请求组件，这些组件可以与提示相关联，并且可以直接与 UI 控件绑定以显示结果。借助 SmartCore AI 组件包，用户可以将 AI 集成到现有和新应用程序中，解决许多流行的 AI 用例，例如为生成图像和其他媒体等产品内内容创建提供支持，为动态翻译添加产品内本地化支持，提供应用内智能见解和数据分析的个性化建议，或构建应用内聊天机器人以为现有应用程序添加交互性。二、安装和入门从 GetIt 下载 SmartCore AI 组件包以开始使用 AI 连接组件。RAD Studio 13.0 演示存储库中还提供了一组相关的演示。如果您已将演示与产品一起安装，则可以通过 git 获取更新。安装软件包后，请按照以下步骤开始：1、删除 TAIConnection、分配驱动程序和分配给请求组件。2、使用连接向导编辑和测试参数（双击 TAIConnection）。3、或者手动配置参数（API 密钥、模型、BaseURL 等）。以下是智能 AI 组件包安装的组件列表：三、组件和驱动程序快速参考以下是组件和驱动程序的列表。TAIConnection：拥有并连接混凝土 TAIDriver。驱动因素： TAIOpenAIDriverTAIClaudeDriverTAIGeminiDriverTAIOllamaDriver参数：每个驱动程序的强类型 （， ， ，TAIOpenAIParamsTAIClaudeParamsTAIGeminiParamsTAIOllamaParams)Endpoint_*：驱动程序发布具有正确默认值的提供程序特定终结点 （基于提供程序 API 引用） 。请求组件： TAIChatRequestTAIImageRequestTAIJSONRequestTAIStreamRequest四、注意事项和最佳实践以下部分列出了最佳实践和注意事项。为了简单起见，在设计时使用连接向导。驱动程序引发 、 、 错误处理异常。EAIExceptionEAIJSONExceptionEAIXxxxException驱动程序也可以在没有连接的情况下进行作，但组件依赖于 。TAIXxxxRequestTAIConnection可以在该级别注入 Http 定制器，以防您需要更多自定义的 HTTP 客户端行为。TAIConnection驱动程序也可以在没有连接的情况下进行作，但 AIRequest 组件依赖于 AIConnection。默认情况下，Synchronize events 属性是，但如果有许多异步的正在进行的请求，请在销毁组件之前使用并等待并检查，否则可能会出现意外异常或错误。TrueDriver.CancelALLDriver.IsRunning五、演示指南请记住，要运行演示，您需要拥有特定 AI 服务的 API 密钥（可通过免费或付费帐户获得），Ollama 除外。控制台：SmartCoreAI_Console_Demo显示完全编程连接的无头示例：创建 + 驱动程序 + 在代码中，并将响应打印到控制台（无表单/IDE 设计时）。TAIConnectionTAIChatRequestFMX：Chat_OpenAI_FMXFireMonkey 聊天 UI 与 + + .演示了 FMX 中的设计时布线和处理 OnResponse 和 OnError。TAIConnectionTAIOpenAIDriverTAIChatRequestImage_Gemini_FMX使用 + 生成 FMX 图像。演示在 FMX 控件中生成请求 DTO 和呈现生成的图像。TAIGeminiDriverTAIImageRequestImage_OpenAI_FMX使用 + 生成 FMX 图像。与 Gemini FMX 演示类似，但适用于 OpenAI。TAIOpenAIDriverTAIImageRequestJSON_OpenAI_FMXFMX 示例，用于通过（例如，审核）调用提供商 JSON 端点，演示了设置端点/正文并显示原始 JSON 结果，以及在数据集 （TFDMemTable） 中填充数据。TAIJSONRequestVCL：Chat_OpenAI_VCLVCL 与 + + 聊天。简单的表单（编辑 + 备忘录 + 按钮）用于发送提示和显示响应。TAIConnectionTAIOpenAIDriverTAIChatRequestImage_Gemini_VCL使用 + 生成 VCL 图像。将生成的图像加载到 TImage 控件中。TAIGeminiDriverTAIImageRequestImage_OpenAI_VCL使用 + 生成 VCL 图像。镜像 OpenAI 图像 API 的 Gemini VCL 演示。TAIOpenAIDriverTAIImageRequestJSON_Gemini_VCL通过（例如，审核）调用提供者（Gemini）JSON 端点的 VCL 示例，演示了设置端点/正文并显示原始 JSON 结果以及在数据集 （TFDMemTable） 中填充数据。TAIJSONRequestJSON_OpenAI_VCL通过（例如，审核）调用提供者（Gemini）JSON 端点的 VCL 示例，演示了设置端点/正文并显示原始 JSON 结果以及在数据集 （TFDMemTable） 中填充数据。TAIJSONRequestSmartCoreAI_LiveBindings_DemoVCL LiveBindings 展示：使用 SmartCoreAI.Design.LiveBindings 适配器将聊天组件输出绑定到可视化控件。Stream_OpenAI_VCLOpenAI 的 VCL 流媒体演示（例如，音频转录、语音识别、图像理解、音频理解等）。通过 OnPartial、OnSuccess 和 OnError 事件逐步使用和更新 UI。TAIStreamRequest六、代码结构这是对 SmartCore AI 组件包中包含的软件包和单元的更多技术参考。包SmartCoreAI：包含组件和驱动程序的核心运行时包。dclSmartCoreAI：设计时注册（属性编辑器、向导）。SmartCoreAIVCL：VCL Live 绑定运行时包。dclSmartCoreAI：VCL Live 绑定设计时包。SmartCoreAIFMX：FMX Live 绑定运行时包。dclSmartCoreAIFMX：FMX Live 绑定设计时包。单位SmartCoreAI.Comp.Connection.pas： ，基类。TAIConnectionTAIRequestSmartCoreAI.Comp.Chat.pas：带有事件和聊天方法。TAIChatRequestSmartCoreAI.Comp.Image.pas：（图像生成）。TAIImageRequestSmartCoreAI.Comp.JSON.pas：（通用 JSON 终结点）。TAIJSONRequestSmartCoreAI.Comp.Stream.pas：（流端点）。TAIStreamRequestSmartCoreAI.Types.pas：核心 dData 类型，包括枚举、回调接口、基类。IAIDriverTAIDriverSmartCoreAI.Serialization.pas：JSON 序列化器和帮助程序。SmartCoreAI.Driver.Registry.pas：注册或查找驱动程序。TAIDriverRegistrySmartCoreAI.Driver.OpenAI.pas： 和 .TAIOpenAIDriverTAIOpenAIParamsSmartCoreAI.Driver.Claude.pas： 和 .TAIClaudeDriverTAIClaudeParamsSmartCoreAI.Driver.Gemini.pas： 和 .TAIGeminiDriverTAIGeminiParamsSmartCoreAI.Driver.Ollama.pas：和 .TAIOllamaDriverTAIOllamaParamsSmartCoreAI.Consts.pas：资源字符串和常量。SmartCoreAI.Design.Registration.pas：在设计时注册编辑器和向导。SmartCoreAI.Design.PropertyEditors.pas：参数和模型下拉列表的属性编辑器。SmartCoreAI.Design.ConnectionWizard.pas：（启动向导）。TAIConnectionEditorSmartCoreAI.Design.ConnectionWizardForm.pas/.dfm： – 选择驱动程序，编辑参数。TfrmAIConnectionWizardSmartCoreAI.Design.LiveBindings.pas：用于聊天和图像的 LiveBindings 适配器。
AI摘要 本文是对Delphi编程语言的赞美和介绍。Delphi以其典雅、形象、传统和现代的特点，深受程序员喜爱。它具有清晰的结构、直观的语法、面向过程和面向对象的特性，以及强大的底层操作能力。Delphi适用于各种开发场景，对不同级别的程序员都有益处，提供丰富的控件、类库和源代码。作者认为Delphi是经典且优雅的编程语言，值得程序员学习和使用。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); DELPHI者，经典开发工具、美奂美仑之开发环境也。盖论DELPHI其身世，实为神界之神物，后借宝蓝公司之手，于1990年代，现于江湖。DELPHI一出江湖，码农爱之，企业爱之。一时间，风雨雷动，群雄为之叹服，奸商为之苦脸，微软为之微软。后江湖传说“真正码农用C++，聪明码农用DELPHI”。乃知DELPHI聪明犀利、优雅大方之美名，早已深入人心。一、倘论DELPHI之技法，实则冠盖江湖，其特点有四。其一曰典雅：一始（BEGIN）一终（END），尽显思路之清晰，描述之易懂，无VB之散漫，无C/C++之呆板。传值合理，调用高效，引无数人研究DELPHI，效仿DELPHI，山寨DELPHI。其二曰形象：编码惟虫（BUG）少，虫少惟清晰，清晰惟好懂，好懂惟形象。DELPHI语法之形象，剑尖一指（^）可抓其实，圆圈一画(@)可定其位，一招一式间，尽显功力之扎实，操作之形象。无C之费解，无C++之烧脑。其三曰传统：所谓传统者——面向过程时代之全局变量也。呜呼！世道不古，江湖新贵JAVA/C#之流早已丢弃此传统技艺矣！DELPHI则完整承传此技艺，其全局变量无繁文缛节（CLASS）之拘束。随性而为，方便直接，既写即用，可秒结、可妙结一切小型项目。其四曰现代：所谓现代者——面向对象时代之面向对象也。JAVASCRIPT之属有象无类，实则伪面向对象。DELPHI则有类有象，形神俱全。JAVA/C#之属有始无终，只能构造，不能析构，实则半调子面向对象。JAVA/C#之属生由我，死由他，全赖外部垃圾回收之人裁定。观此蹩脚之规定，可知JAVA/C#实为蔑视码农，低估码农智商，当码农为废物垃圾矣！DELPHI则有始有终，权力与担当同在。我有权，我亦有责，我构造，我析构，生死全由我。DELPHI实乃顶天立地之真男人也。二、倘论DELPHI用武之地，其地深矣！其地大矣！JAVA/C#之属乃隔靴（虚拟机）搔痒，带套作业，地址指针，一概不敢承认，全当幻觉。DELPHI则深入底层，直触OS，直面资源，直操API，DELPHI实为计算机之真主人也。于是乎——读写寄存器，操控硬件，无所不能。于是乎——读写DB，增删数据，无所不便。于是乎——读写网络，事件通知，完成端口，DIOCP，无所不利。于是乎——挖掘资源，利用资源，榨干资源，上万并发，十万并发，百万并发，全凭码农聪明发挥，DELPHI毫不含糊，不贪污不浪费，不打折扣。三、倘论习练DELPHI之益处，其益大矣！于初级习练者，DELPHI屏蔽其一切繁杂缘由。示之以海量快速控件，我想即我见，我见即我得，拖拖拉拉之间，开发任务已达成，令人喜不自胜，从业码农之心弥坚。于中级习练者，DELPHI屏蔽其一切复杂头绪。示之以璀璨之类库。璀璨之类库内含璀璨之美景，美奂美仑，不可胜收，时而康庄大道，时而曲径通幽，千回百转，一切奥妙尽藏其中。于高级习练者，DELPHI坦诚相见，露其峥嵘之真容。示之以源头之代码，应之以包容之协议，用框乎？用架乎？造轮乎？辗转乎？腾挪乎？全凭习练者之喜好，绝不削足适履，强买强卖，让人难受。曰若稽古，考察历史，可知计算机语言庞杂纷纭，流行甚多。然经典计算机语言，廖若晨星。其中经典而又优雅者，非DELPHI莫属。何谓经典？经者，经常也，常在也，永存也，典者，陈列也，典藏也，价值珍贵，足以值得珍藏也。DELPHI原本神界物， 神界DELPHI之神话，生生不息。何谓流行？流行者，时尚也，时尚者，此时之尚也。然此时之所尚，亦彼时之所尚乎？前时之所尚，亦后时之所尚乎？今之所尚，亦明之所尚乎？尚尚不一，尚尚不息，码农何为？故与其追流行，不如练经典；故与其临渊羡众语言，不如退而苦练DELPHI语言。经典之DELPHI，必成就经典之你我。DELPHI之经典，必成就你我之经典。愿天下码农和IT公司的事业，从经典的DELPHI开始！-----------------一个老码农的感言！文章来源：https://www.2ccc.com/news/Html/?1619.html
AI摘要 本文回顾了Delphi编程语言的发展历程，从1995年的首个版本到2023年的Delphi 12，每个版本都带来了新的功能和改进，以适应不断变化的技术趋势。文章还提供了Delphi所有版本的ISO下载链接和安装教程，以及如何编写第一个“Hello World!”程序的步骤。Delphi以其快速应用开发（RAD）环境而闻名，不断扩展支持的平台范围，并引入前沿技术。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); 概览Delphi 的最新版本，即 Delphi 12，勾勒出了自公司创立以来的一条进化之路。该平台不断通过提升开发者生产力、扩展其支持的平台范围以及引入前沿技术来实现自我完善。作为 Embarcadero 提供的主要快速应用开发（RAD）环境，Delphi 在多年间经历了广泛的发展与变革。Delphi 版本变迁围绕 Delphi 各个版本的故事，实际上是一系列转型的记录。它起始于 1995 年的 Borland Delphi，并以其视觉组件库（VCL）专注于 Windows 编程领域。2006 年，随着 CodeGear 接手，推出了面向 .NET 的 Delphi Prism，并开始强调跨平台功能的重要性。最终，在 2008 年被 Embarcadero 收购后，Delphi 通过 FireMonkey 增强了其跨平台能力。Delphi 版本主要变化自 1995 年推出以来，Delphi 作为快速应用开发的重要工具，经历了显著的变化。每个新版本都以前一个版本为基础进行了改进，引入了改变软件工程师设计应用程序方式的创新特性和功能。这些持续的演进不仅体现了对技术进步的承诺，也反映了 Delphi 不断适应并引领行业趋势的决心。所有 Delphi 版本Delphi 1 (1995) - 首个版本，由 Borland 发布，引入了可视化组件库（VCL），使得 Windows应用程序的开发变得直观和高效。Delphi 2 (1996) - 增强了对 Windows 95 的支持，并改进了编译器性能和 VCL。Delphi 3 (1997) - 引入了数据库应用开发的支持，包括一个全新的数据库引擎 BDE 和新的数据感知组件。Delphi 4 (1998) - 加强了与 COM 和 ActiveX 的集成，使开发者能够创建更复杂的 Windows 应用程序。Delphi 5 (1999) - 添加了 WebBroker 框架，允许开发者构建基于 Web 的应用程序和服务。Delphi 6 (2001) - 包含了一个 CLR 编译器，首次尝试兼容 Microsoft .NET 平台。Delphi 7 (2002) - 成为许多开发者心中经典的 Delphi 版本，它稳定且功能丰富，广泛用于 Windows 应用开发。Delphi 8 (2003) - 主要针对 .NET 开发，是第一个完全面向 .NET 的 Delphi 版本。Delphi 2005 (2004) - 提供了 Win32 和 .NET 支持，引入了 DbExpress技术，增强了数据库连接能力。Delphi 2006 (2005) - 继续扩展了对 .NET 和 Win32 平台的支持，增加了 CodeGear 的 Delphifor PHP。Delphi 2007 (2007) - 专注于 Win32 应用开发，改善了 IDE 性能并加入了更多新特性。Delphi 2009 (2008) - 第一次带来了 Unicode 支持，这是现代软件开发的重要需求之一。Delphi 2010 (2009) - 进一步完善了 Unicode 支持，同时增强了调试工具和其他开发工具。Delphi XE (2010) - Embarcadero 推出的新命名方案下的首个版本，强调跨平台开发能力。Delphi XE2 (2011) - 引入了 FireMonkey 框架，开启了 Delphi 跨平台开发的新篇章，支持 Mac OSX 和 64-bit Windows 应用开发。Delphi XE3 (2012) - 改进了 FireMonkey，并开始支持移动平台开发，如 iOS。Delphi XE4 (2013) - 继续增强移动开发支持，特别是 Android 平台。Delphi XE5 (2013) - 提升了移动开发的功能，特别是对 iOS 和 Android 的支持更为成熟。Delphi XE6 (2014) - 引入了对 Android 和 iOS 的 64 位支持，以及 LiveBindings 技术。Delphi XE7 (2014) - 扩展了对物联网（IoT）设备的支持，并进一步加强了移动开发功能。Delphi XE8 (2015) - 增加了对 Windows 10 和 Mac OS X Yosemite的支持，提升了移动开发体验。Delphi 10 Seattle (2015) - 新品牌命名下发布的版本，强调了对最新操作系统的支持。Delphi 10.1 Berlin (2016) - 改善了对多平台的支持，特别是在 Linux 和 macOS 上。Delphi 10.2 Tokyo (2017) - 引入了更多的跨平台功能，特别是对 Linux Server 和 RaspberryPi 的支持。Delphi 10.3 Rio (2018) - 增强了对云服务的支持，并继续扩展其跨平台开发的能力。Delphi 10.4 Sydney (2020) - 提供了更新的编译器和库，优化了性能，并添加了新的 UI 设计工具。Delphi 11 Alexandria (2021) - 强化了跨平台开发体验，尤其是在 Android 和 iOS 上。Delphi 12 (2023) - 最新版本，继续推进跨平台开发的可能性，提供了更好的工具链、性能提升和用户体验改进。每个版本都代表了 Delphi 在技术上的进步，反映了它适应不断变化的开发环境和技术趋势的努力。Borland Delphi v1.0 程序安装Windows xp环境下可以直接进行安装。delphi所有版本ISO链接: https://pan.baidu.com/s/1AtdGYs7ZS-0KBdTPF5O43g 解压密码：8888资料收集来源于：安装截图：第一个程序 Hello World!1、Windows开始菜单-》所有程序-》Delphi-》Delphi2、拖动Button控件放置在窗体界面上，调整尺寸3、将Button控件Name属性设置为btnHelloWorld4、将Button控件Caption属性设置为Hello World5、双击Button控件，进入到代码编辑界面，键入如下代码：ShowMessage('Hello World!');6、执行F9快捷键或Run->Run菜单，程序自动执行7、点击“Hello Word”按钮，弹出对话框如下：恭喜你成功开启Delphi的编程世界，从1995年至今，一直追求的RAD技术的大门为你打开......
AI摘要 本文回顾了Delphi编程语言的历史，从其发布会邀请函、95年软件开发大会、产品包装盒、相关书籍，到Delphi问世前的Turbo Pascal，以及Delphi的快速应用开发（RAD）理念和投资回报（ROI）。文章还提到了Delphi获得的奖项，特别是Jolt大奖，以及Delphi 2和Delphi 3的发布。最后，文章概述了Delphi从Delphi 4到Delphi 8的发展历程，包括技术进步和开发团队面临的挑战。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); 发布会这是 Delphi 发布的邀请：许多曾经风靡一时的开发工具已逐渐淡出人们的视野，被历史的洪流所淹没。然而，Delphi不仅没有被遗忘，反而持续保持着其独特的魅力和广泛的用户基础。这不仅彰显了Delphi在快速变化的技术领域中的持久生命力，也证明了它对于开发者而言不可替代的价值。Delphi之所以能够历久弥新，离不开其始终如一地关注于简化开发流程、提高工作效率以及不断适应新技术的能力。这种持久的吸引力和适应性，正是Delphi长久以来深受开发者喜爱的关键所在。有趣的是，Delphi自诞生之初便着眼于提升开发人员的生产力这一核心商业价值，而这一理念即便在今天依旧熠熠生辉。尽管技术环境、移动平台等各方面都经历了翻天覆地的变化，但Delphi原始广告中所传达的信息，却意外地与当今的需求高度契合，仿佛穿越时光仍能引起共鸣。在产品发布前后的岁月里，留存下来的一些珍贵图像资料，大多源自Borland当年发布的广告。这些图片不仅记录了那个时代的风貌，也见证了Borland如何通过其独特的市场推广策略，将创新的产品理念传递给全世界的开发者。95年软件开发大会该会议在加利福尼亚州旧金山的莫斯康中心举行。以下是会议的一些照片：这是展览大厅。请注意，微软当时正在大力推广Windows 95。同时也可以注意到，许多现在已不再营业的公司也曾在这里展出……原装产品包装盒最厚的Delphi 1.0三本书Mine、Charlie's以及Pacheco/Teixeira这三本书是覆盖Delphi各个方面的经典之作，它们从不同角度深入探讨了Delphi的精髓，并因此成为了该领域的经典书籍。每一本都经历了多个版本的迭代更新，以适应Delphi后续版本的发展，确保内容与时俱进。Delphi问世之前-Turbo Pascal在Delphi问世之前，Turbo Pascal早已是程序员们心中的一颗璀璨明星。Turbo Pascal不仅定义了Pascal语言的早期形态，还引入了一套独特的面向对象编程（OOP）模型，并初步实现了与Windows环境的集成。然而，随着Delphi的登场，这一切都迎来了革命性的变革。Borland曾经拥有的一本杂志Delphi来了！从Delphi的快速应用开发（RAD）到实现投资回报（ROI），这些理念在今天依然值得我们更多地借鉴与运用！ 正确的Visual Basic……实现了激进的性能突破……为Windows 95的到来做好了充分准备。借助Borland工具家族，软件开发变得更加简便高效。尽管当时的产品线较为精简——所有产品组合都能汇总在一页纸上描述——但其功能却毫不逊色，展现了强大的技术实力。来自杂志的关注Delphi的荣耀Delphi赢得了许多奖项，在Delphi 2发布时，这些荣誉得到了广泛的庆祝。特别是当《软件开发》杂志宣布Delphi获得Jolt大奖时，那句“Borland回来了”不仅标志着Borland公司的重新崛起，更象征着Delphi在行业内的地位与认可。这一奖项是对Delphi卓越性能和创新精神的最佳肯定。注：Jolt大奖是软件开发领域中极具影响力的奖项，旨在表彰那些给开发者带来震撼体验的技术产品。Delphi荣获此奖，证明了其在快速应用开发（RAD）工具中的领先地位。Delphi 2 和 Delphi 3Delphi 2 和 Delphi 3 将 Visual Basic 的易用性与 C++ 的强大功能完美结合，提供了既能在预算内准时交付项目，又能确保应用拥有高性能和强大功能的开发体验。Delphi 与鸭子：对未来事物的预想更多的版本在Delphi的发展历程中，更“近期”的版本涵盖了从Delphi 4到Delphi 8的一系列重要更新，期间不仅见证了技术的进步，也反映了开发团队面对的挑战与机遇。Delphi 4时期，开发者们似乎遇到了一些棘手的问题，戏谑地形容为“推石头”。随后，Delphi 5带来了对互联网（The Net）的支持，尽管这一转变在当时显得有些隐晦和神秘。Delphi 6继续推进这些改进，而Kylix的推出则标志着Delphi正式进军Linux平台，仿佛在向世界宣告：“Linux，我们很快就要来了！”Delphi 7进一步巩固了其地位，紧接着是Delphi 8，它引入了与.NET框架的集成，虽然这一步骤可能让一些人感到不适应或质疑（呃！）。与此同时，整个行业也在经历着一场建模技术的重大变革，Delphi也不例外，积极拥抱并推动了这一趋势。
AI摘要 Delphi是Borland公司在软件开发工具领域的重要产品，它的出现不仅为公司带来了新生，也引领了Windows平台上快速应用开发（RAD）的潮流。Delphi 1.0在1995年情人节发布，通过大规模的公共测试计划，确保了产品的质量和稳定性，迅速赢得了开发者社区的信任和支持。Delphi的成功也体现在其惊人的销量上，首个版本就售出了50多万套，几乎达到了Borland旗下另一款成功产品Turbo C/C++系列销量的一半。Delphi的核心开发者Anders Hejlsberg在产品中隐藏的彩蛋，也体现了开发者对这款工具的信心和浪漫情怀。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); "是Turbo Pascal诞生了Borland,但却是Object Pascal给予了 Borland 重生的机会!"创造传奇故事的主角---DelphiBorland依靠Pascal起家，通过C/C++绽放光芒，从C/C++领域的辉煌跌落谷底，又凭借着明星开发工具Delphi的问世重振旗鼓，这一过程充满了戏剧性和挑战。在这个过程中，Borland经历了两位关键人物——创始人Philippe Kahn和核心开发者Anders Hejlsberg——相继离职的重大转折点，这不仅标志着公司内部的剧变，也预示着Borland即将踏上转型之路。对于Borland而言，这段历史是其发展中的一个至关重要的里程碑。Delphi的出现不仅为公司注入了新的活力，也在软件开发工具领域掀起了革命性的变化。Delphi开启了Windows平台上的快速应用开发（RAD）的新纪元，改变了Windows平台上应用程序架构的设计思路，并对组件化技术的发展起到了不可忽视的推动作用。事实上，Delphi所倡导的组件技术理念至今仍然影响深远，无论是JavaBean还是.NET框架中的组件思想和技术实现，都可以看到Delphi当年创新的影子。空前的大规模公共测试计划在Borland全力推进C/C++产品线的最后决战之际，Delphi的研发也在紧锣密鼓地进行。1994年下半年，随着Delphi 1.0接近尾声，团队将注意力转向了至关重要的Beta测试阶段。这一年，Borland做出了一个前所未有的决定——为确保Delphi的质量和稳定性，避免重蹈C/C++产品线的覆辙，公司启动了一项大规模的公共测试计划。这项计划展示了Borland对Delphi的信心与决心：向全球程序员发出了成千上万份测试版本，邀请他们参与长期而深入的产品评估。此举不仅是为了收集尽可能多的反馈意见来优化软件，更是为了建立用户社区的信任和支持。这种规模的公开测试，在Borland的历史上是空前绝后的；自Delphi 1.0之后，再没有一款产品能够享受到如此广泛的测试覆盖和公众参与。一炮而红的Delphi 1.01995年2月14日的情人节似乎一夜之间改变了Borland的命运！1995年2月14日，这一天注定会被Borland铭记于心，因为这不仅是Delphi正式问世的时刻，更是Borland命运转折的关键节点。得益于此前大规模的Beta测试计划，Delphi在全球范围内已经吸引了广泛的关注与高度评价。信息业界对Borland的新产品寄予厚望，认为它不仅代表了软件开发工具的一次重大飞跃，更可能成为改变行业格局的重要力量。通过这场前所未有的公开测试，Borland成功地将Delphi推到了全球程序员的眼前，收集了大量的反馈和建议，使得这款产品在正式发布时已经具备了极高的稳定性和用户友好性。这种开放式的开发策略，不仅让Delphi成为了当时最受瞩目的编程环境之一，也巩固了Borland在快速发展的软件市场中的地位。集成开发环境IDE随着Delphi的成功推出，Borland向世界展示了其创新能力和对产品质量的不懈追求。这款集成了可视化设计、快速应用程序开发（RAD）特性的工具，迅速赢得了开发者社区的心，为公司开启了新的篇章。从那一天起，Delphi不仅仅是一款产品，它象征着Borland对于技术创新的承诺，以及对未来无限可能性的探索。Delphi 1.0的成功堪称软件史上的一个传奇。根据非正式统计，这款革命性的开发工具在全球范围内售出了惊人的50多万套——这是一个令人难以置信的成就。为了更好地理解这个数字的意义，我们可以将其与Borland旗下另一款极为成功的系列产品——Turbo C/C++进行对比。Turbo C/C++系列，在其巅峰时期（即3.1版本），全球累计销量也才刚刚超过100万套。请注意，这是经过了多个版本迭代、多年市场耕耘后才取得的成绩。而Delphi仅凭其首个版本，便几乎达到了这一数字的一半。这不仅证明了Delphi在发布时就获得了市场的热烈响应，更显示了它在开发者社区中迅速建立起的信任和偏好。独属程序员的浪漫Delphi 1.0安装界面Delphi 1.0的成功或许早在Anders Hejlsberg的预料之中。这位编程语言设计大师，在Delphi开发过程中的每一个细节里都倾注了无数心血。在Delphi 1.0的秘密Easter Egg中，我们能看到Anders灿烂的笑容，那笑容仿佛预示着这款工具光明而辉煌的未来。1、使用 Help | 调用 About 框关于 ...，然后按住 Alt ，同时键入 DEVELOPERS2、使用 Help | 调用 About 框关于 ...，然后按住 Alt 键入 TEAM 时。这给出了 Borland 的多页列表 与 Delphi 密切相关的员工3、使用 Help | 调用 About 框关于 ...，然后按住 Alt 键入 VERSION.这将给出 的内部修订号 产品。4、使用 Help | 调用 About 框关于 ...，然后按住 Alt 同时键入 AND。照片是 Anders Hejlsberg， Borland 所有 Pascal 相关产品的首席架构师， 包括 Delphi。这背后的想法是 Anders And （他的名字加上 the keystrokes required）。当您在产品中看到这张图片时，它会对您眨眼。这个隐藏的彩蛋不仅仅是一个小小的玩笑或惊喜，它更像是开发者们对自己作品充满信心的一种表达。文章来源：https://mp.weixin.qq.com/s/iKPOT8cG9KiCoDC74cw1iA
AI摘要 CnRSA是CnPack开发包中的一部分，提供纯Delphi代码实现的RSA算法，支持所有版本的Delphi并兼容OpenSSL。RSA是一种非对称加密算法，使用不同的密钥进行加密和解密。CnRSA通过大整数运算、寻找大素数、蒙哥马利快速幂求余和扩展欧几里得辗转相除法等技术实现RSA算法，并提供加密解密、签名验签等功能。具体使用时，需要注意填充对齐、公私钥的传递保存加载等。CnRSA的使用示例和源码说明可在CnPack的官方资源中找到。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); CnPack For Delphi/C++Builder 中国人自己的免费第三方开发包 (C)Copyright 2001-2024 CnPack 开发组 CnRSA算法实现说明与帮助 Revision 1.0.1.0 ========================= 作者：刘啸 2024.11.02 ======================================================================CnRSA 介绍CnRSA 是 CnPack 开放源码组件包中的一部分，是以纯 Delphi 代码实现的工程可用的 RSA 算法，支持从 Delphi 5 到最新版的所有版本的 Delphi，并兼容 OpenSSL。为了给用户一个完整的使用说明以及使用户在发现问题时能通过阅读 CnRSA 的代码解决问题，这里将 RSA 的算法说明以及 CnRSA 相关实现机制整理如下文。======================================================================RSA 算法说明RSA 加密算法是由罗纳德·李维斯特（Ron Rivest）、阿迪·萨莫尔（Adi Shamir）和伦纳德·阿德曼（Leonard Adleman）在 1977 年共同提出的一种非对称加密算法，目前在公开密钥加密和电子商业中被广泛使用。RSA 即为该三人姓名的首字母。 所谓非对称加密算法，是指加密与解密时使用的密钥不相同，能够避免对称加密算法所面临的密钥传递时的泄露危险。2.1 如何以最简单的方式理解 RSA 加解密先以通俗的算法描述来了解 RSA 算法。 选俩素数，算它们的积（叫做积一）。算俩素数各减一的积（叫做积二）。找一个和积二互素的数 E，一般就选 65537（有时候 3 也行）再求个正数 D，要求 D 能满足 （D * 65537） mod 积二 = 1好了，我们得到了一对简单的 RSA 公私钥。其中公钥是积一和 65537，私钥是积一和 D。得到了公私钥如何加解密呢？也很简单：加密：原文数字的 65537 次方除以积一，余数就是密文解密：密文数字的 D 次方除以积一，余数就是明文2.1.1 不能实际使用的 RSA 例子一如果上面仍不好理解，我们可以拿一个数字非常小因而并不能投入实际使用的简单例子来说明： 素数：5、11积一：5 * 11 = 55积二：(5 - 1) * (11 - 1) = 40E：3D：D * 3 mod 40 = 1，求得D = 27我们得到公钥 55 和 3，私钥 55 和 27，假如我们的明文是 2，那么加密：2 的 27 次方除以 55 = 134217728 mod 55 = 18，密文为 18解密：18 的 3 次方除以 55 = 5832 mod 55 = 2，解出了明文 2。2.1.2 不能实际使用的 RSA 例子二上面的例子实在太简陋了，我们换一个数字稍微大一点的来看： 素数：1504629263、146270947积一：220083547182922061E：65537求得 D = 122005207634220149得到公钥 220083547182922061 和 65537，私钥 220083547182922061 和 122005207634220149。假如明文是 12345678987654321加密得到密文：99815494076289543解密得到明文：123456789876543212.2 为什么以上两个例子不能投入实际使用？上面两个例子以最简单的方式说明了 RSA 算法的机制，但为什么这两个例子无法在实际应用中使用？答案很简单，积一的素数因子分解太容易了，55 = 5 * 11 一眼就能看出来，220083547182922061 = 1504629263 * 146270947 用计算机来计算也不难，因此我们根据公钥能够迅速猜到私钥，密文就能被直接解密了。 只有当两个素数非常大时，RSA 算法才有实际应用的意义。它所基于的数学原理就一句话：两个大素数相乘十分容易，但是想要对其乘积进行素数因子分解却极其困难。 为了演示，CnPack 组件包中的 CnRSA.pas 单元里也提供了 CnInt64RSA 实现类，它能够实现 Int64 范围内的 RSA 加解密。如上面所说，它的加解密强度相当弱，只能作为教学演示使用。 ======================================================================RSA 算法的工程实现RSA 算法要在实际应用中使用，爱思考的读者们一定已经看出了至少有以下几个点：3.1 RSA 算法投入实际使用所面临的必须解决的问题要加大运算强度与破解难度，Int64 明显不够，需要非常的大整数运算支持。很大的素数如何准确快速地寻找？我们熟知的筛法对于大素数寻找太慢了。加解密的过程都需要进行大整数的高次幂求余运算，直接算极易溢出，一般机器跑不动。生成公私钥时的 D 怎么求？所幸的是，以上的第一个工程问题与后三个数学问题目前全都解决了，下面分别阐述。3.2 大整数运算大整数运算有不少开源库可以参考，如 GMP 库、JDK 中的 BigInteger 等。CnPack 组件包中参考 OpenSSL 中的 BN_ 大数库，在 CnBigNumber.pas 单元中实现了 TCnBigNumber 类，实现了大整数的常规四则运算、乘方开方、比较、位运算等功能。 一个 TCnBigNumber 代表一个没有明显上限的大整数，它内部用一个名为 Neg 的变量标记其正负，另用一可变长度的 UInt32 数组表示该大数的数值。该数组中，越靠近内存高位越代表大数的高位，UInt32 内部则依赖于 CPU 的大小端。在 x86 这种小端 CPU 上，一个 TCnBigNumber 的大数值，严格等于该数组经字节倒序后所表达的数。 UInt32 数组中的每个 UInt32 数组元素代表大数中的运算最小单元，类似于十进制里的每一位。两个大数相加减较易理解，对应数组元素加减即可，但要注意进位和借位的变化。乘法则按竖式乘法那样每个元素与对方相乘再相加，数值较大时可用 Karatsuba 算法加速。除法最为复杂，要模拟竖式除法里的试除并轮减求余数，并且 UInt32 的数组元素间的整除和求余运算其实涉及到 64 位的借位除法，在 32 位平台下涉及 DIV 等汇编指令（或使用系统封装的 _lludiv 汇编方法），因而效率较已经实现了 128 位借位除法的 64 位平台下略低。 另外，在复杂的运算中，经常需要临时生成大数对象作为中间运算的结果存储，而频繁创建及释放 TCnBigNumber 对象对运行效率影响较大，因而 CnBigNumber.pas 单元中也提供了大数池 TCnBigNumberPool 的机制，供运算过程中快速获取及回收大数对象，提升运行效率。 在 64 位系统上，一个 TCnBigNumber 的大数数值表示元素也可用 UInt64 代替，这样运算的拆分粒度较 UInt32 更大，更能有效利用 64 位 CPU 的运算能力，但该机制尚未经完整的严格测试因而默认未开放。如需要使用，可在头部找到 {$IFDEF CPU64BITS} 行，取消 {$DEFINE BN_DATA_USE_64} 的注释即可。 3.2 寻找大素数RSA 每一对公私钥都离不开两个大素数，而大素数的寻找不能用常规的筛法，其时间复杂度太高无法忍受。譬如较为典型的埃拉托斯特尼筛法，其时间复杂度为 O(nlog(logn))，n 一大就跑不动了。 有不少数学家在大素数搜索这个领域进行了深入研究，目前效率较高的确定性大素数判定算法有 AKS 等，其时间复杂度在 O(log^12(n)) 到 O(log^6(n))，但仍然不够。 著名数学家费马提出的费马小定理衍生了一种素数判定算法，如果某个数不符合费马小定理，那么它一定是合数，但满足费马小定理的数偏偏还有不少卡迈克尔数不是素数，因而基于费马小定理的素数判定算法只能说是一种不确定的概率性算法，而且失败的概率不太可控。 后来数学家 Miller 和 Rabin 基于费马判定，终于研究出了目前较为通用的概率性的米勒-拉宾（Miller-Rabin）素性测试算法，该算法对一个大数进行多轮独立判定，每一轮判定通过的话，该大数便有一定概率是素数。如果某数通过了许多轮判定，那么它是合数的概率就会非常小，工程上可以近似认为它就是素数。 米勒-拉宾素性测试算法的时间复杂度是多项式级的，约 O(klog^3(n))，并且误判的概率可以通过判定的轮数来控制，是目前工程上通用的快速大素数发掘算法。CnBigNumber.pas 中也提供了该算法的实现 BigNumberIsProbablyPrime 函数，允许自定义轮数来针对一个大数做米勒-拉宾素性测试，默认是 50 轮。寻找指定长度的素数时，则先随机填充长度并就近取为一个奇数大数进行米勒-拉宾素性测试，如果没通过，则加 2 继续做，一般用不了多久就能找到一个大素数。 当然，RSA 算法里能够充当私钥的两个大素数还有一些其他安全要求，譬如两个素数的积要满足目标位数、两个素数的差的位数要大于积的位数的三分之一、其积的 NAF 形式要满足一定条件等，CnRSA.pas 中的 CnRSAGenerateKeys 方法里有其对应实现与约束。 3.2 蒙哥马利快速幂求余RSA 加解密过程中要用到大数的求幂再求余操作，该操作不仅慢而且容易溢出，因而同样需要优化。目前典型的快速幂求余算法是蒙哥马利（Montgomery）快速幂求余算法，该算法可将大数的幂求余转换成积求余，再将积求余转换成和求余，不过后者在大数库中可以直接计算，再转的话反倒更慢了。 CnBigNumber.pas 中的 BigNumberPowerMod 是该算法的优化实现，加入了滑动窗口机制以提速，另还有 BigNumberPowerPowerMod 算法供简化幂幂求余的计算。 3.3 扩展欧几里得辗转相除法求 DRSA 算法中求 D 实际上是解一个不定方程。解该方程可以用扩展欧几里德辗转相除法。CnBigNumber.pas 中分别实现了 BigNumberExtendedEuclideanGcd 与 BigNumberExtendedEuclideanGcd2 两个函数，可以分别用来求解二元一次不定方程 A * X + B * Y = 1 和 A * X - B * Y = 1 的一组可能的整数解。其中 A 和 B 是传入的已知系数，X 和 Y 则是解出的结果，调用者需自行保证 A 和 B 互素，否则结果不准确。如果解出的 X 小于 0，可用再加上 B 以满足实际使用的要求。 3.4 能实际使用的 RSA 例子这里举一个用 CnRSA 生成并实现的 1024Bit 的 RSA 例子： 素数1：11795690727769166502699638182754409621456989841069533832409296669283539752710514527118625192440783910929318385366251930645685151242541471612896690908882923456354611372214569998798084210665759517540352249124683826216519450941427190839581034113979818949296421808888128229002101509923237360815392588526618623329素数2：41796933860949200670641741619002242706200884209800427754253948967485500817792149989487462921560747234453728927850855387841283613487237843749810167266874818386701456382226980435208447566858623992216821707365826319661759609660952845848248344717132880325137049426056929895980579645903534795006345618720672323903私钥：493023705192779595210145354685109032381675423245360416178769886612163990284348875671828035231858207098648425646220707837436431132668213677174682529367508918477166322056877775736729813634753876786035741510262055711504159365918297754773269440589944916358958356251028578635995752304389582201751807633999913547105822151847389558292350264276539573157158412151534508675407677679382724637583925191636337580097289205994468084262989724899881442817872960905702688082976843140262209457214252940923560528088923892710365238269097437794268515595342764640130947923874793568727740340900389930404581924472824917092620371109040133087135809648745674199800551659186875709318192569324938456036671388116779781140475613050696728871335828810471947574518553467342720772053332644369356908352100927800605514626742366684089648985278724043186341173455618837599899126187085606099178070570369036956654640972272440455248658259473963219070530894252108568670123741636034469281039220462078765731342191652521431688864354969945295611074934753899645904014933858251338620621806232860404238483976297099160836127912880292330477076462999501920642080564286548567282027098415191128055260860093628449927525319005051929366532495686583229065742627467952309370633927463816745537公钥：49302370519277959521014535468510903238167542324536041617876988661216399028434887567182803523185820709864842564622070783743643113266821367717468252936750891847716632205687777573672981363475387678603574151026205571150415936591829775477326944058994491635895835625102857863599575230438958220175180763399991354710582215184738955829235026427653957315715841215153450867540767767938272463758392519163633758009728920599446808426298972489988144281787296090570268808297684314026220945721425294092356052808892389271036523826909743779426851559534276464013094792387479356872774034090038993040458192447282491709262037110904013308765537输入明文 123456789098765432160987654321234567890 计算得到密文：370761033836692845867876908686801249690501348545326198396750376307045398113322358066839178778435264575616327278764502560461230964491703721106607773979135199442894855382213278795836052552935514091663273554569294373201200736874888350373001927444818995774668351437275863963782001163681323154102543656763841655066052620792911166395441572020624608625297270763670162863103600728965900763109571233491420275859860131675836838619509708151209660156607343765129188413561502687349711359681330652057612549647531874481003031800795322394905021006554579157421282649620031479766125003843382414751938227385246262073569289334870480359解密后的明文 123456789098765432160987654321234567890 ======================================================================RSA 的具体使用非对称加密算法主要有两大应用场合：加密解密、签名验签。不光 RSA 如此，ECC 也如此。 以上的说明中，RSA 运算的明文均是以数字的方式参与运算的，但原始被处理的数据如何转换成数字及如何还原，这部分还涉及到填充与对齐。注意 RSA 加密时无法处理长度超过两个素数乘积（上文的积一、正式名称为 Modulus）位长度的数据，这一点和那些能够分组无限长加密的对称加密算法不同。虽然 RSA 理论上也可以将超长数据分成一块块后，像分组加密算法一样逐块加密，但因为 RSA 的计算效率远低于分组对称加密，因而这种分块机制可行性较弱，并没有通用规范规定如何做。填充对齐的规则由 RFC 文档规范说明。 另外，RSA 的公私钥也涉及到传递、保存、加载，目前 CnPack 组件包内实现了 PEM 格式的兼容处理，该格式使用 BER/DER 方式的编码将公私钥等关键信息存储在树状结构中，并将树状结构输出成二进制再 Base64 编码。而且 PEM 格式还支持用指定密码进行对称加密，以避免私钥文件丢失导致泄密。4.1 填充与对齐RSA 加解密使用的是 PKCS1 对齐填充方式，该方式会将一段数据填充至指定字节长度，如果原有数据长度太长则出错，填充失败。PKCS1 又分三种填充类型，分别是 Private 00、Private FF、Public Random三种。RSA 私钥加密数据时使用 Private FF 类型的 PKCS1 填充，公钥加密数据时使用 Public Random 类型的 PKCS1 填充。目的都是在原始数据前面加上“0、填充类型、填充内容、0”四部分数据凑成等于 RSA 两个素数乘积位长度的固定长度，而且第一个字节 0 确保该数值确定小于 Modulus。注意公钥加密数据时填充使用了随机内容，因此相同公钥针对相同数据加密，每次结果会不同。 4.2 加密与解密CnRSA.pas 单元使用 TCnRSAPrivateKey 与 TCnRSAPublicKey 两个类来容纳一对 RSA 公私钥，公私钥可以通过 CnRSAGenerateKeys 函数生成，或通过 CnRSALoadKeysFromPem 从 OpenSSL 生成的密钥文件中载入（支持部分算法的密码加密的 PEM 格式），也可以通过 CnRSASaveKeysToPem 函数保存至 PEM 格式的密钥文件（支持部分指定对称加密算法的密码加密）。 CnRSAEncryptData 与 CnRSAEncryptFile 函数能够分别使用公私钥对文件或数据加密，CnRSADecryptData 与 CnRSADecryptFile 函数能够分别使用公私钥解密数据或文件。这批函数内部均实现了 RFC 规定的填充与对齐的添加与去除，兼容 OpenSSL。 4.3 签名与验签RSA 算法一般用私钥签名、公钥验证签名。RSA 针对文件的签名也分两种：指定 Hash 算法的与不指定 Hash 算法的。不指定 Hash 算法时，RSA 签名的机制是直接将原始文件来个 Private FF 类型的 PKCS1 填充，然后私钥加密，保存成签名文件。指定 Hash 算法时，先用指定的 Hash 算法算出原始文件的 Hash 值，再以 BER 格式拼上一些说明信息如使用了哪种 Hash 算法等，再来个 Private FF 类型的 PKCS1 填充，然后同样私钥加密，保存成签名文件。 验证签名时则用公钥将签名文件解密并去除 PKCS1 对齐内容，如果知道是无 Hash 算法的签名，直接比对原始文件与解密文件即可，对不上就是验签失败。如果知道是有 Hash 算法的，则按 BER 格式解开解密文件中的 Hash 算法与 Hash 值，然后按指定 Hash 算法计算原始文件的 Hash 值和解密文件中的 Hash 值对比，相同则验签成功。 无 Hash 算法的 RSA 签名除对齐方式不同外，本质上类似于私钥加密，因而同样有无法处理过长数据的问题。对于过长数据，指定 Hash 算法的 RSA 签名几乎是唯一的选择。Hash 算法能针对任意长的数据生成长度较短且固定的摘要值供 RSA 私钥加密。如果有恶意用户更改了原始数据，按 Hash 算法的特性无法生成同样的摘要，而如果用新摘要重新生成新签名，又需 RSA 私钥重新加密，因而只要 RSA 私钥保密了，这类 Hash 后再 RSA 的签名验证机制便没有明显漏洞，是目前与椭圆曲线签名同样流行的数据防篡改机制。 该签名与验证签名的功能同样兼容 OpenSSL。 ======================================================================例子与帮助CnRSA 的详细例子可见 cnvcl/Example/VCL/RSA 目录。例子的第二个 Tab “Big Number RSA”是 CnRSA 的核心内容，公私钥的生成、保存、加载以及文件的加密解密验证签名均在其中演示。CnRSA.pas 源码中也有对各类以及各方法的详细说明可供参考。======================================================================联系我们开发网站：https://www.cnpack.org 开发论坛：https://bbs.cnpack.org 管理员信箱：master@cnpack.org 源码：https://github.com/cnpack
AI摘要 摘要：在使用Delphi 7进行数据库开发时，如果遇到TADOConnection组件因网络掉包而报错的问题，可以通过调整连接属性、实现自动重连机制、使用连接池、定期检测连接状态和优化网络环境等方法来提高连接稳定性和应对掉包问题。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); 问题：假如你是一个delphi专家，我用Delphi7做数据库开发，采用的是CS模式，就是客户端+服务端模板，使用的TADOConnection组件，现在出现一个问题，如果网络连接有掉包的话，就会报错，请问有解决办法吗？GPT回答：在Delphi 7中使用TADOConnection组件进行CS模式的数据库开发时，如果网络连接出现掉包或者不稳定的情况，确实可能会导致错误发生。针对这个问题，有几种解决方法可以尝试：1. 设置TADOConnection的连接属性调整TADOConnection组件的属性，可以提高连接的稳定性：ConnectionTimeout: 设置连接超时的时间（单位为秒）。你可以增加超时时间，比如设置为30秒或更长时间，来应对网络波动。CommandTimeout: 设置命令超时的时间，确保在执行查询时不会因为网络问题而快速超时。KeepConnection: 设置为True，以保持连接，而不是在每次执行查询后关闭连接。LoginPrompt: 设置为False，避免在连接断开时弹出登录对话框。2. 实现自动重连机制在掉包或连接失败时，可以尝试自动重连。你可以在应用程序中捕获异常，检测到连接失败后，自动尝试重新连接。例如：procedure TForm1.HandleADOError(E: Exception); begin if (E is EADOError) then begin // 判断错误代码或错误信息，决定是否重连 if Pos('network-related', E.Message) > 0 then begin try ADOConnection1.Close; ADOConnection1.Open; ShowMessage('Reconnected to the database.'); except on E: Exception do ShowMessage('Failed to reconnect: ' + E.Message); end; end; end; end;然后在你的代码中，捕获异常并调用HandleADOError方法。3. 使用连接池连接池可以减少创建和销毁连接的开销，并能更好地管理连接。在TADOConnection中启用连接池的方法是使用连接字符串中的Pooling=true参数。ADOConnection1.ConnectionString := 'Provider=...;Data Source=...;Pooling=True;...';4. 定期检测连接状态定期发送“心跳”查询（例如SELECT 1）来检测连接状态，如果连接已断开，则进行重连。procedure TForm1.CheckConnection; begin if not ADOConnection1.Connected then begin try ADOConnection1.Open; except on E: Exception do begin ShowMessage('Failed to reconnect: ' + E.Message); end; end; end else begin try ADOQuery1.SQL.Text := 'SELECT 1'; ADOQuery1.Open; ADOQuery1.Close; except on E: Exception do HandleADOError(E); end; end; end;5. 优化网络环境如果可能的话，优化你的网络环境，减少掉包率。可以通过更换网络设备、优化网络配置、使用VPN、或者专线连接等方式，来提高网络的稳定性。总结以上几种方法可以组合使用，以提高Delphi 7中TADOConnection组件的数据库连接稳定性和应对掉包问题。你可以根据具体的场景选择合适的方法，来增强应用的健壮性。
AI摘要 CnPack密码算法库是一个开源的加解密源码库，支持Delphi和C++Builder等开发环境，覆盖了国内外常见的加解密算法及中国国家商用密码算法。它包括对称加密、非对称加密、杂凑等多种算法，还提供编码解码、CA证书、大数支持等功能。CnPack开发组由一群热爱Delphi/C++Builder程序开发的中国程序员组成，旨在开发优秀的第三方免费开源产品。 document.addEventListener('DOMContentLoaded', function() { const urlDisplay = document.getElementById('urlDisplay'); urlDisplay.textContent = "此内容根据文章生成，更内容请访问：" + window.location.href; }); CnPack 密码算法库概述CnPack 密码算法库（CnPack Crypto Library）源于 CnPack 开发组的开源项目 CnVcl 组件包（CnVcl Component Package），是一套以纯 Object Pascal 语言编写的开源加解密源码库，支持 Delphi 5 至最新版本的 RAD Studio，支持 C++Builder 5/6 及 Lazarus/FPC，并支持 32 位与 64 位的 Windows、MacOS、Linux 等操作系统。CnPack 密码算法库致力于提供强大的加解密算法支持与数据安全保障。它覆盖了国内外常见的加解密算法及中国国家商用密码算法，包括对称加密、非对称加密、杂凑（或名散列、摘要、哈希）等大类及众多其他基础与辅助功能。许可协议CnPack 开发包以开放源码（Open Source）的形式发布，遵守 CnPack 的许可协议，受 CnPack 许可协议的保护。License 文件中有该协议的详细描述，具体内容可参考协议文件。主要内容对称加密：SM4、AES、DES、3DES、RC4、ChaCha20、TEA、ZUC非对称加密：RSA、ECC 椭圆曲线（魏尔斯特拉斯曲线，包括 SM2）、25519/448 椭圆曲线（蒙哥马利及扭曲爱德华曲线）杂凑：SM3、MD5、SHA1、SHA2/SHA3 系列（192、256、384、512）、SHAKE、CRC8/16/32/64、Poly1305、FNV、一次性杂凑签名算法 OTS其他密码学领域：SM9、同态加密、协同加密、格密码、NTRU编码解码：Base64、ASN.1（DER/BER）CA证书：RSA/ECC 证书申请、签发与校验大数支持：大整数、大有理数、大浮点数、一元大数多项式、二元大数多项式、一元大有理数分式运算支持：素数运算、浮点复数运算、位运算、矩阵运算、离散傅立叶变换、128 位整型支持其他：关联数据认证加密、动态口令 OTP、密钥派生 KDF、秘密共享的 Shamir 门限方案及 Feldman VSS 方案国密支持CnPack 密码算法库对中国国家商用密码算法标准有着完整而强大的支持：SM2：GM/T 0003.x-2012《SM2椭圆曲线公钥密码算法》，1～5SM3：GM/T 0004-2012《SM3密码杂凑算法》SM4：GM/T 0002-2012《SM4分组密码算法》SM9：GM/T 0044-2016《SM9 标识密码算法》ZUC：GM/T 0001.x-2012《祖冲之序列密码算法》，1～3另外也包括 OTP：《GB/T 38556-2020 信息安全技术动态口令密码应用技术规范》。安装与使用获取源码有两种途径可获取最新版的 CnPack 密码算法库。第一种途径是 CnPack 网站上下载或 gitee 上直接拉取。第二种途径是 CnPack 网站上下载或 github 上拉取下载最新的 CnVcl 源码包，在 Windows 系统中解压后运行 cnvcl/GenCrypto.bat，即可在 cnvcl 的同级目录下生成 cncrypto 目录，内有 CnPack 密码算法库所有源码。日常 CnPack 密码算法库也是自 CnVcl 中维护再同步的。编译引入CnPack 密码算法库不涉及 VCL/FMX 界面组件，仅是基础库的形式提供，因而可直接将 cncrypto/Source 目录加入 Delphi 的工程搜索路径，便可直接在工程中 uses 相应单元并调用。另外 CnPack 密码算法库也提供了运行期包的形式，在任一版本 Delphi 中打开 cncrypto/Package/CnCrypto.dpk，即可编译成 BPL 使用。注：如果在 Delphi 5 下编译 BPL，需手工将 requires 语句中的 vcl 改为 vcl50。测试用例cncryptoTest 目录下有一完整的命令行测试用例 CryptoTest.dpr，使用任一版本 Delphi 打开运行即可覆盖验证 CnPack 密码算法库的绝大多数功能，或用 C++Builder 5/6 打开 Crypto.bpr、或用 Lazarus 打开 Crypto.lpi，均同样可以运行。尾部两个用例耗时较长以小时计，跑时需有耐心。关于我们CnPack 开发组由互联网上热爱 Delphi/C++Builder 程序开发的一群中国程序员自愿者自发组成，其目标是开发中国人自己的真正优秀的第三方免费开源产品。网站：https://www.cnpack.org邮件：master@cnpack.org微信公众号：CnPack开发组