You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:06:13