Komponenten entwicklen
Ereignisse (Events)
In diesem Kapitel behandle ich das Erstellen von eigenen Ereignissen.
Ereignisse zu programmieren ist nicht ganz so einfach wie das Programmieren von Methoden. Events stellen einen Mechanismus dar, der ein externes Ereignis mit einer Delphi-Routine verbindet.
Ereignisse werden wie Eigenschaften deklariert, mit dem Unterschied, dass Sie mit „read“ und „write“ jeweils direkt auf die private-Variable zugreifen. Diese Variable ist normalerweise vom Typ TNotifyEvent.
Standardereignisse
Alle Komponenten, die vom Typ TControl abgeleitet sind, erben folgende Ereignisse:
- OnClick
- OnDblClick
- OnDragDrop
- OnDragOver
- OnEndDrag
- OnMouseDown
- OnMouseMove
- OnMouseUp
Komponenten, die vom Typ TWinControl abgeleitet sind, erben zusätzlich noch diese Ereignisse:
- OnEnter
- OnExit
- OnKeyUp
- OnKeyDown
- OnKeyPressed
Um die Ereignisse auch zur Verfügung zu stellen, muss man die Deklaration in public, bzw. published ändern:
TTest = class(TWinControl) published property OnClick; end;
Jetzt steht dem Anwender auch das Ereignis „OnClick“ zur Verfügung. Parameter und Implementierung muss nicht extra eingefügt werden.
Überschreiben der Standardereignisse
Es ist auch möglich das Verhalten der Ereignisse zu verändern. Dazu muss man die Standardereignisse überschreiben. In diesem Beispiel soll ein Edit-Feld nur numerische Angaben akzeptieren:
TNumEdit = class(TEdit) protected procedure KeyPress(var Key: Char); override; end;
Jetzt haben wir die entsprechende Procedure deklariert. Jetzt muss die eigentliche Procedure noch implementiert werden:
procedure TNumEdit.KeyPress(var Key: Char); begin if not Key in ['0'..'9'] then key:=#0; inherited KeyPress(Key); end;
Zuerst wurde die eigene Routine (If-Statements) ausgeführt, dann die Standard-Procedure.
Eigene Ereignisse
Wir haben bisher nur „vordefinierte“ Ereignisse benutzt. Jetzt lernst du auch, wie man komplett eigene Ereignisse in die Komponente einbindet.
Zuerst brauchen wir einen eigenen Typ für das Ereignis:
TFehlerEvent = procedure(Param1: String) of object;
Dies ist der Procedure-Kopf, den Delphi automatisch erzeugt, wenn man das Ereignis in seiner eigenen Anwendung implementieren will. Man kann auch Werte aus der Routine zurückgeben. Dazu muss der Übergabewert als var-Parameter deklariert werden.
Jetzt müssen wir uns noch um die Variable für das Ereignis kümmern, diese deklarieren wir im Private-Abschnitt:
TFehler = class(TComponent) private FOnFehler: TFehlerEvent; published property OnFehler: TFehlerEvent read FOnFehler write FOnFehler; end;
Das Ereignis muss im Published-Abschnitt stehen, weil es sonst im Objektinspektor nicht angezeigt werden würde.
Was jetzt noch fehlt ist der Auslöser für das Ereignis. Dazu schreibt man in unserem Fall einfach dieses If-Statement in die entsprechende Procedure:
;if Assigned(OnFehler) then OnFehler(Self);
Dazu ein kleines Beispiel. Das Ereignis OnFehler soll ausgelöst werden, wenn im obigen Beispiel keine Zahl eingegeben wurde. Dazu modifizieren wir das obige KeyPress-Ereignis folgendermaßen:
procedure TNumEdit.KeyPress(var Key: Char); begin if not Key in ['0'..'9'] then begin if Assigned(OnFehler) then OnFehler(Self); key:=#0; end; inherited KeyPress(Key); end;
Jetzt wird das Ereignis „Fehler“ immer ausgeführt, wenn keine Zahl eingegeben wurde.