Home » Tipps & Tricks » Object Pascal » Prozeduren/Funktionen » Eigenschaften über Sender Variable erfahren

Eigenschaften über Sender Variable erfahren

Häufig benutzen Events den Parameter Sender, um das Objekt zu identifizieren, welches das Event ausgelöst hat.Weist man mehreren Buttons bspw. ein einziges OnClick-Event zu, kann mit dem Parameter Sender der Button herausgefunden werden, der das OnClick-Event ausgelöst hat.Um zu überprüfen, ob bspw. Button1 das Event ausgelöst hat, kann das Gleichzeichen benutzen werden:

procedure TForm1.ButtonClick(Sender: TObject); 
begin 
  if Sender = Button1 then
  begin
    [...]
  end;
end;

Ebenso ist es möglich je nach Typ des Senders zu verzweigen. Dies geschieht mit dem is-Operator:

procedure TForm1.ButtonClick(Sender: TObject); 
begin 
  if Sender is TButton then
  begin
    [...]
  end
  else if Sender is TListBox then
  begin
    [...]
  end;
end;

Wenn aber im OnClick-Event auf eine Eigenschaft oder Methode des Buttons, der das Event ausgelöst hat, zugegriffen werden soll, muss das Objekt Sender als Button behandelt werden. Dazu benutzt man den as-Operator:

procedure TForm1.ButtonClick(Sender: TObject); 
begin 
  (Sender as TButton).Caption := 'Ich wurde geklickt';
end;

Stammt der Sender nicht von TButton ab, wird eine Exception ausgelöst, was dem Programmierer signalisiert, dass er wohl etwas falsch gemacht hat. Ansonsten wird der Sender als Button behandelt, man sagt, er wird auf TButton gecastet.“As“ ist also ein sicherer Typecast. Daneben gibt es noch einen harten Typecast, der nicht vorher prüft, ob es wirklich ein Button ist. Das ist geringfügig schneller, sollte man aber nur machen, wenn man sich wirklich absolut sicher ist, dass es sich wirklich nur um einen Button handeln kann. Dies ist z.B. der Fall, wenn man es vorher mit dem is-Operator geprüft hat:

procedure TForm1.ButtonClick(Sender: TObject); 
begin 
  if Sender is TButton then
  begin
    TButton(Sender).Caption := 'Ich wurde geklickt';
  end
  else if Sender is TListBox then
  begin
    TListBox(Sender).Items.Add('Ich wurde geklickt');
  end;
end;

Solche Events können auch direkt im Code aufgerufen werden. Dabei muss dann natürlich der Sender übergeben werden.

begin 
  ButtonClick(Button1); //ein konkreter Button als Sender
  ButtonClick(Self); //Self (also das aktuelle Objekt; meist das Formular) als Sender
  ButtonClick(nil); // nil als Sender, d.h. kein Sender angegeben. Das kann man tun, wenn der Sender *nicht* 
ausgewertet wird.
end;