Delphi:当组件放置在表单上时,错误的单元将单元添加到源文件的使用子句
Posted
技术标签:
【中文标题】Delphi:当组件放置在表单上时,错误的单元将单元添加到源文件的使用子句【英文标题】:Delphi: Wrong unit added unit to uses clause of source file when component is placed on a form 【发布时间】:2017-04-14 12:19:50 【问题描述】:我的组件有一个奇怪的情况:当组件放置在表单上时,我无法让 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 移植的,因此有很多隐含的命名空间,但没有一个是冲突的。
【参考方案1】:
完全指定默认的 VCL 单元,即 Dialogs
应指定为 Vcl.Dialogs
。这不仅可以解决在表单上放置此类组件时的特定问题,而且还有助于消除other problems。习惯使用完全限定的单位名称。
对于现有的表单,没有其他方法可以重写它们的单元子句。多文档搜索和替换工具可能会很方便。
【讨论】:
谢谢。不幸的是,这只是部分答案:它给出了一个提示,说明可以做些什么来避免我描述的问题之一,但没有真正解决它,也没有解释为什么会发生问题或为什么包含错误的单元.以上是关于Delphi:当组件放置在表单上时,错误的单元将单元添加到源文件的使用子句的主要内容,如果未能解决你的问题,请参考以下文章
将组件添加到表单时如何自动添加 Delphi 单元? [复制]
将 TForm 分配给一个变量 Delphi 以在其他单元中使用