Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Objekte bewegen (https://www.delphipraxis.net/141344-objekte-bewegen.html)

-remit- 7. Okt 2009 12:27


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:
function isright (xvalue: integer): boolean;
begin
  if (lastpx < xvalue) and (xvalue <> lastpx) then
    result:=true
  else
    result:=false;
  lastpx:=xvalue;
end;
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.
Wo ist der Fehler?

sirius 7. Okt 2009 13:16

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)

-remit- 7. Okt 2009 13:24

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.

sirius 7. Okt 2009 13:31

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.

Medium 7. Okt 2009 13:32

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...

-remit- 7. Okt 2009 13:35

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...

sirius 7. Okt 2009 13:37

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;

Medium 7. Okt 2009 13:38

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.

Medium 7. Okt 2009 13:39

Re: Objekte bewegen
 
Zitat:

Zitat von -remit-
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...

1) Ok, stimmt :oops:
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 =)

-remit- 7. Okt 2009 13:40

Re: Objekte bewegen
 
Ah Ok, darin liegt das Problem danke!

Edit: Das ganze lässt sich damit umgehen:

Delphi-Quellcode:
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;
wichtig die Ergänzung and (x <> lastpx) jetzt funktioniert es so wie ich es möchte...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 Uhr.
Seite 1 von 2  1 2      

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