如何在设计器中从自定义控件检测 dfm/项目路径?

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

背景

我创建了一个与

TControl
类似的自定义
TImageCollection
,但具有所有应用程序的共享图像数据库。 为此,控件读取一个项目元文件,该文件是一个 XML,其中包含要包含在图像集合中的图像列表。在设计器中,图像是直接从图像文件中读取的,但在运行时,图像位于编译期间生成的资源(
*.res
)文件中。

if csDesigning in Self.ComponentState then
  loadImagesFromFiles(...)
else
  loadImagesFromResource(...)

一切似乎都有效,除了:

在设计器中,在我第一次打开控件编辑器之前,图像集合无法读取资源(

*.res
),因为它尚未创建(这是在编译时完成的),因此,任何其他控件都显示这些图像显示为空白。图像必须从文件加载,但从设计器中的 TControl 无法得知项目的路径。

编辑器能够检测项目目录,从而打开图元文件并填充集合中的所有图像。但是,在编辑器打开之前,图像集合无法获取目录来访问该图元文件和所有图像。

问题

在设计器中的

TControl
中,如何检测项目的目录,或包含它的
*dfm

我的评价

ToolsAPI
几乎没有检测活动项目的功能,但是在 TControl 自定义实现中无法访问该单元。仅来自编辑器和其他设计器插件。

Environment variables
:强制所有开发人员设置一个指向项目根目录的环境变量,并在控件中使用它。这可以工作,但有很多缺陷:

  • 多个项目或同一项目的克隆难以管理(环境变量不能指向多个项目的目录)。
  • 使所有开发人员的设置变得更加复杂。
  • ...似乎是一个不好的做法。
  • Delphi 不允许为变量或常量设置“DEFINE”值?.

Project DEFINE
:将项目的绝对路径作为项目DEFINE是不可移植的。 Delphi 似乎也不允许这样做。

delphi designer tcustomcontrol
1个回答
0
投票

A

TControl
可以使用
Forms.GetParentForm()
函数找到其父 Form。

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

使用

IDesignerHook
运算符查询 IDesigner
 中的 
as
不要使用硬转换!)。

IDesigner
有一个
ModuleFileNames()
方法来检索与正在设计的对象关联的文件名,在本例中将是
TCustomForm
,因此
FormFileName
参数将输出
.dfm
的文件名(VCL ) 或
.xfm
(FMX)。

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