![]() |
Ist ein deaktivierter Button nicht wirklich deaktiviert?
Moin, Moin.
Mit einem Button rufe ich eine Methode auf, die Dateien scannt; das kann manchmal 'ne Weile dauern. Deshalb wird der Button im OnClick zunächst deaktiviert, danach die Methode aufgerufen und schließlich der Button wieder aktiviert. Ziel ist, dass mehrfache Klicks nervöser Anwender auf den Button während der Abarbeitung des Scans nicht dazu führen, dass der Scan mehrfach aufgerufen wird. Leider geschieht aber genau dies: Klicke ich 3x während des Scans auf den deaktivierten Button, wird der Scan insgesamt 4x ausgeführt :cry: Seltsam, gibt es da so etwas wie einen "Mausklickpuffer" der automatisch geleert wird, wenn der Button wieder aktiviert wird? Oder welchen Denkfehler mache ich da gerade? |
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
Hilft es, vor dem "Enabled := True" des Buttons ein Application.ProcessMessages einzubauen?
|
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
Evtl. könnte es schon reichen, im Scan ab und zu
-> Application.ProcessMessage; aufzurufen. |
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
man könnte auch den Scan in einen Thread auslagern, dann würde nicht nur die Hauptanwendung nicht einfrieren, sondern man könnte von modernen Mehrkern-CPUs Gebrauch machen :-P
|
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
Das in einen Thread zu packen ist natürlich auch 'ne Idee!
Aber: Gleich der erste Tip hilft bereits! Vor dem enabled:=true ein application.processmessages und es funktioniert wie erwartet! Aber wieso? |
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
Weil die Anwendung dann die Ereignisse aus der Warteschlange abarbeitet (und diese daraus entfernt) und in dem Moment der Schalter ja noch deaktiviert ist.
|
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
Ja, natürlich - es wird quasi der "Mausklickpuffer" geleert.
Vielen Dank für die Antworten :hi: |
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
Andere Möglichkeit: Beim Starten FScanning := True setzen und vorher überprüfen auf
Delphi-Quellcode:
Hat u.a. den Vorteil, dass wenn der Button von einem anderen Programm aus enabled wird, der Scannvorgang nicht mehrfach gestartet wird.
if not FScanning then
|
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
Tja, das hatte ich auch so gedacht und es bereits ausprobiert bevor ich hier die Frage gestellt hatte: Nur, es funktioniert ebenfalls nur, wenn das "ProcessMessages" verwendet wird.
Aber: Danke für die Überlegung! |
Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
Zitat:
Solange der Prozess keine Windows Messages aus der Warteschlange entgegennimmt, bleiben alle Mausklicks und Tasteneingaben gespeichert. Hier zwei Funktionen, um alle Mausklicks und Tasteneingaben zu entfernen:
Delphi-Quellcode:
function ClearKeyboardBuffer:Integer;
var Msg: TMsg; begin Result := 0; while PeekMessage(Msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do Inc(Result); end; function ClearMouseBuffer:Integer; var Msg: TMsg; begin Result := 0; while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) do Inc(Result); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz