Delphi:当组件放置在表单上时,错误的单元将unit添加到源文件的uses子句中
我的一个组件出现了一个奇怪的情况:当该组件放在表单上时,我无法让Delphi IDE在源代码中添加正确的单元。在某些情况下,不仅包括错误的单元,而且还包括正确的单元(我试图使用Delphi:当组件放置在表单上时,错误的单元将unit添加到源文件的uses子句中,delphi,delphi-xe5,Delphi,Delphi Xe5,我的一个组件出现了一个奇怪的情况:当该组件放在表单上时,我无法让Delphi IDE在源代码中添加正确的单元。在某些情况下,不仅包括错误的单元,而且还包括正确的单元(我试图使用TSelectionEditor后代添加这些单元) 这些组件应该是标准TOpenDialog/TSaveDialog组件的替代品。它们实际上是代理组件,将根据某些全局配置实例化正确的类型(基本对话框或自定义对话框) 我已经编写了几个单元来实现所有必要的类和组件,其中一些应该包含在组件使用的任何地方: git.dialog
TSelectionEditor
后代添加这些单元)
这些组件应该是标准TOpenDialog/TSaveDialog组件的替代品。它们实际上是代理组件,将根据某些全局配置实例化正确的类型(基本对话框或自定义对话框)
我已经编写了几个单元来实现所有必要的类和组件,其中一些应该包含在组件使用的任何地方:
是实现注册的git.dialogs.pas
子体(以及所有实用程序和公共函数及类)的地方t组件
包含用于与组件交互的所有接口,应包括这些接口,以便访问依赖于实现的属性和方法git.dialogs.interfaces.pas
t选择编辑器
子体,该子体覆盖requireUnits
方法,如下所示:
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
单元添加到源文件的interface uses子句中。然而,它并没有:
- 它正确地添加了
GIT.Dialogs.Interfaces
- 它添加了一个未列出的单元GIT.Dialogs.FileDialog.Base,该单元包含两个内部使用但未在任何地方注册的其他
子体t组件
- 如果源文件已包含
单元(来自VCL),则不会添加对话框
单元GIT.Dialogs
我如何解决这种情况?添加
GIT.Dialogs.FileDialog.Base
单元并不是什么大问题,因为无论何时使用组件,它都会被链接,但是没有添加GIT.Dialogs
文件这一事实需要手动修复组件被删除或删除的每个表单已使用。完全指定默认VCL单位,即对话框
应指定为VCL。对话框
。这不仅可以解决在表单上删除此类组件时的特定问题,还可以帮助消除。习惯使用完全限定的单位名称
对于现有的表单,没有其他方法可以重写它们的单位子句。多文档搜索和替换工具可能很方便。您是否尝试将
对话框
单位指定为Vcl.对话框
?它确实可以解决问题,但我仍然需要手动调整所有现有表格。您在项目中使用的单位范围名称是否与所需单位冲突?@PaulMichael不。我们的大多数项目(我们的应用程序中实际上有大约130个不同的项目)最初都是从Delphi6移植的,因此有很多隐含的名称空间,但没有一个是冲突的。谢谢。不幸的是,这只是一个部分答案:它给出了一个提示,说明了可以采取哪些措施来避免我描述的问题之一,但没有真正说明如何解决它,也没有解释为什么会出现问题或为什么包含错误的单元。