tl;博士;
无法阻止添加这些单位,您不应再关心它。
我的组件知道它们需要哪些单元,那么为什么表单的源文件也需要知道名称呢?
你是对的,也是错的。当然,如果代码仅限于创建组件,则只需要声明该组件的单元。运行时和设计时。但是当代码开发时,并且您想要实现需要来自祖先单元的类型的事件处理程序,那么您的代码需要在 uses 子句中使用这些单元。运行时和设计时。
示例:当TDBGrid
从DBGrids
表单的单元中删除 a 时,也会Grids
添加单元,因为除其他外,已发布事件的State
参数类型 ,是在祖先单元中声明的。在设计器中双击该事件会导致添加以下处理程序:TGridDrawState
OnDrawDataCell
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
end;
现在,由于 的存在TGridDrawState
,这个源文件需要知道Grids
单位。
结论:可能有太多的单元用于小开发,但总有足够的单元用于实现所有已发布的事件。
我对它的实际工作原理做了一些研究。我已经赞成Remy 的回答,因为没有它我不会想到这样做,但他实际上并不完全正确。
考虑以下示例单位:
unit AwLabel;
interface
uses
Classes, StdCtrls;
type
TAwLabelStyle = (bsWide, bsTall);
TAwLabel = class(TLabel)
private
FStyle: TAwLabelStyle;
published
property Style: TAwLabelStyle read FStyle write FStyle default bsWide;
end;
implementation
end.
unit AwLabelEx;
interface
uses
Classes, AwLabel;
type
TAwLabelEx = class(TAwLabel);
implementation
end.
unit AwReg;
interface
uses
AwLabel, AwLabelEx;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TAwLabel, TAwLabelEx]);
end;
现在,如果您TAwLabelEx
在表单上放置一个组件,就会添加单元AwLabel
和单元AwLabelEx
,这会自动发生。不需要特别的参与。该类型AwLabel
需要单位TAwLabelStyle
。请注意,在这种情况下,它与事件无关。剩下的唯一论点是该类型用于组件定义的已发布部分。
就像ISelectionEditor.RequiresUnits
雷米所说的那样?
考虑我们搬到TAwLabelStyle
另一个单元:
unit AwTypes;
interface
type
TAwLabelStyle = (bsWide, bsTall);
implementation
end.
当您现在在表单上放置一个TAwLabel
或TAwLabelEx
组件时,不会添加该AwTypes
单元。引用最后一个链接:
注意:一个事件可能会使用一个类型,它的参数之一既不在类单元中,也不在其任何祖先的单元中。在这种情况下,应注册实现 RequiresUnits 的选择编辑器并将其用于声明事件所需类型的每个单元。
所以,让我们注册一个选择编辑器:
unit AwReg;
interface
uses
Classes, AwTypes, AwLabel, AwLabelEx, DesignIntf, DesignEditors;
type
TAwLabelSelectionEditor = class(TSelectionEditor)
public
procedure RequiresUnits(Proc: TGetStrProc); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TAwLabel, TAwLabelEx]);
RegisterSelectionEditor(TAwLabel, TAwLabelSelectionEditor);
end;
{ TAwLabelSelectionEditor }
procedure TAwLabelSelectionEditor.RequiresUnits(Proc: TGetStrProc);
begin
Proc('AwTypes');
end;
end.
现在在表单上删除TAwLabel
orTAwLabelEx
组件确实会导致将AwTypes
单元添加到使用子句中;