[gelöst]Gleiche Eventmethode für mehrere Komponenten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

[gelöst]Gleiche Eventmethode für mehrere Komponenten

Beitrag von Marsmännchen »

Hi,

um mich in Lazarus / FP einzufummeln, stricke ich mir gerade einen ... Taschenrechner (ja, ich weiß, sehr kreativ 8) ). Nun hat man in so einem Rechner einen Haufen Buttons, die geklickt werden können (0..9, +, - usw.). Deren Klickereignis biege ich auf eine Prozedur um, die dann die Weiterverarbeitung übernimmt. Das sieht in etwa so aus:

Code: Alles auswählen

 
unit Rechnerformular;
 
interface
 
type
   TForm1 = class(TForm)
   ...
    Button0: TButton;
   ...
    Button9: TButton;
    procedure Button0Click(Sender: TObject);
   ...
    procedure Button9Click(Sender: TObject);
    ...
  private
    { private declarations }
    Rechner : TRechner;     // Separate Klasse, die die Funktionalität kapselt
    Procedure eingabeErfolgt(Sender:TObject); // Regelt das Zusammenspiel mit 'Rechner'
 ...
  end;
 ...
{Der folgende Code stört mich, weil jede Procedure nur dasselbe leistet. Er ist einfach nur redundant}
procedure TForm1.Button0Click(Sender: TObject);
begin
  eingabeErfolgt(Sender);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  eingabeErfolgt(Sender);
end;
 
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  eingabeErfolgt(Sender);
end;
 
...
 
procedure TForm1.eingabeErfolgt(Sender:TObject);
var
  zeichen:char;
begin
  if Sender is TButton then
    zeichen := (Sender as TButton).Caption[1];
 
 
  Rechner.anfuegen(zeichen); //Übergibt das Zeichen, 
                                             //welches auf dem Button ist an Rechnerobjekt
end;
end.
 
 
Was mich stört sind diese ButtonXClick-Routinen, in denen eh immer nur das Gleiche steht. In .Net hatte ich mittels Delegate-Zirkus und Handler-Dompteur die Möglichkeit sowas zusammen zu fassen, im Sinne von: 'MeineBehandlungsroutine handles Button1_Click, Button2_Click... ButtonGanzVielSpäter_Click'. Also eine Ereignisbehandlungsroutine konnte sich an beliebig viele Events verschiedener Komponenten ranhängen.

Gibt es in Lazarus einen ähnlichen Trick?
Zuletzt geändert von Marsmännchen am Sa 20. Feb 2016, 17:04, insgesamt 1-mal geändert.
Ich mag Pascal...

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Gleiche Eventmethode für mehrere Komponenten

Beitrag von Michl »

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Gleiche Eventmethode für mehrere Komponenten

Beitrag von theo »

Marsmännchen hat geschrieben: Gibt es in Lazarus einen ähnlichen Trick?
Du kannst schlicht im Objektinspektor für OnClick immer die gleiche Ereignisbehandlungsmethode einhängen.
Durch den Parameter "Sender" in dieser Methode kannst du unterscheiden woher der Click kam.
Normalerweise gibt man dem Objekt im Property "Tag" eine Nummer mit, anhand derer man unterschieden kann.
Dateianhänge
lazonclick.png

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Gleiche Eventmethode für mehrere Komponenten

Beitrag von Marsmännchen »

Hi,
Ach funktioniert das schön. Ich konnte jetzt meine Sammelroutine direkt an die Click-Ereignisse kleben:

Code: Alles auswählen

Button0.OnClick:=@eingabeErfolgt;

Auch der Hinweis auf den Objekt-Inspektor ist gut. Im Nachhinein betrachtet ist das auch einfach nur logisch. Ich kann ja einstellen, welche Methode das Ereignis bekommt und muss nur darauf achten, dass sie die passende Signatur hat.

Ich hatte schon zuerst auch selbst eine Weile nach einer Lösung gesucht, aber darauf bin ich nicht gekommen!

Danke!
Ich mag Pascal...

Antworten