在自定义
TComponent
中,我需要获取使用 *.dfm
的 *.pas
或 TComponent
文件的路径。显然,这仅在设计时需要。
与上一个问题类似:
如何在设计器中从自定义控件检测 dfm/项目路径?
我创建了一个类似于 TImageCollection 的自定义 TControl,但具有所有应用程序的共享图像数据库。为此,控件读取一个项目元文件,该文件是一个 XML,其中包含要包含在图像集合中的图像列表。在设计器中,图像是直接从图像文件中读取的,但在运行时,图像位于编译期间生成的资源(*.res)文件中。
if csDesigning in Self.ComponentState then loadImagesFromFiles(...) else loadImagesFromResource(...)
在以前的版本中(对于上面链接的其他问题),我尝试获取项目的路径,虽然这似乎不可能,但我找到了一种获取活动项目的路径的方法。但是,当 IDE 打开多个项目时,这会产生很大的问题。
我决定改用另一种方法,即使用相对于使用组件的 DFM 的路径。这个应该比较靠谱吧。
不幸的是,对于放置在 DFM 上的自定义
TComponent
来说,要知道 DFM 的位置似乎并不容易。
我用
IOTA
尝试了几种解决方案,但还没有任何效果。
此处提供的方法返回到TComponent
本身的路径,而不是返回到使用它的DFM。我设法按照相同的策略迭代模块,但找到哪个模块包含给定的
TComponent
并不简单:
function GetCurrentDfmPath(AComponent: TComponent): String;
var
ModuleServices: IOTAModuleServices;
Module: IOTAModule;
idx: integer;
begin
Result := '';
SourceEditor := nil;
if SysUtils.Supports(BorlandIDEServices, IOTAModuleServices,
ModuleServices) then
begin
for idx := 0 to ModuleServices.ModuleCount - 1 do
begin
Module := ModuleServices.Modules[idx];
// Needs to match the module that contains AComponent.?
end;
end;
end;
TCustomForm
函数找到其父组件 Forms.GetParentForm()
。
TCustomForm
具有
Designer
类型的 IDesignerHook
属性,在设计时为非零。
查询IDesignerHook
的IDesigner
,它有一个ModuleFileNames()
方法来检索与TCustomForm
关联的文件名,包括
.DFM
文件。