Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fenster verschieben? (https://www.delphipraxis.net/140096-fenster-verschieben.html)

DualCoreCpu 12. Sep 2009 17:36

Re: Fenster verschieben?
 
Danke, @DeddyH, so klappt es! Problem gelöst!

DeddyH 12. Sep 2009 17:37

Re: Fenster verschieben?
 
Wenn Du das jetzt auch noch nachvollziehen kannst, sind ja alle zufrieden :zwinker:

DualCoreCpu 12. Sep 2009 17:49

Re: Fenster verschieben?
 
Zitat:

Zitat von DeddyH
Wenn Du das jetzt auch noch nachvollziehen kannst, sind ja alle zufrieden :zwinker:

Werde mir das auf jeden Fall noch durcharbeiten. Klar, wenn X und Y relativ zum Formular zu betrachten sind, dann entsprechen X und Y der Strecke der Mausbewegung und die Richtung müsste sich dann mit dem Vorzeichen ergeben.

Left + X - DeltaX
Left + Y - DeltaY



In FormMouseDown werden DeltaX,DeltaY vorzeichengerecht ermittelt. Dann kommt die fragliche Berechnung.

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
    begin
      Left := Left + X - DeltaX;
      Top := Top + Y - DeltaY;
    end;
end;
Wie sind X und Y hier zu interpretieren?

Habe soeben mal die Addition von X und Y entfernt (auskommentiert). Da funktioniert die Verschiebung nicht mehr.

Und egal wei ich die Maus bewege, X und Y werden immer hinzu addiert. Das erkläre ich mir damit, das DeltaX,DeltaY wirklich die Differenz zur vorherigen Mausposition ist, während X und Y in FormMouseMove die aktuellen X,Y Werte der Mausposition sind.

DeddyH 12. Sep 2009 18:14

Re: Fenster verschieben?
 
Also, Du merkst Dir OnClick die aktuellen Koordinaten relativ zum Formular. Wenn man die Maus verschiebt, ändern sich diese logischerweise. Der Trick ist nun lediglich, das Formular so zu verschieben, dass die jetzt aktuellen Koordinaten wieder den gemerkten entsprechen. Dazu genügt uns die Addition von Form.Left bzw. Form.Top mit der Differenz aus aktuell und gemerkt. Dabei kann uns egal sein, ob die jeweilige Differenz positiv oder negativ ist, denn eine Addition mit einem negativen Wert entspricht ja einer Subtraktion. Für Details dazu siehe meine vorherigen Posts, ich möchte das nicht alles wiederholen.

Namenloser 12. Sep 2009 21:30

Re: Fenster verschieben?
 
Ich würde die Variablen aber nicht Delta nennen. Delta weist immer auf eine Differenz hin. StartX bzw StartY (oder Offset) wäre da vielleicht passender.

DeddyH 12. Sep 2009 21:33

Re: Fenster verschieben?
 
Meinetwegen kann er die auch Erbsensuppe nennen, am Anfang kommt es ja eher auf eine verständliche Problemlösung an. Aber gut, Du hast insofern Recht, als dass man auch meiner Meinung nach immer sprechende Namen verwenden sollte, sonst steigt man später durch seinen eigenen Code nicht mehr durch.

DualCoreCpu 13. Sep 2009 08:22

Re: Fenster verschieben?
 
Hallo,

bin noch immer beim Nachvollziehen meines Quelltextes. Zum besseren Verständnis habe ich den Hinweis von @NamenLozer aufgegriffen. Ich habe also die bisherigen DeltaX,DeltaY Variablen in StartX und StartY umbenannt, weil diese Werte unabhängig von der Bewegungsrichtung der Maus immer positiv sind. Danach müssten DeltaX,DeltaY die Differenz zum Startpunkt in FormMouseDown und dem aktuellen Punkt in FormMouseUp bzw. FormMouseMove sein.

Der folgende Quelltext zeigt mir aber in FormMouseUp den Wert 0 für DeltaX und DeltaY an. Irgendwas habe ich da doch noch nicht verstanden. Bitte helft mir noch mal. Hier sind meine Änderungen.

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift Then
  begin
    Left := Left + X - StartX;
    Top := Top + Y - StartY;
  end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var P: TPoint;
begin
  StartX := X; StartY := Y;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DeltaX := X - StartX;
  DeltaY := Y - StartY;
  lbMouseX.Caption := IntToStr(DeltaX);
  lbMouseY.Caption := IntToStr(DeltaY);
end;

DeddyH 13. Sep 2009 09:31

Re: Fenster verschieben?
 
Zitat:

Zitat von DeddyH
Der Trick ist nun lediglich, das Formular so zu verschieben, dass die jetzt aktuellen Koordinaten wieder den gemerkten entsprechen.

Also muss die Differenz logischerweise 0 sein, sonst hätten wir etwas falsch gemacht ;)

Aphton 13. Sep 2009 09:57

Re: Fenster verschieben?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht hilft dir ne bildliche Darstellung des Problems bzw der Lösung!

MfG

DeddyH 13. Sep 2009 09:59

Re: Fenster verschieben?
 
:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.
Seite 4 von 5   « Erste     234 5      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz