Wieso sind deine Eventhandler eigentlich alle unterschiedlich deklariert? Reicht nicht ein Typ?, z.B.
TAttributEvent = Procedure (Sender : TObject; Attribut : TAttributsClass) of Object;
Na ja, wie Du meinst. Wenn das so wäre, dann reicht folgender Code.
Delphi-Quellcode:
Function TMyForm.CreateEvent(Attribut : TAttributsClass) : TAttributEvent;
begin
if Attribut=FCommentAttri
then result := FCSSCommentEvent
else if Attribut=FPropertyAttri
then Result := FCSSPropertyEvent
else if ...
...
else Raise Exception.Create('
Unknown Attribut: '+Attribut.
Name);
end;
Procedure TMyForm.FireEvent(Attribut : TAttributsClass);
Var
Event : TAttributEvent;
begin
Event := CreateEvent(Attribut);
CallEventHandler(Event, Attribut);
end;
Procedure TMyForm.CallEventHandler (Event : TAttributEvent; Attribut : TAttributsClass);
Begin
if Assigned (Event)
Then
Event(Self, Attribut);
end;
Ja, das ist eine ziemlich lange if-else-Folge. Sieht blöd aus, ist aber normal. Da Deine Eventhandler alle individuell deklariert sind, kannst Du das nette 'CallEventHandler' nicht verwenden, sondern musst die 'If Assigned(Event)' Abfrage für jeden Event neu implementieren.
Noch einfacher geht es übrigens mit einem einfachen
TNotifyEvent
, denn wenn das 'CommentEvent' gefeuert wird, ist ja klar, das mit den CommitAttributen etwas los ist, ergo muss man das Attribut nicht übergeben.
Delphi-Quellcode:
Function TMyForm.CreateEvent(Attribut : TAttributsClass) : TNotifyEvent;
begin
if Attribut=FCommentAttri
then result := FCSSCommentEvent
else if Attribut=FPropertyAttri
then Result := FCSSPropertyEvent
else if ...
...
else Raise Exception.Create('
Unknown Attribut: '+Attribut.
Name);
end;
Procedure TMyForm.FireEvent(Attribut : TAttributsClass);
Var
Event : TNotifyEvent;
begin
Event := CreateEvent(Attribut);
CallEventHandler(Event);
end;
Procedure TMyForm.CallEventHandler (Event : TNotifyEvent);
Begin
if Assigned (Event)
Then
Event(Self);
end;