![]() |
Re: Fenster verschieben?
Hallo an alle,
[OT] ...schon 2 Seiten Antworten und Diskussion aber der TE hat sich noch noch nicht dazu geäußert bzw. (für mein Verständnis) klar ausgedrückt. :gruebel: ...Beiträge die keinem wirklich weiterhelfen :( [/OT] |
Re: Fenster verschieben?
Hallo,
Danke zuerst mal für Eure zahlreichen Atworten und Anregungen. Ich habe jetzt die folgende Lösung, da wir die Berechnung ohne Windows API selber machen sollen:
Delphi-Quellcode:
Wie aber erkenne ich da die Bewegungsrichtung der Maus? Wenn ich die nach links bewege und die linke Maustaste gedrückt halte, soll sich ja das Fenster nach links bwewegen, wenn Maus nach rechts bewegt wird, entsprechend nach rechts, analog wenn hoch oder tief.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) lblmouseX: TLabel; //Erkärung welcher Wert lblmouseY: TLabel; //Erkärung welcher Wert lblwidth: TLabel; //Erkärung welcher Wert lbltop: TLabel; //Erkärung welcher Wert lblleft: TLabel; //Erkärung welcher Wert lblheight: TLabel; //Erkärung welcher Wert lbMouseX: TLabel; //Darstellung des Wertes lbMouseY: TLabel; //Darstellung des Wertes lbLeft: TLabel; //Darstellung des Wertes lbHeight: TLabel; //Darstellung des Wertes lbWidth: TLabel; //Darstellung des Wertes lbTop: TLabel; //Darstellung des Wertes procedure FormCreate(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } DeltaX,DeltaY: Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin lbLeft.Caption := IntToStr(Left); lbTop.Caption := IntToStr(Top); lbWidth.Caption := IntToStr(Width); lbHeight.Caption := IntToStr(Height); end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin LbMouseX.Caption := IntToStr(X); LbMouseY.Caption := IntToStr(Y); DeltaX := X - Left; //Differenz linke obere Ecke und DeltaY := Y - Top; //Mausposition end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ssLeft in Shift Then begin MouseX := X; MouseY := Y; DeltaX := MouseX - Left; DeltaY := MouseY - Top; end; end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Left := Left - DeltaX; Top := Top - DeltaY; lbLeft.Caption := IntToStr(Left); lbTop.Caption := IntToStr(Top); end; end. |
Re: Fenster verschieben?
Die musst Du gar nicht erkennen ;). Ganz kurzes Rechenbeispiel, gegeben sei eine gemerkte Koordinate X mit Wert 100.
Mausbewegung nach rechts -> X(101) - gemerktes X(100) = 1, d.h. Left um 1 erhöhen Mausbewegung nach links -> X(99) - gemerktes X(100) = -1, d.h. Left um -1 erhöhen (also de facto um 1 verringern) Dasselbe gilt natürlich analog für die Y-Koordinate. [edit] Schlechtschreibung :oops: [/OT] |
Re: Fenster verschieben?
@DualCoreCPU:
Speichere einfach die X, Y Werte der Maus sobald geklickt wurde und setze eine Boolean Variable auf true Sobald die Maus bewegt wird, prüfst du deine Boolean Variable auf True und - ist die Bedingung erfüllt - setzt die die neue Left/Top Werte der Form - dies machst du am besten, wenn du der alten Left / Top Position die Differenz zwischen der >jetztigen< X / Y Werte und Anfangs X / Y Werte hinzuaddierst! Wird die Maus wieder losgelassen, setzt du natürlich die Boolean Variable auf False MfG |
Re: Fenster verschieben?
Wozu die Boolean-Variable?
|
Re: Fenster verschieben?
ok ist nicht zwingend notwendig (hab das mit TShiftState nicht bedacht);
danke fürs Darauf-hinweisen MfG |
Re: Fenster verschieben?
Hallo!
Ich habe jetzt das MouseUp Ereignis so geändert:
Delphi-Quellcode:
Die Werte MouseX, MouseY sind die aktuellen Muskoordinaten. Hier werden nun Left und Top immer erhöht, auch wenn ich die Maus nach oben bzw. links bewege.
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin Left := Left + MouseX + DeltaX; Top := Top + MouseY + DeltaY; lbLeft.Caption := IntToStr(Left); lbTop.Caption := IntToStr(Top); end; Wenn ich DeltaX, DeltaY hinzu addiere, stimmt die Verschiebungsrichtung nicht bei jeder Mausposition. Außerdem ist der Betrag von DeltaX,DeltaY größer als 1. Intuitiv sage ich, das ich ein Vorzeichen für MouseX,MouseY brauche. In FormMouseDown merke ich mir die Mausposition in MouseX, MouseY. Aber wie dann weiter? @DeddyH: Nach Deiner ANregung brauche ich noch ein DeltaX, DeltaY mit Vorzeichen. Wieso sollte ich da die Richtungserkennung nicht benötigen? Da brauch ich ja irgendwo einen Vergleich der Mausposition mit der vorherigen. Aber wie stelle ich das an? |
Re: Fenster verschieben?
Noch einmal ganz in Ruhe: im OnMouseDown merkst Du Dir DeltaX und DeltaY. Im OnMouseMove addierst Du nun zum Form.Left einfach die Differenz aus aktueller X-Koordinate und DeltaX und zu Form.Top die Differenz aus aktueller Y-Koordinate und DeltaY. Wenn diese Differenz positiv ist, verschiebt sich das Formular somit automatisch nach rechts bzw. unten, bei negativer Differenz nach links bzw. oben, denn z.B. 100 + -10 => 100 - 10 = 90 :zwinker:
|
Re: Fenster verschieben?
Hallo!
Habe es jetzt so gelöst: Danke noch mal allen, die mir hier helfen!!!
Delphi-Quellcode:
Jetzt ist aber der Betrag meiner Verschiebung zu groß gegenüber meiner Mausbewegung.
unit movewin;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) lblmouseX: TLabel; lblmouseY: TLabel; lblwidth: TLabel; lbltop: TLabel; lblleft: TLabel; lblheight: TLabel; lbMouseX: TLabel; lbMouseY: TLabel; lbLeft: TLabel; lbHeight: TLabel; lbWidth: TLabel; lbTop: TLabel; procedure FormCreate(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private-Deklarationen } DeltaX,DeltaY: Integer; MouseX,MouseY: Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin lbLeft.Caption := IntToStr(Left); lbTop.Caption := IntToStr(Top); lbWidth.Caption := IntToStr(Width); lbHeight.Caption := IntToStr(Height); end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin LbMouseX.Caption := IntToStr(X); LbMouseY.Caption := IntToStr(Y); DeltaX := X - Left; DeltaY := Y - Top; end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ssLeft in Shift Then begin DeltaX := X - Left; DeltaY := Y - Left; MouseX := X; MouseY := Y; (* DeltaX := MouseX - Left; // ---- so hatte ich vorher DeltaX DeltaY := MouseY - Top; // ---- und DeltaY berechnet. *) end; end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Left := Left + DeltaX; Top := Top + DeltaY; lbLeft.Caption := IntToStr(Left); lbTop.Caption := IntToStr(Top); end; end. |
Re: Fenster verschieben?
Du machst ja auch zuviel des Guten ;)
Delphi-Quellcode:
Das genügt. Du darfst bei dem Ganzen nicht übersehen, dass X und Y relativ zum Formular angegeben werden und nicht relativ zum Bildschirm.
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin DeltaX := X; DeltaY := Y; end; 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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 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