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 Narses: 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 !
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!