2016-11-30 38 views
2

我有一个奇怪的情况与我的一个组件:我不能让Delphi IDE在源代码中添加正确的单元时该组件被放置在表格上。不仅包括错误的单位,而且正确的单位(我试图用TSelectionEditor后代添加)不包括在某些情况下。德尔福:错误的单元添加单元使用从源文件的子句当组件被放置在一个窗体上

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

我已经写了几个单位在落实所有必要的类和组件,其中一些应该包括无处不在的组件用于:

  • git.dialogs.pas是在TComponent后裔注册实施(以及所有公用事业和公共函数和类)
  • git.dialogs.interfaces.pas包含用于与该组件进行交互和所有接口应包括为了访问实现相关的属性和方法

组件的注册被放置在一个名为'git.dialogs.registration.pas'的单元中。它包含一个TSelectionEditor后裔,它覆盖RequiresUnits方法如下:

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单元添加到源文件的interface uses子句中。但它并不是:

  • 它正确添加了GIT.Dialogs.Interfaces
  • 它增加了一个未列出的单位GIT.Dialogs.FileDialog.Base其中包含一些其他TComponent后代在内部使用但未在任何地方注册。
  • 如果源文件已包含Dialogs单元(来自VCL),则不会添加GIT.Dialogs单元。

我该如何解决这种情况?添加GIT.Dialogs.FileDialog.Base单元不是什么大问题,因为无论何时使用该组件都会被链接,但不添加GIT.Dialogs文件需要手动修复该组件被放置的每个表单或用过的。

+0

您是否试图将'Dialogs'单位指定为'Vcl.Dialogs'? – NGLN

+0

它确实会解决问题,但我仍然需要手动调整所有现有表单。 – Stephane

+0

您是否在项目中使用了与所需单位冲突的单位范围名称? –

回答

1

指定完整的默认VCL单位,即Dialogs应指定为Vcl.Dialogs。当在表单上放置这样一个组件时,这不仅解决了这个特定的问题,而且也有助于消除other problems。习惯于使用完全合格的单位名称。

对于现有的表单,没有其他方法可以重写它们的单元子句。多文档搜索和替换工具可能非常方便。

+0

谢谢。不幸的是,这只是一个部分答案:它提供了一个暗示,说明可以采取什么措施来避免我描述的问题之一,但不是真正如何解决这个问题,也不能解释问题发生的原因或为什么包含错误的单元。 – Stephane