Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Cursor einfangen (https://www.delphipraxis.net/207308-cursor-einfangen.html)

wendelin 11. Mär 2021 17:49

Cursor einfangen
 
Hallo,
ich habe eine Frage zum Cursor.

Vor einiger Zeit benutzte ich ein Programm (Chartprogramm) in welchem ein Fadencursor (senkrechte Linie) verwendet wurde.
Bitte stellt Euch ein horizontal angeordnetes Lineal vor. Wenn man nun die Maus nur ein wenig nach links oder rechts bewegte passierte nichts.
Wenn man jedoch die Maus z.B. über die halbe Entfernung zur nächsten Zahl bewegte sprang der Cursor auf diese.

Wie programmiert man so etwas ?

Vielen Dank für Eure Antworten.

Wendelin

KodeZwerg 11. Mär 2021 17:57

AW: Cursor einfangen
 
Schau Dir mal diese Demo an.
Da wird Dir gezeigt womit man den Cursor überhaupt ändern könnte.

Mit ClientToScreen könnte man die Cursor-Position auswerten (wie nah am Ziel-Objekt)

Am einfachsten ist es per OnMouseEnter/OnMouseLeave Ereignis, da einfach Cursor austauschen/zurücksetzen mit Code von oben.

Das wäre zumindest schon mal ein Anfang.

//edit

oh, ich glaube ich habe da was falsch verstanden.
SetFocus() müsste das gewünschte sein anstelle das mit dem Cursor-Bild-Tausch.

himitsu 11. Mär 2021 18:50

AW: Cursor einfangen
 
Mouse (globale Variable in Vcl.Controls.pas)
Delphi-Referenz durchsuchenTMouse.CursorPos

MSDN-Library durchsuchenGetCursorPos
MSDN-Library durchsuchenSetCursorPos
MSDN-Library durchsuchenClipCursor

Positionen z.B. im MouseEvent von/zu Monitor sind mit ClientToScreen/ScreenToClient umzurechnen.


Ich empfehle aber niemals die Maus festzuhalten. (ich jedenfalls hab gern mal mordgelüste, wenn jemand der Meinung ist mir sowas antun zu wollen)
Aber das was man mit der Maus zieht, das darf man gern grade rücken, also z.B. auf den nächstliegenden Winkel zu runden.
siehe z.B. MS-Office mit Strg/Shift oder die Linie in Paint zusammen mit Shift, wo man mit Strg+ und/oder Shift+Mausbegen das Gemalte ausrichten kann, aber da niemals die Maus selbst vergewaltigt.

wendelin 12. Mär 2021 10:18

AW: Cursor einfangen
 
Hallo,

vielen Dank für Eure Antworten.

Leider kann ich mit Euren Antworten nicht allzu viel anfangen.
Ich bin halt ein reiner Autodidakt.

Um es nochmals beispielhaft zu erklären : Stellt Euch ein virtuelles graphisches Lineal vor.
10 cm Länge, die mm-Angaben zwischen 1,2.. 10 cm sollen vom Cursor übersprungen werden.
D.h. wir haben es hier mit diskreten Abständen zu tun, welche sich je nach Graphic-Auflösung
ändern können. Wenn ich also den Cursor auf 1(cm) stehen habe und die (physikalische) Maus
gleichmäßig in Richtung 10(cm) ziehe, soll der Cursor zur 2(cm).. 3(cm) bis zur 10(cm) springen
ohne in den Zwischenräumen sichtbar zu sein.
Ich will auch nicht die (physikalische) Maus auf meinem Schreibtisch festhalten, sondern nur den
(graphischen Cursor) auf dem Bildschirm für ein bestimmtes Intervall.

Noch eine Frage. Kennt jemand villeicht den Namen für diese Funktion (falls es sie gibt) ?
Ich würde sie z.B. "Flip-Cursor" nennen.

Wendelin

KodeZwerg 12. Mär 2021 12:34

AW: Cursor einfangen
 
Das was Du Linieal nennst sind bei anderen lediglich Koordinaten.
Für Koordinaten hast Du oben bereits alles stehen was Du brauchst.


Angenommen Du hast ein Control mit einem Image von einem Teil eines Lineals.
Mit GetCursorPos() in einem Timer aktuelle Maus Koordinate holen.

Mit ClientToScreen/ScreenToClient diese Werte abgleichen um zu prüfen wie "nah" der Cursor am Teil des Lineals ist.

Ab einer von Dir gewünschten unter-Grenze mit SetCursorPos() den Cursor in das Control mit dem Teil des Lineals befördern.

Wenn Du ein Control fertig hast, so das der Timer alles brav verrichtet was er soll, füge nun mehr Controls mit mehr Teilabschnitten des Lineals hinzu und gebe dem Timer auch diese als Sprungziele an.

Du kannst auch ein großes Control mit dem kompletten Lineal machen und da dann eine eigene Maßeinheit für entwickeln,
Delphi macht meist alles mit :-)


