Einzelnen Beitrag anzeigen

Maliko

Registriert seit: 20. Jun 2019
91 Beiträge
 
Delphi 10.3 Rio
 
#1

Event in Interface vorgeben

  Alt 10. Jan 2022, 12:49
Moin,

ich hab da momentan ein Problem, wo mir Google auch nicht wirklich bei weiter hilft. Und zwar habe ich ein Interface, welches wiederum von mehreren Klassen genutzt wird. Diese Klassen wiederrum werden in einem anderen Teil des Programmes verwendet indem eine Liste mit Objekten von diesem Interface durchlaufen werden und bei jedem Objekt wird eine bestimmte Methode verwendet. Allerdings habe ich jetzt das Problem dass ich auch noch ein Event brauche. Das Event selbst habe ich in der entsprechenden Klasse auch implementiert und das Funktioniert auch wenn ich die Klasse direkt aufrufe. Ich habe nur keine Ahnung wie ich dem Interface sage, dass alle Klassen die es nutzen dieses Event bitte implementieren müssen.

Folgenden Code habe ich:
Delphi-Quellcode:
  TOptionType = (otAuswertungsoptionen, otSonstigeOptionen, otAusgabeoptionen);

  TOnValidationError = procedure(const aErrorText : String) of object;

  IOptionLogic = interface
    ['{3E8091DE-BE13-4C88-9C2B-F0DF96F78AEE}']
    function GetOption : TPanel;
    function GetOptionType : TOptionType;
    function FirmaId : String;
    function UseOnlyOnFirmaId : Boolean;
    procedure ValidateOption;
  end;

  TStatistikAuswertungOption = class(TInterfacedObject, IOptionLogic)
    private
      FOwner : TComponent;
      FPanel : TPanel;
      FCreated : Boolean;
      FValidationErrorEvent : TOnValidationError;
      procedure chkBetraegeClick(Sender: TObject);
      procedure ckhPunktzahlenClick(Sender: TObject);
    protected
      procedure DoOnValidationError(const aErrorText : String);
    public
      property OnValidationError : TOnValidationError read FValidationErrorEvent write FValidationErrorEvent;
      function GetOption : TPanel;
      function GetOptionType : TOptionType;
      function FirmaId : String;
      function UseOnlyOnFirmaId : Boolean;
      procedure ValidateOption;
      constructor Create(aOwner : TComponent); reintroduce;
      destructor Destroy; override;
  end;
Wenn ich das ganze so aufrufe funktioniert es einwandfrei:

Delphi-Quellcode:
mTest := TPflegestatistikAuswertungOption.Create(blubb);
mTest.OnValidationError := onValidateError;
mTest.ValidateOption;
ich würde das ganze aber gerne wie folgt aufrufen
Delphi-Quellcode:
  for i := 0 to FLoadedOptions.Count - 1 do
  begin
    FLoadedOptions[i].OnValidationError := onValidateError;
    FLoadedOptions[i].ValidateOption;
  end;
FLoaded Options ist die Liste in der sich die Objekte befinden. Kann mir vielleicht irgendjemand sagen, wie ich mein Interface modifizieren muss, damit ich das Event auf Interfaceebene registrieren kann, oder falls dass tatsächlich nicht möglich ist eine Ausweichmöglichkeit nennen, in der ich nicht die Klassen hardcoden muss?

Danke euch schon einmal im Voraus.
Maliko
  Mit Zitat antworten Zitat