Verschieben des Controls nicht korrekt

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Verschieben des Controls nicht korrekt

Beitrag von thosch »

Ich habe in meinen Control diese MouseMove Methode:

Code: Alles auswählen

procedure MyVisibleControl.MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
  if MouseL then
  begin
    if ContainsMouse(X,Y) then
    begin
      FMouseMoved := true;
      FDeltaX := X - FStartX;
      FDeltaY := Y - FStartY;
      OutTextXY(MouseX,MouseY+20,'DELTAX = '+IntToStr(FDeltaX)+'  DELTAY = '+IntToStr(FDeltaY));

     // FRight := FRight + FDeltaX;                     Habe ich schon entfernt.
     // FBottom := FBottom + FDeltaY;
     // FLeft := FLeft + FDeltaX;
     // FTop  := FTop + FDeltaY;

    end;
  end;
end;

Im Hauptprogramm könnte dieses Stück Code noch relevant sein:

Code: Alles auswählen

       If (oldx<>mousex) or (oldy<>mousey) then begin                           //Mausbewegung kann ausgewertet werden
         //Do Something
         //Zum Beispiel Test ausgeben oder mein Control zeichnen
         fcontrol.OutTextXY(MouseX,MouseY,'Maus bewegt!');
         //Und die Mausbewegung erfassen und X,Y speichern um delta zu ermitteln
         fcontrol.MouseMove(frame,0,MouseX,MouseY);

         Oldx:=mousex;
         Oldy:=mousey;
         if not ButtonUp then
         begin
           x := x + fcontrol.DeltaX;
           y := y + fcontrol.DeltaY;
         end;
 

Warum verhält die sich so, dass das Verschieben sich verhält als ob ich an einem Gummiband ziehen würde?

Ich will das Control so verschieben wie das auf der heutigen GUI überall geht.

Was muss ich da anders machen?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Verschieben des Controls nicht korrekt

Beitrag von Michl »

Kannst du ein kleines Testprog machen und hier anhängen, dann kann man mMn besser nachvollziehen, was du erreichen willst.

Ansonsten, wenn du z.B. ein Panel auf einem Formular hin- und herbewegen willst, geht das z.B. so.:

Code: Alles auswählen

  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    FPanelMoving: Boolean;
    FPanelOrig: TPoint;
    FMouseOrig: TPoint;
  end;
...

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FPanelOrig := Point(Panel1.Left, Panel1.Top);
  GetCursorPos(FMouseOrig);
  FPanelMoving := True;
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  MouseOffset: TPoint;
begin
  if not FPanelMoving then Exit;
  GetCursorPos(MouseOffset);
  MouseOffset := MouseOffset - FMouseOrig;
  Panel1.SetBounds(FPanelOrig.X + MouseOffset.X,
                   FPanelOrig.Y + MouseOffset.Y,
                   Panel1.Width,
                   Panel1.Height);
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  FPanelMoving := False;
end;
Dateianhänge
Move_Panel.zip
(1.95 KiB) 59-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Verschieben des Controls nicht korrekt

Beitrag von siro »

Ein Label der mit der Maus verschoben werden kann.
LabelMoved.zip
(127.05 KiB) 76-mal heruntergeladen
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: Verschieben des Controls nicht korrekt

Beitrag von thosch »

Ok, das Testprogramm folgt morgen, bin jetzt nicht an meinem Rechner. Die Beispielprogramme habe ich auch runter geladen und schau sie mir an.

Danke so weit.

Was ich beim Verschieben meines Controls festgestellt habe ist, dass sich das Vorzeichen bei DeltaX, DeltaY mit dem Richtungswechsel der Mausbewegung nicht sofort ändert und so das Control noch in die alte Richtung weiter verschiebt, obwohl ich die Maus in die entgegengesetzt Richtung bewege.

Erst nach einer größeren (einige Pixel) Bewegung in die neue Reichtung kehrt sich das Vorzeichen um und mein Control folgt erst dann der neuen Bewegungsrichtung,

Das kann ich mir nicht erklären. Aber da baue ich halt morgen mal ein Testprogramm, welches die falsche Verschiebung zeigt.

thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Re: Verschieben des Controls nicht korrekt

Beitrag von thosch »

Ich habe folgenden Änderung durchgeführt:

Code: Alles auswählen

 If (oldx<>mousex) or (oldy<>mousey) then begin                           //Mausbewegung kann ausgewertet werden
         //Do Something
         //Zum Beispiel Test ausgeben oder mein Control zeichnen
         fcontrol.OutTextXY(MouseX,MouseY,'Maus bewegt!');
         //Und die Mausbewegung erfassen und X,Y speichern um delta zu ermitteln
         fcontrol.MouseMove(frame,0,MouseX,MouseY);

         dx := oldx - mousex;
         dy := oldy - mousey;

         Oldx:=mousex;
         Oldy:=mousey;

         if not ButtonUp then
         begin
           x := x - dx;    //Hier ist die entscheidende 
           y := y - dy;   //Anderung
         end;
 
Habe die zusätzlichen Variablen dx,dy vom Typ Integer definiert und meinen Cose wie oben zu sehen geändert.

Nun funktioniert die Verschiebung wie ich es haben will.

Habe mir auch LabelMoved angeschaut. Um das aber verenden zu können sind Änderungen in meinem Control nötig. Dennoch Danke! siro und Michi Immerhin hat mit dieser Quellcode die Inspiration für die von mir benötigte Änderung gegeben.

Ich wollte ein Musterprogramm hierher kopieren zum Nachvollziehen meines Fehlers, aber mit Form funktioniert die Verschiebung mit dem alten Code wie gewünscht, nur beginnt die Verschiebung schon ohne gedrückte Maustaste, wenn ich im Quellcode nicht anweise, dass das nur bei mbLeft passieren soll.

Ich wollte dann eine ContainsMouse(X,Y) Funktion haben. Gibt es doch? Unter ContainsMouse() oder MouseInside() habe ich da leider nichts gefunden.

Das Verschieben funktioniert jetzt mit obiger Änderung jedenfalls wie gewollt.

Antworten