Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ist ein deaktivierter Button nicht wirklich deaktiviert? (https://www.delphipraxis.net/118656-ist-ein-deaktivierter-button-nicht-wirklich-deaktiviert.html)

taaktaak 12. Aug 2008 11:01


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?

Gausi 12. Aug 2008 11:10

Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
 
Hilft es, vor dem "Enabled := True" des Buttons ein Application.ProcessMessages einzubauen?

stahli 12. Aug 2008 11:13

Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
 
Evtl. könnte es schon reichen, im Scan ab und zu
-> Application.ProcessMessage;
aufzurufen.

jfheins 12. Aug 2008 11:16

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

taaktaak 12. Aug 2008 11:23

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?

stahli 12. Aug 2008 11:27

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.

taaktaak 12. Aug 2008 11:29

Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
 
Ja, natürlich - es wird quasi der "Mausklickpuffer" geleert.
Vielen Dank für die Antworten :hi:

toms 12. Aug 2008 13:06

Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
 
Andere Möglichkeit: Beim Starten FScanning := True setzen und vorher überprüfen auf

Delphi-Quellcode:
if not FScanning then
Hat u.a. den Vorteil, dass wenn der Button von einem anderen Programm aus enabled wird, der Scannvorgang nicht mehrfach gestartet wird.

taaktaak 12. Aug 2008 13:34

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!

shmia 12. Aug 2008 13:49

Re: Ist ein deaktivierter Button nicht wirklich deaktiviert?
 
Zitat:

Zitat von taaktaak
Seltsam, gibt es da so etwas wie einen "Mausklickpuffer" der automatisch geleert wird, wenn der Button wieder aktiviert wird?

Jeder Prozess hat seine eigene Message Warteschlange.
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 10:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz