当向表单添加组件时,Delphi单元是如何自动添加的?

9
如果我从IDE向表单中添加一个TXMLDocument,则自动添加单位Xml.XMLDoc、Xml.xmldom、Xml.XMLIntf、Xml.Win.msxmldom(在保存/编译时),那么IDE如何知道要添加这些单位。我理解为什么/如何添加了XMLDoc(它包含TXMLDocument),但其他的呢。
此外,如果我将DOMVendor从MSXML更改为ADOM XML v4,则Xml.adomxmldom会自动添加(在下一次编译时)。此时,我可以删除Xml.Win.msxmldom,而不会被自动重新添加。基于组件属性,IDE如何知道这一点呢?
我提出这个问题有两个原因,首先是好奇心,其次是我正在清理大量单位(数百个)的使用部分。该项目使用DevExpress,并且它会向使用部分添加大量其他文件-例如添加TcxSpinEdit,然后添加cxSpinEdit、cxGraphics、cxControls、cxLookAndFeels、cxLookAndFeelPainters、cxContainer、cxEdit、cxTextEdit、cxMaskEdit。我希望最小化使用子句,在从表单中删除控件(但其单位仍留在使用中)的情况下,因此需要更好地了解它们添加的过程。

IDE 保存模块之前,还会自动填充 uses 子句。 - Free Consulting
1
这有点离题,但 CNPack 提供了一个很好的 Uses 子句清理工具... - Hugh Jones
@HughJones 是的,这就是我正在使用的,尽管它无法正确清除我的许多单元中的用途(删除/保留额外字符),但在检测方面效果很好。此外,Icarus还可以指示何时可以将单元从接口移动到实现中,等等。 - Alister
1
请注意你添加到问题中的标签。"units-of-measurement"与Delphi的"unit"毫不相干。 - Ken White
@Alister - 你用的是哪个版本的Delphi?我问这个是因为我一直在Delphi 5项目中使用它。我认为这就是为什么CNPack出现了奇怪错误的原因。 - Hugh Jones
1个回答

14

组件可以安排它们在设计器中的存在强制特定单元添加到单元使用子句中。它们通过调用RegisterSelectionEditor来注册其TSelectionEditor子类来实现此目的。这些子类覆盖TSelectionEditor.RequiresUnits并在那里指定必须添加的单位。

例如:

uses
  DesignEditors;
....
type
  TMySelectionEditor = class(TSelectionEditor)
  public
    procedure RequiresUnits(Proc: TGetStrProc); override;
  end;

procedure TMySelectionEditor.RequiresUnits(Proc: TGetStrProc);
begin
  Proc('MyUnit');
end;

procedure Register;
begin
  RegisterSelectionEditor(TMyComponent, TMySelectionEditor);
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接