如何确定自定义TComponent所在的DFM路径?

问题描述 投票:0回答:1

在自定义

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;
    
delphi designer tcustomcontrol
1个回答
0
投票
组件可以使用

TCustomForm
函数找到其父组件
Forms.GetParentForm()

TCustomForm

 具有 
Designer
 类型的 
IDesignerHook
 属性,在设计时为非零。

查询

IDesignerHook
IDesigner
,它有一个
ModuleFileNames()
方法来检索与
TCustomForm
关联的文件名,包括
.DFM
文件。

© www.soinside.com 2019 - 2024. All rights reserved.