Announcement

Collapse
No announcement yet.

Mauszeiger verschieben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mauszeiger verschieben

    Hallo,

    ich verschiebe eine TShape-Komponente durch die Maus mit Hilfe von MouseDown/MouseUp und MouseMove. Die Anzahl der Pixels, um welche die Komponente nach links oder rechts verschoben wird, ist immer gleich, z.B. 10.

    Leider führt dies dazu dass sich der Mauszeiger schneller bewegt als die Komponente.

    Hat zufällig jemand eine Idee wie ich es bewerkstelligen kann dass sich der Mauszeiger beim verschieben jeweils immer über der Komponente befindet?

    Oder gibt es eine Möglichkeit die Mausgeschwindigkeit im MouseDown zu ändern und sie über das MouseUp-Ereignis wieder zurücksetzen? Aber falls ja, wo muss ich hier suchen?????

    Wäre toll wenn jemand eine Idee hätte

    Viele Grüße

    Christoph

  • #2
    Hallo, Christoph.
    Du kannst bei OnMouseMove die Position des Cursors immer auf eine Stelle der Komponente setzen
    If it's there and you can see it – it's REAL
    If it's there and you can't see it – it's TRANSPARENT
    If it's not there and you can see it – it's VIRTUAL
    If it's not there and you can't see it – it's GONE!

    Comment


    • #3
      Hallo Christoph,

      ich hatte mal das gleiche Problem und konnte es lösen, indem ich den zu verschiebenden Conbtrols die beiden folgenden Events OnMouseDown und OnMouseMove gesetzt habe:

      procedure TForm1.ElementMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      begin
      RelX := X;
      RelY := Y;
      end;

      procedure TForm1.ElementMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
      var FRaster : integer;
      begin
      if (Sender is TControl) and
      (csLButtonDown in TControl(Sender).ControlState) then
      begin
      TControl(Sender).Top := TControl(Sender).Top + Y - RelY;
      TControl(Sender).Left := TControl(Sender).Left + X - RelX;
      if CheckBox1.Checked then
      begin
      FRaster := StrToInt(EdtRaster.Text);
      TControl(Sender).Top := (TControl(Sender).Top DIV FRaster) * FRaster;
      TControl(Sender).Left := (TControl(Sender).Left DIV FRaster) * FRaster;
      end;
      end;
      end;

      Die beiden Werte RelX, RelY müssen in der Klasse gemerkt werden. In CheckBox1 frage ich ab, ob sich das Element am Raster FRaster ausrichten soll.

      Ich hoffe damit kommst Du weiter.

      Hans

      Comment


      • #4
        Hallo Hans,

        vielen herzlichen Dank! Klappt absolut super!

        Viele Grüße

        Christop

        Comment


        • #5
          Hallo Christoph,

          das Verschieben von Komponenten geht noch einfacher:

          <code>
          procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
          const
          &nbsp;&nbsp;SC_DRAGMOVE = $F012;
          begin
          &nbsp;&nbsp;ReleaseCapture;
          &nbsp;&nbsp;TWinControl(Sender).Perform(WM_SYSCOMM AND, SC_DRAGMOVE, 0);
          end;
          </code>

          Damit brauchst Du Dir keine Gedanken um die Position des Cursors machen.

          mfg
          Michae

          Comment


          • #6
            Hallo Michael,

            und wie funktioniert dann das Ausrichten an einem vorgegebenen Raster?
            Deine Lösung habe ich auch anfangs ausprobiert, aber bzgl. der Rasterausrichtung bin ich dann nicht weitergekommen.

            Hans

            Comment

            Working...
            X