Home » Tutorials » VCL » Komponenten entwicklen

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.