Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Button nach einmaligem Klicken zuverlässig sperren


user32 - Di 12.12.17 16:34
Titel: Button nach einmaligem Klicken zuverlässig sperren
Ich führe eine lange Berechnung durch, und will verhindern, dass man versehentlich zwei- oder mehrmals auf den Button klickt.

Selbst mit diesem Code klappt es erstaunlicherweise NICHT:


Bei Button Onclick am Anfang der Berechnung:


Delphi-Quelltext
1:
2:
3:
  button1.Enabled := false;
 if inprogress then exit;
  inprogress := true;

Am Ende:

Delphi-Quelltext
1:
2:
  inprogress := false;
  button1.Enabled := true;


Wenn ich ganz schnell doppel-klicke, wird die Prozedur mehrmals hintereinander ausgeführt.
Ich vermute es liegt an den Windows Messages, muss ich da eingreifen?


Moderiert von user profile iconNarses: Topic aus Windows API verschoben am Di 12.12.2017 um 19:50


Symbroson - Di 12.12.17 16:38

versuchs mal mit application.processmessages nach dem enabled := false


user32 - Di 12.12.17 18:17

Damit ist es wohl etwas besser, aber oft läuft es immer noch 2x.


Symbroson - Di 12.12.17 18:25

ich verstehe was du meinst - ich probier mal bissl rum ^^


Symbroson - Di 12.12.17 18:33

es funktioniert, wenn du Application.ProcessMessages; aufrufst bevor du den Button wieder aktivierst.
Sonst werden die User-Inputs erst wieder abgefragt, nachdem die Prozedur / Funktion verlassen wird, weil der Main-Thread während der Ausführung einer Prozedur diesen blockiert.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  if not inprogress then begin
    Button1.Enabled := false;
    inprogress := true;

    Memo1.Lines.Add('hello');
    sleep(1000);

    inprogress := false;
    Application.ProcessMessages;
    button1.Enabled := true;
  end;


user32 - Mi 13.12.17 08:08

So geht es. Stimmt, danke !