Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mouse Move to (x,y) Bewegung sehen (https://www.delphipraxis.net/177827-mouse-move-x-y-bewegung-sehen.html)

Natcree 29. Nov 2013 12:17

Mouse Move to (x,y) Bewegung sehen
 
Hallo ich möchte das sich mein Cursor von a nach b Bewegt. Ich versuche es mit einer Schleife

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
p:TPoint;
begin
m:=0;
repeat
getcursorPos(p);
SetCursorPos(p.x+m, p.y);
m:=m-1;
sleep(10);
getcursorPos(p);
until p.x=100;
end;
Das Problem ist er läuft bis zum linken rand durch und das Programm hängt

Setze ich
Delphi-Quellcode:
until p.x=100;
auf
Delphi-Quellcode:
until p.x<100;
dann klappt es.

Aber er bleibt nie genau bei p.x=100 stehen. Mal bei 98 mal bei 74....

Was kann ich Hier Ändern ????

DeddyH 29. Nov 2013 12:19

AW: Mouse Move to (x,y) Bewegung sehen
 
Einfach mal im Debugger die Werte kontrollieren, dann siehst Du es schon, was Du da doppelt gemoppelt hast.

Natcree 29. Nov 2013 12:27

AW: Mouse Move to (x,y) Bewegung sehen
 
Delphi-Quellcode:
m:=m-1;
Das war es

habe es geändert auf
Delphi-Quellcode:
m:=-1;

DeddyH 29. Nov 2013 12:27

AW: Mouse Move to (x,y) Bewegung sehen
 
:thumb:

[edit] Die Alternative wäre gewesen, den GetCursorPos-Aufruf einmalig vor der Schleife, aber nicht mehr innherhalb derer auszuführen. [/edit]

Natcree 29. Nov 2013 12:54

AW: Mouse Move to (x,y) Bewegung sehen
 
so nun habe ich sleep auf (10) gesetz der mauszeiger brauch aber zu lange.

nunmehr würde ich m:=-10 setzen dann bekommt er aber nicht die 100 wenn ich until p.x=100 setze.
wie kriege ich das am besten gelöst.

eine möglichkeit wäre sicherlich until p.x <200 zusetzen und dann mit einer weitere schleife mit m=-1 auf 100 runterlaufen zu lassen. aber es hängt ja auch immer davon ab an welcher pos. ich den Button anklicke.

Die andere möglichkeit wäre die getcursorPos(p); beim klick zu bestimmen und je nach dem was dichter liegt eine setcursor position zu setzten

Beispiel Mausklick der Cursor befindet sich bei p.x = 657 dann setcursorpos (660,600)

wenn er sich bei p.x = 653 dann setcursorpos (650,600).

Wie kriege ich das am besten umgesetzt.

Natcree 29. Nov 2013 13:18

AW: Mouse Move to (x,y) Bewegung sehen
 
Habe es jetzt so gelöst

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
p:TPoint;
begin
edit1.Text:=''; //zur Kontrolle
edit1.Repaint;
m:=0;
repeat
getcursorPos(p);
SetCursorPos(p.x+m, p.y);
m:=-10;
sleep(10);
until p.x<120;
if p.x<120 then
getcursorPos(p);
m:=0;
repeat
getcursorPos(p);
SetCursorPos(p.x+m, p.y);
m:=-1;
sleep(10);
until p.x=100;
edit1.Text:=inttostr(p.X); //Zur Kontrolle
end;
hat noch jemand einen Vorschlag ???

DeddyH 29. Nov 2013 13:50

AW: Mouse Move to (x,y) Bewegung sehen
 
Ja, 2: rücke mal vernünftig ein, damit wir das hier auch nachvollziehen können, und teste den Code mal mit der initialen Maus-Koordinate von z.B. X: 90 und Y:50.

hathor 29. Nov 2013 14:23

AW: Mouse Move to (x,y) Bewegung sehen
 
Man kann das auch dynamisch machen:

Delphi-Quellcode:
procedure TForm1.Button12Click(Sender: TObject);
var
p:TPoint; i, d:Integer;
begin
Memo1.clear;
d:=800 div 20; //800 Wegpunkte - nur Beispiel, kann man auch berechnen...
for i := 1 to d do
BEGIN
getcursorPos(p); Memo1.lines.add(inttostr(p.X));
SetCursorPos(p.x-(i div 2), p.y);
sleep(20);
END;

for i := d downto 1 do
BEGIN
getcursorPos(p); Memo1.lines.add(inttostr(p.X));
SetCursorPos(p.x-(i div 2), p.y);
sleep(20);
END;
edit1.Text:=inttostr(p.X); //Zur Kontrolle
end;

DeddyH 29. Nov 2013 14:28

AW: Mouse Move to (x,y) Bewegung sehen
 
Nicht, wenn es eine globale Variable ist.

hathor 29. Nov 2013 15:17

AW: Mouse Move to (x,y) Bewegung sehen
 
Eine globale Varable m wird in dieser Procedure nicht gebraucht.

DeddyH 29. Nov 2013 15:35

AW: Mouse Move to (x,y) Bewegung sehen
 
Aber auch keine lokale, wenn es eine globale gibt. Ich mag zwar globale Variablen auch nicht sonderlich, aber was soll' s?

Aphton 29. Nov 2013 22:14

AW: Mouse Move to (x,y) Bewegung sehen
 
Du kannst da auch noch eine Interpolation einführen, sodass du dann nicht immer eine Art von beschleunigte (quadratische) Bewegung hast.

Natcree 29. Nov 2013 22:43

AW: Mouse Move to (x,y) Bewegung sehen
 
Aphton wie geht das??

Aphton 29. Nov 2013 23:59

AW: Mouse Move to (x,y) Bewegung sehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Code:
A = Startpunkt
B = Endpunkt
dt = delta Time
lt = last Tick

A, B TPoint von mir aus
dt = GetTickCount - lt
lt = GetTickCount

f(x) := irgend ein Interpolator mit x in [0, 1]

fdt = f(dt)
P = A * (1-fdt) + B * fdt
P wäre dein interpolierter Punkt!

Edit:
Vlt ist das hier anschaulicher:


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