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/)
-   -   Delphi Curosr-Änderung sofort wirksam (https://www.delphipraxis.net/170282-curosr-aenderung-sofort-wirksam.html)

e-gon 9. Sep 2012 12:12

Curosr-Änderung sofort wirksam
 
Hallo!

Wie kann ich eine Cursor-Änderung durch
Delphi-Quellcode:
Image1.Cursor:= crCross;
sofort wirksam werden lassen? Bisher wird der Cursor erst geändert, wenn sich der Mouse-Zeiger bewegt.

Hintergund: Auf meiner Form befindet sich unter anderem ein Image. Auf diesem Image soll gezeichnet werden können, wenn der Bentzer die Strg-Taste gedrückt hält und die Mouse-Taste drückt. Um anzuzeigen, dass das Image durch die Strg-Taste bereit ist bemahlt zu werden, soll sich der Cursor ändern. Dazu verwende ich folgenden Code:
Delphi-Quellcode:
...
Form1.KeyPreview:= True;
...

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Shift=[ssCtrl] then
  begin
    Image1.Cursor:= crCross;
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Image1.Cursor=crCross then
  begin
    Image1.Cursor:= crDefault;
  end;
end;
Prinzipiell funktioniert das ganze auch, allerdings erst wenn man die Mouse bewegt. Wie kann ich den Cursor zwingen sich sofort upzudaten? Über
Delphi-Quellcode:
Image1.Update;
oder auch eine simulierte Mousebewegung durch Aufruf von
Delphi-Quellcode:
Image1MouseMove
geht das leider nicht.

Gruß
e-g-o-n

Uwe Raabe 9. Sep 2012 12:18

AW: Curosr-Änderung sofort wirksam
 
Versuch mal:

Delphi-Quellcode:
ShowCursor(false);
ShowCursor(true);

e-gon 9. Sep 2012 12:34

AW: Curosr-Änderung sofort wirksam
 
Danke Uwe Raabe für die schnelle Antwort!

Funktioniert aber leider auch nicht... :(

DeddyH 9. Sep 2012 12:39

AW: Curosr-Änderung sofort wirksam
 
Sonst ermittle doch mit GetCursorPos die Mausposition, verschieb den Cursor mit SetCursorPos um 1 Pixel und wieder zurück. Das ist zwar nicht elegant, sollte aber funktionieren.

blauweiss 9. Sep 2012 12:42

AW: Curosr-Änderung sofort wirksam
 
Hallo e-gon,

mit SetCursorPos sollte es funktionieren (evtl. zusätzlich mit dem Trick, erst die Maus um 1 Pixel zu versetzen, dann wieder zurück).

Per Image1MouseMove positionierst Du übrigens nicht die Maus, sondern es wird hier nur die zugeordnete Eventmethode aufgerufen wie bei einer echten Mausbewegung.

Gruß
blauweiss


Edit: DeddyH, wir sollten heiraten :-)

DeddyH 9. Sep 2012 12:45

AW: Curosr-Änderung sofort wirksam
 
Zitat:

Zitat von blauweiss (Beitrag 1182184)
Edit: DeddyH, wir sollten heiraten :-)

Ich werde das mal mit meiner Frau bereden :lol:

e-gon 9. Sep 2012 13:05

AW: Curosr-Änderung sofort wirksam
 
Hallo Leute!

Bevor ich jetzt hier eine Heiratsvermittlung eröffne erstmal vielen Dank! Es funktioniert! :thumb:
Und man muss dazu nicht mal die Mouse verschieben! Ein einfacher
Delphi-Quellcode:
SetCursorPos
reicht aus.

Hier der Code falls noch jemand das Problem hat:
Delphi-Quellcode:
procedure TForm1.CursorUpdate;
var p: TPoint;
begin
  GetCursorPos(p);
  SetCursorPos(p.X,p.Y);
end;
Gruß
e-gon

mirage228 9. Sep 2012 13:09

AW: Curosr-Änderung sofort wirksam
 
Habe etwas Nachforschung betrieben:
Tatsächlich ist es so, dass nur bei TWinControl-Nachfolgern die Änderung des Cursor sofort zum Update durchgereicht wird ("CMCursorChanged"). TImage ist aber ein TGraphicControl. Dort geschieht dies nicht unmittelbar.

Mit dieser Zeile aus der CMCursorChanged-Funktion klappt es auch ohne Workaround. Einfach direkt hinter der "Cursor := ..."-Zeile einfügen:
Delphi-Quellcode:
// Handle = Self.Handle => Form1.Handle
Perform(WM_SETCURSOR, Handle, HTCLIENT);

sx2008 9. Sep 2012 13:25

AW: Curosr-Änderung sofort wirksam
 
Du musst Screen.Cursor setzen, wenn die Änderung sofort wirksam sein soll.
Das Property Cursor, dass alle Controls haben, ist dafür gemacht nur einmal gesetzt zu werden.
Es wirkt nur indirekt auf den eigentlichen Cursor.


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