简介这份资源是TurboPower全套VCL组件源码及相关文档的完整归档面向仍在使用Delphi进行桌面与数据库开发的工程师以及需要研究经典第三方控件实现的技术人员。TurboPower作为有18年历史的Delphi组件厂商于2004年停止运营并开放全部产品源代码本包正是这批遗产的集中整理涵盖Abbrevia、Async Professional、B-Tree Filer、Essentials、FlashFiler、Internet Professional、LockBox、OfficePartner、OnGuard、Orpheus、ShellShock、SysTools、Visual PlanIt、XML Partner等系列。压缩包共812个文件约102.96MB以dfm窗体、cpp与pas源码、h头文件、dpr与bpr工程文件为主另含wav音频、zip子包、txt说明等便于直接编译与二次开发。已有298人学习下载适合需要参考成熟组件架构、复用通信与压缩模块或补全旧项目依赖的开发者。1. TurboPower 全套组件一套被时间验证过的 Delphi 控件库到底还值不值得翻出来用如果你手头有一个维护了十年以上的 Delphi 项目大概率会在uses里见过StBase、StUtils、StStrL这类单元名。它们来自 TurboPower 系列组件库——一个在 Delphi 社区里被反复提起、却很少有人系统整理过的控件包合集。这次拿到的资源是一整套 TurboPower 组件源码加配套文档覆盖字符串处理、文件系统、数据库访问、界面控件等多个模块。它解决的核心问题很具体当你需要在不引入第三方商业控件的前提下快速补齐 Delphi 原生 VCL 缺失的能力时这套源码可以直接编译进项目不依赖运行时包也不挑 Delphi 版本。适合谁正在维护遗留 Delphi 系统、需要稳定字符串/文件工具库、或者想研究经典 Pascal 工程结构的开发者。不适合谁纯新项目、已经全面转向 FireMonkey 或跨平台框架的团队。2. 拆包先看目录TurboPower 各子库的分工与选型逻辑2.1 从压缩包到 IDE目录结构与单元命名规律拿到资源后别急着往 IDE 里拖。先解压用资源管理器看一眼顶层目录。常见的 TurboPower 合集包会按子库分文件夹比如StShell、StBar、StDBase、StStrL、StUtils、StVisual等。每个文件夹里通常包含.pas源码、.dcr组件资源文件、.dpk包定义文件以及一个Docs或Help子目录放.hlp或.chm文档。这里有个血泪经验不要一次性把所有.dpk都装进 IDE。TurboPower 各子库之间有依赖关系但并非全部互相依赖。我一般会先打开StBase.dpk或StUtils.dpk这类基础包确认它依赖哪些单元再决定安装顺序。常见做法是基础工具库 → 字符串/文件库 → 数据库/界面库逐层往上装。{ 示例StUtils 中常见的字符串分割函数签名先看接口再决定用不用 } function StSplitStr(const s: string; delim: Char): TStringList; { 逻辑说明按指定分隔符切分字符串返回 TStringList 参数 s待切分的原始字符串 参数 delim分隔符单字符 注意返回的 TStringList 需要调用方自行 Free否则内存泄漏 }上面这段不是让你现在编译而是让你养成习惯打开一个.pas文件先扫interface部分的函数声明判断这个单元能不能解决你当前的问题。TurboPower 的文档虽然老但interface部分的注释通常写得很清楚参数含义、返回值、异常情况都有标注。2.2 选型理由为什么不用原生 VCL 而选 TurboPowerDelphi 原生 VCL 在字符串处理上一直偏弱。比如TStringList的DelimitedText遇到带引号的 CSV 就翻车而 TurboPower 的StStrL单元提供了更健壮的StParseStr系列函数能处理转义引号、空字段、自定义分隔符。再比如文件路径操作原生ExtractFilePath不处理 UNC 路径的边界情况StUtils里的StGetFileName和StGetPath则考虑得更全。数据库访问方面TurboPower 的StDBase提供了一套轻量级的数据集封装不依赖 BDE 或 ADO 的特定版本适合需要跨数据库迁移的老项目。界面控件方面StBar提供了状态栏、进度条等增强控件StVisual里有更灵活的分页控件和树形控件。这些控件的共同特点是源码完全开放编译后直接链入可执行文件不需要额外分发 DLL 或运行时包。提示如果你用的是 Delphi 10.x 之后的版本部分 TurboPower 单元可能因为 Unicode 字符串默认启用而出现PChar与PWideChar不匹配的编译错误。这不是资源本身的问题而是版本迁移的常见坑后面章节会专门讲怎么改。2.3 安装与编译从 .dpk 到组件面板的完整步骤假设你用的是 Delphi 7 到 Delphi 2007 之间的版本安装流程相对简单。以StUtils为例第一步把StUtils文件夹整体复制到一个没有中文和空格的路径下比如D:\Components\TurboPower\StUtils。路径里有空格或中文IDE 编译时可能找不到单元。第二步在 Delphi 里打开StUtils.dpk在项目管理器里右键点击Contains节点确认所有.pas文件都在列表里。如果缺少某个文件手动 Add 进去。第三步点击 Compile。如果报错File not found: StBase.pas说明这个包依赖StBase你需要先把StBase编译好或者在StUtils.dpk的Requires里加上StBase。第四步Compile 通过后右键点击.dpk选择 Install。IDE 会把包里的组件注册到组件面板上通常出现在一个叫TurboPower或St开头的页签里。{ 如果不想装包也可以直接把 .pas 文件加入项目 uses 列表 } uses StUtils, StStrL, StBase; { 逻辑说明这种方式不注册组件面板但可以直接调用单元里的函数 适合只需要工具函数、不需要可视化控件的场景 注意需要把 .pas 文件所在目录加入 Project - Options - Directories 的 Search Path }参数说明Search Path里可以填多个路径用分号隔开。如果你把 TurboPower 放在D:\Components\TurboPower下就填这个根目录Delphi 会自动在子目录里找单元。但更稳妥的做法是每个子库路径都单独列出来避免同名单元冲突。3. 核心单元实战字符串、文件与数据库的典型用法3.1 StStrL 字符串处理比原生 TStringList 强在哪StStrL是 TurboPower 里使用频率最高的单元之一。它提供了一组以St开头的字符串函数覆盖查找、替换、分割、合并、大小写转换、去除空白等操作。和原生函数最大的区别在于这些函数对边界情况的处理更细致而且很多函数支持PChar和string两种调用方式。举个例子原生Pos函数只能找子串第一次出现的位置而StStrL里的StPos支持从指定位置开始查找还支持大小写不敏感模式。再比如StReplace可以一次性替换所有匹配项不需要自己写循环。program DemoStStrL; {$APPTYPE CONSOLE} uses SysUtils, StStrL; var s: string; list: TStringList; begin { 示例1大小写不敏感查找 } s : TurboPower Delphi Components; if StPosIns(delphi, s) 0 then Writeln(找到 delphi位置, StPosIns(delphi, s)); { StPosIns 是大小写不敏感版本返回子串起始位置找不到返回0 } { 示例2按多个分隔符切分 } list : TStringList.Create; try StSplitStrToLists(a,b;c|d, ,;|, list); Writeln(切分结果数量, list.Count); { StSplitStrToLists 支持传入多个分隔符字符比 TStringList.DelimitedText 灵活 } finally list.Free; end; { 示例3去除字符串首尾指定字符 } s : ***hello***; Writeln(去除星号后, StStripChars(s, *)); { StStripChars 去除首尾所有出现在指定字符集中的字符 } end.逻辑说明StPosIns的第三个参数可以指定起始位置默认从 1 开始。StSplitStrToLists的第二个参数是分隔符集合每个字符都视为独立分隔符。StStripChars只处理首尾不处理中间。参数说明这些函数的字符串参数都支持string类型在 Delphi 2009 之后的 Unicode 版本里也能正常工作但需要注意PChar版本会变成PWideChar。如果你在旧代码里看到StPos传的是PChar迁移到新版本时要么改成string要么显式转换。3.2 StUtils 文件与路径操作跨版本兼容的写法StUtils里的文件操作函数比原生SysUtils更贴近实际项目需求。比如StGetFileName可以从完整路径里提取文件名同时正确处理带空格和特殊字符的路径。StGetPath提取目录部分末尾自动带反斜杠。StFileExists在旧版本 Delphi 里比FileExists更稳定因为它处理了长文件名和 UNC 路径。uses StUtils; procedure TForm1.CheckFile; var fullPath, fileName, dirPath: string; begin fullPath : C:\Program Files\My App\data\config.ini; fileName : StGetFileName(fullPath); { 返回 config.ini } dirPath : StGetPath(fullPath); { 返回 C:\Program Files\My App\data\末尾带反斜杠 } if StFileExists(fullPath) then ShowMessage(文件存在) else ShowMessage(文件不存在); { StFileExists 内部会处理路径中的环境变量和相对路径 } end;逻辑说明StGetFileName和StGetPath不修改原字符串返回新字符串。StFileExists返回布尔值不抛异常。参数说明这些函数对\\server\share\file形式的 UNC 路径也能正确处理。如果你在旧项目里看到用ExtractFileName处理 UNC 路径导致文件名提取错误换成StGetFileName通常能解决问题。3.3 StDBase 数据库访问轻量封装的取舍StDBase提供了一套基于TDataSet的封装但它的设计目标不是替代TTable或TQuery而是提供一些原生数据集没有的便利功能。比如StDataSet可以自动处理字段的DisplayFormat和EditFormatStDBUtils里有一些批量字段赋值的辅助函数。uses StDBase, DB, DBTables; procedure TForm1.OpenQuery; begin with TQuery.Create(Self) do try DatabaseName : MyDB; SQL.Text : SELECT * FROM Customers WHERE City :City; ParamByName(City).AsString : Beijing; Open; { 使用 StDBase 的辅助函数遍历字段 } while not Eof do begin { StGetFieldValue 可以按字段名取值字段不存在时返回默认值而不是抛异常 } Memo1.Lines.Add(StGetFieldValue(FieldByName(Company), 未知公司)); Next; end; finally Free; end; end;逻辑说明StGetFieldValue的第一个参数是TField第二个参数是字段为Null时的默认返回值。这个函数在报表导出场景里很有用避免每个字段都写if Field.IsNull then。参数说明StDBase不依赖特定数据库驱动它操作的是TDataSet抽象层。所以无论你底层用 BDE、ADO 还是 dbExpress只要数据集对象是TDataSet后代这些辅助函数都能用。4. 避坑与排查TurboPower 在旧项目里翻车的五个典型场景4.1 编译报错“Unit not found”或“File not found”现象打开.dpk编译时提示找不到某个.pas文件或者uses列表里的单元无法解析。原因TurboPower 各子库之间有依赖但压缩包里可能没有按依赖顺序排列。另外如果 Search Path 没配好IDE 找不到子目录里的单元。解决先确认所有.pas文件都在磁盘上。然后在 IDE 的Tools - Environment Options - Library里把 TurboPower 根目录和每个子库目录都加到Library Path。如果还是不行打开.dpk的Requires节点手动添加缺失的包引用。4.2 Unicode 版本下的 PChar/PWideChar 不匹配现象在 Delphi 2009 及以上版本编译时报错Incompatible types: PChar and PWideChar。原因TurboPower 原始代码基于 ANSI 字符串编写很多函数参数写的是PChar。在 Unicode 版本里PChar等于PWideChar但代码里可能混用了AnsiString和string。解决找到报错的函数把PChar参数改成string或者用PAnsiChar显式声明。如果函数内部用了StrLen、StrCopy等原生函数换成StrLen的 Unicode 版本或改用string操作。常见做法是只改报错的单元不要全局替换避免引入新问题。4.3 组件面板装了但控件拖不出来现象.dpk编译安装成功组件面板也出现了 TurboPower 页签但拖控件到窗体时没反应或报错。原因.dcr资源文件没有正确编译进包或者包的Register过程没有执行。解决打开.dpk确认Contains列表里有对应的.dcr文件。如果没有手动 Add 进去。然后重新 Compile Install。如果还是不行检查.pas文件末尾的Register过程确认组件注册代码没有被条件编译指令屏蔽。4.4 运行时提示“Class not registered”或“Package not found”现象编译好的程序在开发机上运行正常复制到另一台机器上提示找不到包或类未注册。原因项目使用了运行时包Runtime Packages但目标机器上没有安装对应的.bpl文件。解决在Project - Options - Packages里取消勾选Build with runtime packages让编译器把用到的单元直接链入可执行文件。这样生成的 EXE 体积会大一些但部署时不需要额外分发 BPL。TurboPower 的源码包本身支持静态编译这是它比商业控件省心的地方。4.5 文档打不开或帮助文件失效现象Docs目录里的.hlp文件在 Windows 10/11 上双击没反应或者.chm打开后提示“无法显示页面”。原因Windows 新版本默认禁用了旧版 WinHelp 格式.chm文件如果来自网络下载会被标记为“来自不信任位置”。解决.hlp文件需要安装 WinHelp 查看器或者用第三方工具转成.chm。.chm文件右键属性勾选“解除锁定”再打开就能正常显示。如果文档实在打不开直接看.pas文件的interface注释TurboPower 的源码注释质量很高大部分函数看注释就能用。5. 进阶技巧把 TurboPower 单元改造成现代 Delphi 可用的工具库5.1 用条件编译做版本适配TurboPower 原始代码没有考虑 Unicode 和 64 位编译器。我一般会在单元开头加一段条件编译让同一份源码在旧版和新版 Delphi 下都能编译。unit StUtilsPatch; interface {$IFDEF UNICODE} {$DEFINE ST_UNICODE} {$ENDIF} {$IFDEF WIN64} {$DEFINE ST_64BIT} {$ENDIF} uses SysUtils {$IFDEF ST_UNICODE}, AnsiStrings{$ENDIF}; function StGetFileNameEx(const Path: string): string; { 统一入口内部根据编译条件选择实现 } implementation function StGetFileNameEx(const Path: string): string; begin {$IFDEF ST_UNICODE} Result : TPath.GetFileName(Path); {$ELSE} Result : StGetFileName(Path); {$ENDIF} end; end.逻辑说明UNICODE和WIN64是 Delphi 预定义的条件符号。ST_UNICODE和ST_64BIT是自定义符号方便在代码里多处引用。TPath.GetFileName是 Delphi XE 之后引入的跨平台路径函数比旧版ExtractFileName更健壮。参数说明Path参数支持相对路径和绝对路径。在 Unicode 版本下TPath.GetFileName能正确处理中文路径和长路径。在非 Unicode 版本下回退到StGetFileName保持旧项目兼容。5.2 把常用函数封装成独立工具单元如果你不想在每个项目里都引用整个 TurboPower 包可以挑出最常用的函数封装成一个独立的StToolkit.pas。这样新项目只需要带一个文件不用装包也不用配 Search Path。unit StToolkit; interface uses SysUtils, Classes, StStrL, StUtils; function SplitString(const S: string; Delimiter: Char): TArraystring; function FileNameOf(const Path: string): string; function PathOf(const Path: string): string; function ReplaceAll(const S, OldPattern, NewPattern: string): string; implementation function SplitString(const S: string; Delimiter: Char): TArraystring; var List: TStringList; I: Integer; begin List : TStringList.Create; try StSplitStrToLists(S, Delimiter, List); SetLength(Result, List.Count); for I : 0 to List.Count - 1 do Result[I] : List[I]; finally List.Free; end; end; function FileNameOf(const Path: string): string; begin Result : StGetFileName(Path); end; function PathOf(const Path: string): string; begin Result : StGetPath(Path); end; function ReplaceAll(const S, OldPattern, NewPattern: string): string; begin Result : StReplace(S, OldPattern, NewPattern); end; end.逻辑说明SplitString返回动态数组比TStringList更轻量调用方不需要管理对象生命周期。FileNameOf和PathOf是对StUtils的薄封装统一命名风格。ReplaceAll直接调用StReplace但对外暴露更直观的函数名。参数说明Delimiter是单字符分隔符。如果需要多分隔符可以再加一个重载版本内部调用StSplitStrToLists并传入分隔符集合。ReplaceAll的OldPattern和NewPattern都支持空字符串但空OldPattern会导致无限循环调用前需要自行判断。5.3 验证改造后的单元是否可用改完代码别急着往主项目里塞。先建一个控制台测试程序把常用函数跑一遍确认输出符合预期。program TestStToolkit; {$APPTYPE CONSOLE} uses SysUtils, StToolkit; var Parts: TArraystring; I: Integer; begin Parts : SplitString(alpha,beta,gamma, ,); for I : 0 to Length(Parts) - 1 do Writeln(Parts[I]); { 预期输出alpha / beta / gamma } Writeln(FileNameOf(C:\Data\test.txt)); { 预期输出test.txt } Writeln(PathOf(C:\Data\test.txt)); { 预期输出C:\Data\ } Writeln(ReplaceAll(a-b-c, -, )); { 预期输出abc } end.逻辑说明控制台程序不需要窗体编译快适合做单元测试。每个函数至少测一个正常输入和一个边界输入比如空字符串、不存在的路径、分隔符在开头或结尾的情况。参数说明SplitString传入空字符串时返回长度为 0 的数组。FileNameOf传入只有目录没有文件名的路径时返回空字符串。ReplaceAll传入空OldPattern时直接返回原字符串避免死循环。从那以后我每次把 TurboPower 单元引入新项目都会先跑一遍这个控制台测试确认字符串切分、路径提取、替换这三个基础功能在当前 Delphi 版本下行为一致再往主工程里加。希望帮到你。本文还有配套的精品资源点击获取