![]() |
Ignore mouseclicks during a task is running
Liste der Anhänge anzeigen (Anzahl: 2)
Frage:
Ich habe ein Sache am Herzen, die mich schon einige Zeit beschaeftigt. Waehrend mein Program nach dem Click auf einen Button etwas ausfuehrt, moechte ich andere Mouseclicks im Programfenster abfangen. Dazu ein kleines Beispielprogram und ein Screenshot vom Program. Viele Gruesse, Terence. |
AW: Ignore mouseclicks during a task is running
Füge einfach nach dem Sleep noch ein Application.ProcessMessages; hinzu. Dadurch kann die Klicknachricht abgearbeitet werden während der Button noch deaktiviert ist und wird somit ignoriert. Ansonsten kommt diese erst an, wenn der Button schon wieder aktiv ist und wird somit auch als gültiger Klick gewertet.
Viel sinnvoller ist aber ohnehin das ganze in einem Thread durchzuführen. Dann blockierst du auch nicht die Oberfläche (mit Folgen wie diesen), so dass Windows auch nicht nach einer gewissen Zeit anzeigt, dass deine Anwendung nicht mehr reagiert. |
AW: Ignore mouseclicks during a task is running
Zitat:
Gruss Terence |
AW: Ignore mouseclicks during a task is running
Liste der Anhänge anzeigen (Anzahl: 2)
Hier nun das funktionierende Program.
Damit es jeder selbst ausprobieren kann. Gruss Terence |
AW: Ignore mouseclicks during a task is running
So würde es mit einem Task funktionieren
Delphi-Quellcode:
unit IgnoreMouseClicks.Forms.MainForm;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, System.Actions, System.Threading, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ActnList, Vcl.StdActns; type TForm1 = class(TForm) ActionList1: TActionList; FileExitAction: TFileExit; WorkAction: TAction; IgnoreAction: TAction; Button1: TButton; Button2: TButton; Button3: TButton; Panel1: TPanel; procedure FileExitActionUpdate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure IgnoreActionExecute(Sender: TObject); procedure IgnoreActionUpdate(Sender: TObject); procedure WorkActionExecute(Sender: TObject); procedure WorkActionUpdate(Sender: TObject); private FIsWorking: Boolean; public property IsWorking: Boolean read FIsWorking; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FileExitActionUpdate(Sender: TObject); begin TAction(Sender).Enabled := not IsWorking; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := not IsWorking; end; procedure TForm1.IgnoreActionExecute(Sender: TObject); begin ShowMessage('Ignore was pressed'); end; procedure TForm1.IgnoreActionUpdate(Sender: TObject); begin TAction(Sender).Enabled := not IsWorking; end; procedure TForm1.WorkActionExecute(Sender: TObject); begin FIsWorking := True; TTask.Run( procedure begin try // Do some work TThread.Sleep(5000); finally // final handler synchronized TThread.Synchronize(nil, procedure begin FIsWorking := False; end); end; end); end; procedure TForm1.WorkActionUpdate(Sender: TObject); begin TAction(Sender).Enabled := not IsWorking; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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