//edit
ich halte von dieser idee übrigens gar nichts. mich würde es als user verwirren wenn sich die maus nicht so verhält wie man es gewohnt ist.
okay, für default-Jumps bin ich zu haben (nach aktion X bekommt control Y den focus und die maus hüpft mit dahin) aber vom verschwinden des Cursors kann ich nur abraten.
Lass mal dann deine App abstürzen und der Kunde sitzt da... so ohne sichtbare maus... also ich würde so etwas nicht gut heissen.

ps:
die obige taktik gilt auch wenn du irgendwelche punkte im image als sprungziele bestimmst... also lineal mit cm und mm angabe, da nur du wissen kannst auf welchen pixel welcher wert ist kann ich dir nur bis hierhin hilfe geben.

Gausi 12. Mär 2021 15:16

AW: Cursor einfangen
 
Ich denke, hier sollte nicht der Cursor "springen", sondern das Lineal. Also vielleicht so etwas in der Art?
Delphi-Quellcode:
// ein Bevel auf die Form packen
// OnMouseMove der Form:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Bevel1.Left := Round(x/50) * 50;
end;
In einigen Programmen hat man ja so eine Raster-Funktion. Da wird auch nicht der Mauscursor an sich so eingefangen, sondern nur die aktiven Objekte. Meistens aber in Form einer Drag&Drop-Methode, nicht direkt beim bloßen Bewegen der Maus.

wendelin 12. Mär 2021 16:29

AW: Cursor einfangen
 
Hallo Kodezwerg,

vielen Dank für Deine ausführliche Antwort.
Ich denke, daß Deine Vorschläge mir weiter helfen werden.

Wendelin

wendelin 7. Mai 2021 22:56

AW: Cursor einfangen
 
Hallo,

nochmals vielen Dank für Eure Antworten.
Ich muß mich entschuldigen. Ich hatte geschrieben, daß in dem Beispielprogramm (Chartprogramm mit Candlesticks) der Cursor, wenn er weiter von
einer Position zur nächsten springt ( nur in x-Richtung) kurzzeitig verschwinden würde. Dies ist jedoch nicht der Fall. Es war eine optische
Täuschung. Es kam daher, da ich eine sehr geringe Auflösung ( sehr viele kurs-werte ) eingestellt hatte. Bei einer höheren Auflösung war der
Crosshair- Cursor immer zu sehen.
Noch eine Frage: warum brauche ich einen Timer und wie setzte ich ihn ein?

Wendelin (Wolfgang)

KodeZwerg 8. Mai 2021 00:20

AW: Cursor einfangen
 
Zitat:

Zitat von wendelin (Beitrag 1488861)
Noch eine Frage: warum brauche ich einen Timer und wie setzte ich ihn ein?

Guten Abend,
bei meinen Vorschlägen ging es immer darum das die Anwendung zu jeder Zeit weiß wo sich der Maus-Cursor befindet.
Um dies zu erreichen benötigt man einen Timer der die Position/Koordinate abfragt und an die Anwendung weiterleitet um dann entsprechende Aktionen auszuführen oder eben keine.

-> TTimer Komponente aufs Formular ziehen, doppelklicken und Code einfügen.
-> TTimer Komponente einen Sinnvollen Interval geben und aktivieren.

wendelin 11. Mai 2021 18:07

AW: Cursor einfangen
 
Danke KodeZwerg,

ich werde versuchen Deine Anregungen umzusetzen.
Falls es klappt werde ich Dich informieren (mit source-code).

Wendelin (Wolfgang)


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