Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Shape nur im 45° Winkel bewegen (https://www.delphipraxis.net/122088-shape-nur-im-45%B0-winkel-bewegen.html)

Luckie 9. Okt 2008 10:24


Shape nur im 45° Winkel bewegen
 
Ich verschiebe mit der Maus eine Shape:
Delphi-Quellcode:
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  XMouseDown := X;
  YMouseDown := Y;
  IsOver := true;
end;

procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  IsOver := False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  IsOver := False;
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if isOver then
  begin
    Caption := IntToStr(X);
    Shape1.Left := Shape1.Left + X - XMouseDown;
    Shape1.Top := Shape1.Top + Y - YMouseDown;
  end;
end;
Jetzt ist es aber so, dass man dieses Shape nur diagonal im 45° Winkel von links oben nach recht unter verschieben können darf. Also auch wenn ich die Maus seitwärts bewege muss das Shape sich nach rechts unten bewegen. Hinzukommt, dass sich das Shape auch bewegen muss, wenn die Maus aufgrund der Bewegung das Shape verlässt.

Medium 9. Okt 2008 10:34

Re: Shape nur im 45° Winkel bewegen
 
Muss es sich auch bei vertikaler Mausbewegung entsprechend bewegen? Ist die Diagonale im 45° Winkel? Wenn das erste nicht, aber das zweite schon zutrifft, ist das Benutzen der X-Änderung auch für Y z.B. eine Möglichkeit.

Edit: Okay, die 45° haben sich so eben geklärt. Ich hab den Titel mal aufmerksam gelesen :)

Luckie 9. Okt 2008 10:37

Re: Shape nur im 45° Winkel bewegen
 
Ja. Auch wenn ich die Maus irgendwie schräg bewege muss es sich im 45° Winkel bewegen. Es soll sich so verhalten wie die Punkte zum Anfassen für Größenänderungen an Objekten in den Ecken, wenn das Objekt nur proportional in der Größe verändert werden kann. Das heißt wenn ich die Maustaste über dem Objekt drücke und dann die Maus bewege, muss ich das Shape mitbewegen. Wenn ich die Maus (mit gedrückter Maustaste) waagerecht nach rechts bewege, muss sich das Shape entsprechend im 45° Winkel nach rechts unten bewegen. Dass dabei die Maus das Shape verlässt ist klar. Umgekehrt, wenn ich die Maus (mit gedrückter Maustaste) nach links bewege, muss sich das Shape im 45^Winkel nach links oben bewegen. Und das ganze soll abgebrochen werden, wenn ich die maustaste wieder los lasse.

Wichtig dabei ist, möglichst ohne Windows Funktionen auszukommen, da ich das in Wirklichkeit in Flex und ActionScript realisieren muss. :( Ich habe es mir jetzt nur mal in Delphi angeguckt, weil ich da etwas sicherer unterwegs bin und das Prinzioüp das gleiche sein müsste. ;)

Benedikt 9. Okt 2008 10:54

Re: Shape nur im 45° Winkel bewegen
 
Moin,

hab grad mal rumgespielt: Ist das so in etwa wie du dir das denkst?

Delphi-Quellcode:
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
begin
    XMouseDown := X;
    YMouseDown := Y;

    XStart := Shape1.Left;
    YStart := Shape1.Top;

    IsOver := true;
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
    Y: Integer);
begin
    if isOver then
    begin
        Shape1.Left := Shape1.Left + x - XMouseDown;
        Shape1.Top := YStart - XStart + Shape1.Left;
    end;
end;

DeddyH 9. Okt 2008 10:55

Re: Shape nur im 45° Winkel bewegen
 
Ich habe es so gemacht:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Shape1: TShape;
    procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private-Deklarationen }
    FPos: TPoint;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FPos := Point(X,Y);
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
    begin
      Shape1.Left := Shape1.Left + (X - FPos.X);
      Shape1.Top := Shape1.Top + (X - FPos.X);
    end;
end;

Luckie 9. Okt 2008 11:02

Re: Shape nur im 45° Winkel bewegen
 
Perfekt. :thumb: Ich habe mir schon überlegt, ob das irgendwie mit sinus und cosinus geht oder so. Jetzt muss ich das ganze nur noch nach Flex übertragen. :roll:

DerDan 9. Okt 2008 11:07

Re: Shape nur im 45° Winkel bewegen
 
Hallo,

du könntest auch deine Maus Koordinate auf einen Punkt einer Linie mappen.
Die Linie hat einen Punkt auf der Shape Koordinate und einen weiteren im entsprechenden 45Grad Winkel dazu.

Du musst nur den kürzesten Abstand von der Maus Koordinate auf diese Linie berechnen und welcher Punkt auf der Linie dazu korrespondiert.
Auf diesen Punkt schiebst du dann dein shape.


Mfg


Der Dan

Medium 9. Okt 2008 11:14

Re: Shape nur im 45° Winkel bewegen
 
Zitat:

Zitat von Luckie
Ich habe es mir jetzt nur mal in Delphi angeguckt, weil ich da etwas sicherer unterwegs bin und das Prinzioüp das gleiche sein müsste. ;)

Genau so mache ichs immer bei Java :-D

Luckie 9. Okt 2008 11:26

Re: Shape nur im 45° Winkel bewegen
 
Funktioniert leider nur halb. So bald unter Flex der Mauszeiger das Shape verlässt, bewegt es sichnicht mehr. Aber da werde ich mal näher im einem Felx Forum fragen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 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 by Thomas Breitkreuz