Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Ignore mouseclicks during a task is running (https://www.delphipraxis.net/201336-ignore-mouseclicks-during-task-running.html)

ter 13. Jul 2019 07:32

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.

jaenicke 13. Jul 2019 08:09

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.

ter 13. Jul 2019 09:22

AW: Ignore mouseclicks during a task is running
 
Zitat:

Zitat von jaenicke (Beitrag 1436653)
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....

Wow! Danke Jaenicke, Du hast recht und es funktioniert jetzt.

Gruss
Terence

ter 14. Jul 2019 11:42

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

Schokohase 14. Jul 2019 12:29

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 15:02 Uhr.

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