Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Events für Interfaces ? (https://www.delphipraxis.net/150829-events-fuer-interfaces.html)

himitsu 28. Apr 2010 12:49


Events für Interfaces ?
 
Tachchen,

bei einem Objekt würde ich ein Event ja so Deklarieren
Delphi-Quellcode:
TInsightEvent = Procedure(Const Sender: IInsightItem) of Object;

Property OnInsight: TInsightEvent ...
Aber irgendwie sieht es etwas "unschön" aus, wenn ich jetzt eine Objekt-Methode in ein Interface reinmatsche.
Delphi-Quellcode:
IInsightEvent = Interface
  ['{13378CB0-A03F-4056-853B-5DDF693C36A9}']
  Procedure OnClick(Const Sender: IInsightItem);
End;

Property OnInsight: IInsightEvent ...
Allerdings finde ich dieses Interface-Event dann doch etwas "umständlich".

Hab 4 verschiedene Event-Typen und da ich niemanden Zwingen will, immer alle zu deklarieren, selbst wenn nur Eines verwendet wird, müßte ich ja alle 4 in je ein eigenes Interface verfrachten.

Und zusätzlich würde ich denjenigen Nutzer auch noch zwingen sein Verwaltungsobjekt (oder sonstwas) in ein Interface zu verwandeln. :oops:



Ja, was ist also nun besser/schöner/praktischer/einfacher/...?

Uwe Raabe 28. Apr 2010 13:42

Re: Events für Interfaces ?
 
Zitat:

Zitat von himitsu
bei einem Objekt würde ich ein Event ja so Deklarieren
Delphi-Quellcode:
TInsightEvent = Procedure(Const Sender: IInsightItem) of Object;

Property OnInsight: TInsightEvent ...
Aber irgendwie sieht es etwas "unschön" aus, wenn ich jetzt eine Objekt-Methode in ein Interface reinmatsche.

Ich finde, das ist hier genau der richtige Weg. Das "of object" sagt ja nur etwas darüber aus, wo der Event implementiert wird und das ist letztendlich ja immer eine Klasse. Ob ich da jetzt eine Methode mit passender Signatur aber freiem Namen implementiere und diese dann dem Event zuweise, oder ein Interface implementiere und den Methodennamen mappe ist Geschmackssache. Es spricht nichts gegen den klassischen Event, auch wenn er über ein Interface gesetzt wird.

Es ist auch durchaus zulässig und sinnvoll, etwa solche Deklarationen in eine Interface-Deklaration zu packen:

Delphi-Quellcode:
procedure DoSomethingWith(AObject: TObject);
Solange man sich nicht auf COM-Terrain begibt, besteht kein Hinderungsgrund Interfaces und Objekte zu mischen.

himitsu 28. Apr 2010 15:45

Re: Events für Interfaces ?
 
Nja, die Methoden-Namen kann man in der Objektimplementation ja umleiten und muß sich nicht mit den vorgegebenen Namen abfinden.


Aber OK, dann verwende ich weiterhin die Objekt-Methoden. :-D
(war nur grad durch die OpenToolsAPI etwas in Verleitung geraten)

ele 28. Apr 2010 15:56

Re: Events für Interfaces ?
 
Du kannst ja eine Basisklasse (z.B. abgeleitet von TInterfacedObject) erstellen, welche die Methoden implementiert. Wenn man dann will kann man in einer Ableitung die Methode überschreiben und wenn nicht wird einfach die leere Methode aus der Basisklasse ausgeführt.

Wenn man sein Objekt von einer anderen Basisklasse ableitet muss man sie dann halt trotzdem selber nochmal implementieren...

Aber da muss ich Uwe recht geben: Was spricht dagegen das TInsightEvent als procedure of object zu deklarieren? Das "of object" sagt ja eigentlich nur aus, dass es sich nicht um eine klassische Prozedur handelt, sondern um eine Methode.

sirius 28. Apr 2010 15:59

Re: Events für Interfaces ?
 
Du weist aber, dass man bei COM ein IDispatch-Interface als Event-Empfänger übergibt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz