5

実行時にこのサブコンポーネントにアクセスするために、コンポーネントがサブコンポーネント (ポップアップ メニューなど) を作成するためのクラス ヘルパーはほとんどありません。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;

このアプローチを使用して、実際のニーズを解決し、後で簡単に拡張できるようにします。

4

3 に答える 3

5

の代わりに、を含むTDictionaryカスタムTComponent子孫を作成しますTDictionary。次に、どのようにTComponent.FreeNotification機能するかを調べると、解決策が明らかになるはずです。:)

于 2012-08-01T18:53:58.193 に答える
2

コンポーネントが破棄されているかどうかを知りたい場合は、使用する必要があります

function IsBeingDestroyed(AComponent : TComponent) : Boolean;
begin
  Result := csDetroying in AComponent.ComponentState;
end;

破棄されたときに通知を受け取りたい場合は、FreeNotification を使用するのが最適です。

FreeNotification の詳細については、この投稿を確認してください。

于 2012-08-01T19:06:00.557 に答える
2

いいえ、できません。Delphi は、何かがクラス ヘルパーによって作成/破棄されたかどうかを特別に追跡しません。

于 2012-08-01T19:54:05.790 に答える