如何在Delphi中通过代码获取当前文件的单元名称?
Delphi 动态获取当前单元名称的最优实现方法
需求是实现一个GetCurrentUnitName()函数,能直接返回当前单元的名称(如Unit1),用于调试时显示在窗体Caption中。之前尝试的两种方法存在明显不足:
- 方法1:常量硬编码,可行但不灵活,单元改名时必须手动修改常量值
- 方法2:通过RTTI获取,返回的是带类名的全称(如
Unit1.TForm1),且无法在无类的工具单元中使用
最优实现方案
利用Delphi编译期内置的%FILE%常量结合System.SysUtils的文件处理函数,就能实现完全动态、通用的单元名获取,且无需依赖RTTI,运行时无额外开销。
通用工具函数实现
先创建一个工具单元封装通用函数:
unit UnitUtils; interface uses System.SysUtils; function GetCurrentUnitName: string; implementation function GetCurrentUnitName: string; var FileName: string; begin // 编译期获取当前文件的完整路径 FileName := {$I %FILE%}; // 提取文件名(去除路径) FileName := ExtractFileName(FileName); // 移除.pas后缀,得到纯单元名 Result := ChangeFileExt(FileName, ''); end; end.
在窗体单元中使用
直接调用工具函数即可:
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, UnitUtils; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin Caption := GetCurrentUnitName; // 显示"Unit1" end; end.
在无类工具单元中使用
无需依赖任何类,直接在单元内实现或调用:
unit ToolUnit; interface uses System.SysUtils; function GetToolUnitName: string; implementation function GetToolUnitName: string; var FileName: string; begin FileName := {$I %FILE%}; Result := ChangeFileExt(ExtractFileName(FileName), ''); end; // 测试调用 procedure TestUnitName; begin Writeln(GetToolUnitName); // 输出"ToolUnit" end; end.
方案优势
- 完全动态:单元改名后自动同步,无需手动修改代码
- 全场景支持:兼容有类的窗体单元和无类的工具单元
- 高性能:编译期处理路径和文件名,运行时无额外计算开销
- 低依赖:不需要RTTI或其他复杂库,兼容性更好
内容的提问来源于stack exchange,提问作者Shaun Roselt
相关产品推荐
相关产品推荐

