Autor Beitrag
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Fr 05.02.10 16:41 
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.

ausblenden 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; //Aktion ausführen
      Btn.Tag := Btn.Tag + 1//Tag-Eigenschaft inkrementieren.  
    end;
    1:
    begin
      doSthElse;
      Btn.Tag := 0//Tag-Eigenschaft zurücksetzen.
    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.

ausblenden 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) //hier in der Klassendeklaration unseres Formulars...
    Btn: TButton;
    procedure BtnClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    procedure BtnClick2(Sender: TObject);  //...deklarieren wir eine Prozedur mit dem Parameter "Sender" vom Typ "TObject". 
  end;

var
  Frm: TFrm;

implementation

{$R *.dfm}

procedure TFrm.BtnClick2(Sender: TObject);
begin
  Btn.Caption := 'ClickMe!';
  Btn.OnClick := BtnClick;  // nach Beendigung weisen wir (wenn gewünscht) die alte Prozedur wieder zu. 
end;

procedure TFrm.BtnClick(Sender: TObject);
begin
  Btn.Caption := 'ClickMe again!';
  Btn.OnClick := BtnClick2; // und weisen diese dann dem Button zu. 
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!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 06.02.10 01:37 
Moin!

Schau mal hier, insbesondere Teil B. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.