実行時にこのサブコンポーネントにアクセスするために、コンポーネントがサブコンポーネント (ポップアップ メニューなど) を作成するためのクラス ヘルパーはほとんどありません。Singleton TDictionary を作成します。
私の質問は、TDictionary からサブコンポーネントを削除するために所有者コンポーネントが破棄されていることをどのように知ることができるかということです。
特殊なコンポーネントの場合はデストラクタに追加しますが、クラス ヘルパーにコンストラクタやデストラクタを追加することはできません。
編集 - 解決策
TObject をパラメーターとして受け入れる基本オブジェクトを作成しました。使用する場合、削除アクションは手動で行う必要があります。
次に、そこから新しいクラスを継承し、TComponent のみを受け入れるようにメソッドをオーバーライドしました。コードの関連部分は次のようになります。
type
TCustomLinkedComponents = class(TCustomLinkedObjects)
strict private
type
TCollector = class(TComponent)
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
end;
strict private
FCollector: TCollector;
[..]
end;
procedure TCustomLinkedComponents.Add(Owner: TComponent; const LinkedName: string; LinkedComponent: TComponent);
begin
inherited Add(Owner, LinkedName, LinkedComponent);
FCollector.FreeNotification(LinkedComponent);
end;
procedure TCustomLinkedComponents.TCollector.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if Operation = opRemove then
LinkedObjects.Remove(TObject(AComponent));
end;
このアプローチを使用して、実際のニーズを解決し、後で簡単に拡張できるようにします。