![]() |
Objekte bewegen
Huhu,
ich möchte gerne ein Objekt (zur Zeit ist es ein einfacher Button, später soll es ein Image werden) bewegen. Zuersteinmal geschieht dies nur in x-Richtung. Mehr brauche ich glaube ich nicht sagen, der Quelltext macht deutlich was ich möchte:
Delphi-Quellcode:
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin if Shift = [ssLeft] then begin if isright(x) then Button1.Left:=Button1.Left+1 else Button1.Left:=Button1.Left-1; end; end;
Delphi-Quellcode:
Wenn ich jetzt auf das Panel klicke und die Maus bewege saust der Button nach links und verschwindet von der Form. Ich habe schon sehr viel ausprobiert, dies ist jetzt ein letzter Quelltext stand.
function isright (xvalue: integer): boolean;
begin if (lastpx < xvalue) and (xvalue <> lastpx) then result:=true else result:=false; lastpx:=xvalue; end; Wo ist der Fehler? |
Re: Objekte bewegen
Du darfst den Button nicht einfach um 1 verschieben, sondern musst ihn dahin verschieben, wo deine Maus ist (ich denke, dass willst du)
|
Re: Objekte bewegen
Wenn die Maus 1 pixel nach rechts bewegt wird, soll der Button auch 1 pixel nach rechts verschoben werden, genau das gleiche in die linke Richtung. Der Button soll nicht auf der gleichen Position sein wie die Mausposition, sondern davon unabhängig.
PS: Das OnMouseMove Event wird ja jedes mal ausgelöst wenn die Maus bewegt wird. Jedes nach links/rechts Bewegen soll eine links/rechts Bewegung des Buttons nach sich ziehen. |
Re: Objekte bewegen
Also ein parallele Bewegung zur Maus (und wahrscheinlich auch, wenn die Maus aus dem Formular heraustritt..), ok.
Dann darfst du nicht um 1 verändern, sondern um die Differenz deiner Mausbewegung. zu Edit: Aber die Differenz muss nicht 1 sein. |
Re: Objekte bewegen
Dann ist das was du da hast doch richtig. Wo ist dein eigentliches Problem?
Am Rande: Wenn (lastpx < xvalue), dann ist es auf jeden Fall auch <> xvalue. Deine 2. Prüfung in isright() kannst du also sparen. Edit: Achso, das Objekt soll auf selber X-Koordinate wie die Maus sein, aber auf fixer Y-Koordinate? Wenn ja, dann bitte ich künftig um präziesere Fragestellung. Zur Lösung siehe sirius' Post über diesem ;). Auch wäre es dann möglich gleich die X-Koordinate des Cursors zu nehmen, und nicht um Differenzen zu verschieben - wie schon zuvor vorgeschlagen, aber halt ohne Y zu verändern. Man muss ja nicht immer beide zusammen ändern... |
Re: Objekte bewegen
Mein Problem ist, dass das ganze nicht funktioniert ;-) Wenn ich jetzt auf das Panel klicke und die Maus nur 1 pixel bewege, egal ob nach links oder nach rechts, saust der Button mit einem hohen Tempo nach links von der Form runter, das gute Stück verschiebt sich nicht um 1 pixel sondern um undendlich viele...
Edit @Medium: In meinem Anfangspost steht doch nur in x-Richtung und auch, dass der Button von der Form verschwindet und dies mein Problem sei... |
Re: Objekte bewegen
Button auf Form.
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin if Shift = [ssLeft] then begin Button1.Left:=Button1.Left-(FMouseOld.X-X); //Button1.Top:=Button1.Top-(FMouseOld.Y-Y); end; FMouseOld.X:=X; FMouseOld.Y:=Y; end; |
Re: Objekte bewegen
Nein, nicht unendlich viele. MouseMove wird offenbar nicht nur aufgerufen wenn sich die Maus sichtbar bewegt hat, sondern auch im Subpixel-Bereich, entsprechend der Auflösung der Maus. D.h. es könnte durchaus auch mal 100 mal MouseMove auftreten, bevor sie um einen Pixel fortgeschritten ist.
|
Re: Objekte bewegen
Zitat:
2) Das ist ja ein ganz anderes Problem: Du musst abfragen ob sich der Button schon am Rand befindet, wenn ja einfach nicht verschieben. Edit: Grmpf. Es müsste einen Edit+Quote-Button geben =) |
Re: Objekte bewegen
Ah Ok, darin liegt das Problem danke!
Edit: Das ganze lässt sich damit umgehen:
Delphi-Quellcode:
wichtig die Ergänzung and (x <> lastpx) jetzt funktioniert es so wie ich es möchte...
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer); begin sleep(1); if (Shift = [ssLeft]) and (x <> lastpx) then begin if isright(x) then Button1.Left:=Button1.Left+1 else Button1.Left:=Button1.Left-1; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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