【发布时间】:2026-01-30 04:20:03
【问题描述】:
我的组件有一个奇怪的情况:当组件放置在表单上时,我无法让 Delphi IDE 在源代码中添加正确的单元。不仅包括错误的单位,而且在某些情况下不包括正确的单位(我试图使用TSelectionEditor 后代添加)。
这些组件应该是标准 TOpenDialog/TSaveDialog 组件的替代品。它们实际上是代理组件,将根据一些全局配置实例化正确的类型(基本对话框或自定义对话框)。
我已经编写了几个单元来实现所有必要的类和组件,其中一些应该包含在使用组件的任何地方:
-
git.dialogs.pas是注册的TComponent后代的实现位置(以及所有实用程序和公共函数和类) -
git.dialogs.interfaces.pas包含用于与组件交互的所有接口,应包含在内以访问依赖于实现的属性和方法
组件的注册放在一个名为“git.dialogs.registration.pas”的单元中。它包含一个覆盖RequiresUnits 方法的TSelectionEditor 后代,如下所示:
uses System.Classes, GIT.Dialogs, DesignEditors, DesignIntf;
type
TGITDialogSelectionEditor = class(TSelectionEditor)
public
procedure RequiresUnits(Proc: TGetStrProc); override;
end;
procedure register;
begin
RegisterComponents('GIT Dialogs', [GIT.Dialogs.TGITFileOpenDialogCpn, GIT.Dialogs.TGITFileSaveDialogCpn]);
RegisterSelectionEditor(GIT.Dialogs.TGITFileOpenDialogCpn, TGITDialogSelectionEditor);
RegisterSelectionEditor(GIT.Dialogs.TGITFileSaveDialogCpn, TGITDialogSelectionEditor);
end;
{ TGITDialogSelectionEditor }
procedure TGITDialogSelectionEditor.RequiresUnits(Proc: TGetStrProc);
begin
inherited;
Proc('GIT.Dialogs');
Proc('GIT.Dialogs.Interfaces');
end;
然后使用RegisterSelectionEditor 在通常的register 过程中注册该类。
理论上,当我将其中一个组件放在表单上时,IDE 应该自动将GIT.Dialogs 和GIT.Dialogs.Interfaces 单元添加到源文件的接口使用子句中。然而,它没有:
- 它正确地添加了
GIT.Dialogs.Interfaces。 - 它添加了一个未列出的单元
GIT.Dialogs.FileDialog.Base,其中包含其他几个在内部使用但未在任何地方注册的TComponent后代。 - 如果源文件已包含
Dialogs单元(来自 VCL),则不会添加GIT.Dialogs单元。
我该如何解决这种情况? 添加GIT.Dialogs.FileDialog.Base 单元并不是什么大问题,因为无论何时使用该组件,它都会被链接,但事实上@ 987654338@ 文件未添加需要手动修复组件被删除或使用的每个表单。
【问题讨论】:
-
您是否尝试将
Dialogs单位指定为Vcl.Dialogs? -
它确实可以解决问题,但我仍然需要手动调整所有现有表单。
-
您是否在项目中使用了与所需单位冲突的单位范围名称?
-
@PaulMichael 不。我们的大多数项目(我们的应用程序中实际上有大约 130 个不同的项目)最初都是从 Delphi 6 移植的,因此有很多隐含的命名空间,但没有一个是冲突的。
标签: delphi delphi-xe5