Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:当组件放置在表单上时,错误的单元将unit添加到源文件的uses子句中_Delphi_Delphi Xe5 - Fatal编程技术网

Delphi:当组件放置在表单上时,错误的单元将unit添加到源文件的uses子句中

Delphi:当组件放置在表单上时,错误的单元将unit添加到源文件的uses子句中,delphi,delphi-xe5,Delphi,Delphi Xe5,我的一个组件出现了一个奇怪的情况:当该组件放在表单上时,我无法让Delphi IDE在源代码中添加正确的单元。在某些情况下,不仅包括错误的单元,而且还包括正确的单元(我试图使用TSelectionEditor后代添加这些单元) 这些组件应该是标准TOpenDialog/TSaveDialog组件的替代品。它们实际上是代理组件,将根据某些全局配置实例化正确的类型(基本对话框或自定义对话框) 我已经编写了几个单元来实现所有必要的类和组件,其中一些应该包含在组件使用的任何地方: git.dialog

我的一个组件出现了一个奇怪的情况:当该组件放在表单上时,我无法让Delphi IDE在源代码中添加正确的单元。在某些情况下,不仅包括错误的单元,而且还包括正确的单元(我试图使用
TSelectionEditor
后代添加这些单元)

这些组件应该是标准TOpenDialog/TSaveDialog组件的替代品。它们实际上是代理组件,将根据某些全局配置实例化正确的类型(基本对话框或自定义对话框)

我已经编写了几个单元来实现所有必要的类和组件,其中一些应该包含在组件使用的任何地方:

  • git.dialogs.pas
    是实现注册的
    t组件
    子体(以及所有实用程序和公共函数及类)的地方
  • git.dialogs.interfaces.pas
    包含用于与组件交互的所有接口,应包括这些接口,以便访问依赖于实现的属性和方法
组件的注册放在一个名为“git.dialogs.registration.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移植的,因此有很多隐含的名称空间,但没有一个是冲突的。谢谢。不幸的是,这只是一个部分答案:它给出了一个提示,说明了可以采取哪些措施来避免我描述的问题之一,但没有真正说明如何解决它,也没有解释为什么会出现问题或为什么包含错误的单元。