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.DialogsGIT.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 以在其他单元中使用

当单元格处于焦点时,iOS 在 TableViewCell 上放置一个视图

Delphi如何访问父窗体

delphi 和 C++ Builder 中的组件?

如何以编程方式将组件分配给 Delphi GridPanel 行和列?