0

技術サポート情報を提供するために使用される ISupport というインターフェイスがあります。

ISupport = Interface(IInterface)
  procedure AddReport(const Report: TStrings);
End;

サポートに関連する情報を持つ各クラスは、このインターフェイスを実装し、コンストラクターで以下を呼び出します。

procedure TySupport.RegisterSupport(Support: ISupport);
begin
  if FInterfaceList.IndexOf(Support) = -1 then
    FInterfaceList.Add(Support);
end;

使用例(一部):

TyConfig = class(TInterfacedObject, ISupport)
private
  procedure   AddReport(const Report: TStrings);

public
  constructor Create;
end;

constructor TyConfig.Create;
begin
  if Assigned(ySupport) then
    ySupport.RegisterSupport(Self);
end;

コードの後半で、リストを調べて AddReport を呼び出すことができます。

私の問題は、この TyConfig という 1 つのクラスが何度もインスタンス化され、レポートされる情報がまったく同じであることです。FInterfaceList.IndexOf は、まったく同じインターフェイスが追加されるのを避けるだけです。

TyConfig からの ISupport が複数回登録されるのを避けたいと思います。

4

1 に答える 1

2

Delphi 2010 以降では、インターフェイスからオブジェクトにキャストできます。

var
  obj: TObject;
  intf: IInterface;
....
obj := intf as IInterface;

その機能があれば、オブジェクトが特定のクラスから派生したものであることを確認するのは簡単な手順です。

if obj is TyConfig then
  ....

これらのピースがあれば、問題を解決できるはずです。

于 2013-08-30T18:45:21.783 に答える