Hallo,
in letzter Zeit trifft man vermehrt auf die Frage "Wie kann man einem Button, je nachdem, wie oft er geklickt wurde, unterschiedliche Aktionen zuweisen?". Deshalb habe ich mich der Frage einmal angenommen und diesen kurzen Eintrag in die Library verfasst.
Es gibt eine Menge unterschiedlicher Ansätze zur Lösung dieses Problems. Jeder Programmierer sollte hier den Weg wählen, der ihm am besten Gefällt, ich stelle trotzdem erstmal einige Varianten vor:
Die Tag-Variante
Jede Komponente besitzt eine Eigenschaft
TComponent.Tag vom Ty Integer. Diese Eigenschaft kann man erstklassig dazu nutzen, den "Status" eines Buttons zu speichern.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure Tfrm.BtnClick(Sender: TObject); begin case Btn.Tag of 0: begin doSth; Btn.Tag := Btn.Tag + 1; end; 1: begin doSthElse; Btn.Tag := 0; end; end; end; |
Dies hat den Vorteil, nur wenig Aufwand betreiben zu müssen, ist aber nebenbei sehr unübersichtlich, wenn man längere Funktionen direkt im Event implementieren möchte.
Die "2-Event"-Variante
Nach dem Klicken kann man dem Button ganz einfach ein neues Event für "OnClick" zuweisen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| type TFrm = class(TForm) Btn: TButton; procedure BtnClick(Sender: TObject); private public procedure BtnClick2(Sender: TObject); end;
var Frm: TFrm;
implementation
{$R *.dfm}
procedure TFrm.BtnClick2(Sender: TObject); begin Btn.Caption := 'ClickMe!'; Btn.OnClick := BtnClick; end;
procedure TFrm.BtnClick(Sender: TObject); begin Btn.Caption := 'ClickMe again!'; Btn.OnClick := BtnClick2; end; |
Dies hat den Vorteil, dass die einzelnen Prozeduren sehr übersichtlich sind. Leider Gottes wird die gegenseitige Zuweisung der Events schon bei mehr als zwei Events sehr unübersichtlich.
Ich selbst befürworte eine gesunde Mischung aus diesen Varianten. Jede Funktion, die ein Button haben soll, hat das Recht auf eine eigene Methode. Trotzdem würde ich die Auswahl, welche Methode ausgeführt werden soll in einem Case-Block treffen.
LG FinnO!