tl; dr;
これらのユニットの追加を防ぐことはできません。もう気にする必要はありません。
私のコンポーネントは必要なユニットを知っているのに、フォームのソースファイルが名前も知っている必要があるのはなぜですか?
あなたは正しいことも間違っていることもあります。もちろん、コードがコンポーネントの作成のみに制限されている場合は、そのコンポーネントが宣言されているユニットのみが必要になります。ランタイムとデザインタイムのいずれか。ただし、コードが開発され、祖先ユニットの型を必要とするイベントハンドラーを実装する場合は、コードでuses句にそれらのユニットが必要です。ランタイムとデザインタイムのいずれか。
例:TDBGrid
ユニットからDBGrids
フォームにaをドロップすると、ユニットもGrids
追加されます。これは、特に、公開されたイベントのState
パラメーターのタイプが祖先ユニットで宣言されているためです。デザイナでそのイベントをダブルクリックすると、次のハンドラが追加されます。TGridDrawState
OnDrawDataCell
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
end;
ここで、が存在するためTGridDrawState
、このソースファイルはユニットを認識する必要がありますGrids
。
結論:マイナーな開発に使用されるユニットが多すぎる可能性がありますが、公開されているすべてのイベントの実装に使用されるユニットは常に十分です。
これが実際にどのように機能するかについて少し調べました。私はすでにレミーの答えに賛成しました。それがなければ私はそうすることを考えていなかったでしょうが、彼は実際には完全に正しくありません。
次のユニット例を考えてみましょう。
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
ユニットは追加されません。最後のリンクから引用するには:
注:イベントが、クラス単位にもその祖先の単位にも含まれていないパラメーターの1つを持つ型を使用する可能性があります。この場合、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
フォームにまたはTAwLabelEx
コンポーネントをドロップするAwTypes
と、uses句にユニットが追加されるようになりました。