Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Mousemove schlägt bei Opendialog durch (https://www.delphipraxis.net/201142-mousemove-schlaegt-bei-opendialog-durch.html)

skoschke 26. Jun 2019 13:06

Mousemove schlägt bei Opendialog durch
 
Hallo,

der Betreff ist Sch... aber wie soll ich das kurz beschreiben:

Auf einem Formular liegt ein TImage welches per Mousemove Zeichenoperationen ausführt.
Es gibt ein Mainmenu welches einen Opendialog öffnet um Dateien zu laden.

Nun ist es mir mehrfach vorgekommen, dass beim Öffnen einer Datei bereits etwas gezeichnet wird, und zwar wenn man den Opendialog nicht mit OK benutzt sondern auf die gewünschte Datei doppelklickt.

Nun habe ich als erstes das Image disabled, während das Laden erfolgt, ohne Erfolg, der Mousemove-Event wird abgebrochen wenn Image disabled, ohne Erfolg.

Als letztes die Openroutine erweitert:

Delphi-Quellcode:
Image.enabled := false;
if opendialog.execute then
....
end;
//damit Mausevents verarbeitet werden
Application.processmassages;
Image.enabled := true;
und
Delphi-Quellcode:
procedure TFormMain.ImageMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if not TImage(Sender).Enabled then
    exit;
...
Kein Erfolg, die Mopusemove's kommen weiter an und zeichnen

Wie komme ich weiter?

Ciao
Stefan

Frickler 26. Jun 2019 14:15

AW: Mousemove schlägt bei Opendialog durch
 
Vor "OpenDialog":
OnMouseMove := nil;

Nach "OpenDialog":
OnMouseMove := FormMouseMove;

peterbelow 26. Jun 2019 14:32

AW: Mousemove schlägt bei Opendialog durch
 
Zitat:

Zitat von skoschke (Beitrag 1435396)

Delphi-Quellcode:
{!
<summary>
 Remove all mouse messages from the calling thread's message queue.</summary>
}
procedure EmptyMouseQueue;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
    PM_REMOVE or PM_NOYIELD) do
    ;
end;

skoschke 27. Jun 2019 06:14

AW: Mousemove schlägt bei Opendialog durch
 
Zitat:

Vor "OpenDialog":
OnMouseMove := nil;

Nach "OpenDialog":
OnMouseMove := FormMouseMove;
wirkt leider genau so wenig wie mein enabled...

Ciao
Stefan

skoschke 27. Jun 2019 06:16

AW: Mousemove schlägt bei Opendialog durch
 
Zitat:

Zitat von peterbelow (Beitrag 1435408)
Zitat:

Zitat von skoschke (Beitrag 1435396)

Delphi-Quellcode:
{!
<summary>
 Remove all mouse messages from the calling thread's message queue.</summary>
}
procedure EmptyMouseQueue;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
    PM_REMOVE or PM_NOYIELD) do
    ;
end;

Wann soll das aufgerufen werden?
Nach dem Opendialog.execute bringt es keinen Effekt!

Ciao
Stefan

newIndy 27. Jun 2019 06:33

AW: Mousemove schlägt bei Opendialog durch
 
'...Auf einem Formular liegt ein TImage welches per Mousemove Zeichenoperationen ausführt...'

Wie sieht deine Methode zum Zeichnen aus?

peterbelow 27. Jun 2019 10:27

AW: Mousemove schlägt bei Opendialog durch
 
Zitat:

Zitat von skoschke (Beitrag 1435439)
Zitat:

Zitat von peterbelow (Beitrag 1435408)
Zitat:

Zitat von skoschke (Beitrag 1435396)

Delphi-Quellcode:
{!
<summary>
 Remove all mouse messages from the calling thread's message queue.</summary>
}
procedure EmptyMouseQueue;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
    PM_REMOVE or PM_NOYIELD) do
    ;
end;

Wann soll das aufgerufen werden?
Nach dem Opendialog.execute bringt es keinen Effekt!

Dann ist deine Diagnose nicht korrekt, oder deine Zeichenroutine prüft nicht, ob der Mausknopf eigentlich gedrückt ist oder nicht und zeichnet daher auch, wenn das nicht der Fall ist. Wenn Du EmptyMouseQueue aufgerufen hast kann das Problem nur von mouse messages stammen, die danach erzeugt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 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