我创建了一个与
TControl
类似的自定义 TImageCollection
,但具有所有应用程序的共享图像数据库。
为此,控件读取一个项目元文件,该文件是一个 XML,其中包含要包含在图像集合中的图像列表。在设计器中,图像是直接从图像文件中读取的,但在运行时,图像位于编译期间生成的资源(*.res
)文件中。
if csDesigning in Self.ComponentState then
loadImagesFromFiles(...)
else
loadImagesFromResource(...)
一切似乎都有效,除了:
在设计器中,在我第一次打开控件编辑器之前,图像集合无法读取资源(
*.res
),因为它尚未创建(这是在编译时完成的),因此,任何其他控件都显示这些图像显示为空白。图像必须从文件加载,但从设计器中的 TControl 无法得知项目的路径。
编辑器能够检测项目目录,从而打开图元文件并填充集合中的所有图像。但是,在编辑器打开之前,图像集合无法获取目录来访问该图元文件和所有图像。
在设计器中的
TControl
中,如何检测项目的目录,或包含它的*dfm
?
ToolsAPI
几乎没有检测活动项目的功能,但是在 TControl 自定义实现中无法访问该单元。仅来自编辑器和其他设计器插件。
Environment variables
:强制所有开发人员设置一个指向项目根目录的环境变量,并在控件中使用它。这可以工作,但有很多缺陷:
Project DEFINE
:将项目的绝对路径作为项目DEFINE是不可移植的。 Delphi 似乎也不允许这样做。
A
TControl
可以使用 Forms.GetParentForm()
函数找到其父 Form。
TCustomForm
具有 Designer
类型的 IDesignerHook
属性,在设计时为非零。
使用
IDesignerHook
运算符查询 IDesigner
中的
as
(不要使用硬转换!)。
IDesigner
有一个 ModuleFileNames()
方法来检索与正在设计的对象关联的文件名,在本例中将是 TCustomForm
,因此 FormFileName
参数将输出 .dfm
的文件名(VCL ) 或 .xfm
(FMX)。