gelöst: Form verschieben

Für Fragen von Einsteigern und Programmieranfängern...
Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

gelöst: Form verschieben

Beitrag von Bauer321 »

Ich möchte die beiden einstellungen Form.Top und Form.Left exakt im selben moment ändern. ist das möglich?

edit: post umbenannt in "Form verschieben" am 3.3.11 um 22:54
Zuletzt geändert von Bauer321 am So 6. Mär 2011, 17:45, insgesamt 3-mal geändert.
www.mcpatcher.net | www.hoeper.me

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: 2 Sachen gleichzeitig machen

Beitrag von theo »

Ich weiss zwar mal wieder nicht wie du das genau meinst, aber mit SetBounds geht sowas in einem Kommando.

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2 Sachen gleichzeitig machen

Beitrag von Bauer321 »

hmm...

habe ich anscheinend die fehlerursache doch nicht richtig erkannt ich möchte, das meine fenster ohne rand wenn man auf es klickt und gedrückt hält verschoben werden kann.
jedoch wackelt dieses dann immer so komisch hin und her woran liegt das?
Arrays.exe
Mein kleines Programm bei dem ich das gerade ausprobiere, das mussten wir in der Schule machen ist es aber einfach immer nen bisschen langweilig... also einfach mal die sonstigen Funktionen ignorieren xD
(1.71 MiB) 60-mal heruntergeladen

Da einfach mal zum test auf die FOrm klicken, gedrückt halten und den Zeiger ein wenig bewegen und dann fällt auf das die Form immer hin und her hüpft was mir nicht so gefällt.
www.mcpatcher.net | www.hoeper.me

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: 2 Sachen gleichzeitig machen

Beitrag von Socke »

Vielleicht hättest du besser den entsprechenden Quellcode zur Verfügung gestellt. Die Dateien, die mir mein Archivierungsprogramm bei deiner Dateianbietet sind nämlich keine Text-Dateien... :D
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2 Sachen gleichzeitig machen

Beitrag von Bauer321 »

das sollte ja auch nur zur veranschaukichung des fehlers sein ;)

also ich verwende das mousedown, das mouseup ereignis und einen timer, welcher bei mousedown gestratet bzw bei mouseup beendet wird.

der Timer hat das intervall 100 und führt diesen code aus:

Code: Alles auswählen

//timerformpostion = ein Timer
//z = TPoint
 
//das man evtl ja gut nen timer nehmen kann hab ich mir einfach so ausgedacht^^ 
procedure TFMain.timerformpostionTimer(Sender: TObject);
begin
//ScreenToClient(Point(Mouse.CursorPos.X,Mouse.CursorPos.Y)) hab ich hier im Forum gefunden
  z := ScreenToClient(Point(Mouse.CursorPos.X,Mouse.CursorPos.Y));
 
//Hier war vorher FMain.Top := z.x, FMain.Left := z.y;
//habe ich aber siehe oben durch SetBounds erstzt da ich vemutet hatte das der fehler durch den zeitunterschied entsteht was aber leider nciht der fall war
  FMain.SetBounds(z.x,z.y,FMain.Width,FMain.Height);
end;
 
//zur ergänzung hier der rest
//das hab ich mir auch einfach so überlegt^^
procedure TFMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  timerformpostion.enabled := true;
end;
 
procedure TFMain.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  timerformpostion.enabled := false;
end;



das geht ja auch alles nur ist es sehr unschön das die Form immer so hin und her "springt"
www.mcpatcher.net | www.hoeper.me

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: 2 Sachen gleichzeitig machen

Beitrag von felix96 »

TThread
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: 2 Sachen gleichzeitig machen

Beitrag von Bauer321 »

felix96 hat geschrieben:TThread

nach den ergebnissen weiter oben denke ich eher das ich das nicht brauchen werde
www.mcpatcher.net | www.hoeper.me

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Form verschieben

Beitrag von Socke »

Wärs nicht einfach im MouseMove die Differenz zur letzten Mausposition zu berechnen?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Form verschieben

Beitrag von Bauer321 »

und wie soll man dann das fenster nach oben links bekommen?
edit: hast recht müsste auch gehen kann ich ja morgen sonst auch nochmal ausprobieren...

die positionen werden ja alle richtig "übernommen" nur irgendwie wird entwerder der eine oder der andere wert versetzt übernommen

edit: ich hab gerade mal nen kleinen test gemacht und der hat ergeben das ich die korrdinaten anscheinend flasch bestimme

ich habe einfach mal an einer stelle gehalten und das ganze in ein memo protokollieren lassen dabei kam folgendes raus:

Code: Alles auswählen

x    |  y
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
633 | 249
422 | 694
...usw


außerdem habe ich hier eine kleine änderung vorgenommen:

Code: Alles auswählen

//xc und yc geben die position der maus auf der form an(das ist ja dann ab der oberen ecke)
procedure TFMain.timerformpostionTimer(Sender: TObject);
begin
  z := ScreenToClient(Point(Mouse.CursorPos.X,Mouse.CursorPos.Y));
  FMain.SetBounds((z.x+xc),(z.y+yc),FMain.Width,FMain.Height);
  mevent.lines.add(inttostr(z.x+xc)+' | '+inttostr(z.y+yc));
end;

(ich hatte vorher vergessen einzuberechnen das man ja irgendwo auf der form klicken kann)
Zuletzt geändert von Bauer321 am Do 3. Mär 2011, 23:34, insgesamt 1-mal geändert.
www.mcpatcher.net | www.hoeper.me

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Form verschieben

Beitrag von Socke »

Bauer321 hat geschrieben:und wie soll man dann das fenster nach oben links bekommen?

Das ist dann kein programmiertechnisches sondern ein rein mathematisches Problem. Nimm dir mal ein großes und ein kleineres Stück Papier (analog, nicht digital) und verschiebe das Kleinere auf dem Größeren und früher oder später wirst du erkennen, dass es egal ist, ob du die linke obere oder die rechte untere Ecke verschiebst. Es kommt nur auf den Betrag an, um den du verschiebst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Form verschieben

Beitrag von Bauer321 »

Socke hat geschrieben:
Bauer321 hat geschrieben:und wie soll man dann das fenster nach oben links bekommen?

Das ist dann kein programmiertechnisches sondern ein rein mathematisches Problem. Nimm dir mal ein großes und ein kleineres Stück Papier (analog, nicht digital) und verschiebe das Kleinere auf dem Größeren und früher oder später wirst du erkennen, dass es egal ist, ob du die linke obere oder die rechte untere Ecke verschiebst. Es kommt nur auf den Betrag an, um den du verschiebst.


ist mir eben dann auch aufgefallen... hatte nen kleinen denkfehler drinne^^
www.mcpatcher.net | www.hoeper.me

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Form verschieben

Beitrag von MAC »

ich mach das immer volgendermaßen:
Beim OnMouseDown speichere ich mir die aktuelle Position der maus. (altesx := x,altesy := y)
Beim OnMouseMove mach ich dann
Form1.Left := Form1.Left + x - altesx;

Das klappt bei mir ohne diese großen Sprünge...

Code: Alles auswählen

Signatur := nil;

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Form verschieben

Beitrag von Bauer321 »

hab das mal ausprobiert, aber das geht bei mir auch nicht:

Code: Alles auswählen

procedure TFMain.FormCreate(Sender: TObject);
begin
  xc := -1;
  yc := -1;
end;
 
procedure TFMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  xc := x;
  yc := y;
  label4.caption := (inttostr(xc) + ' | ' + inttostr(yc));
end;
 
procedure TFMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (xc > -1) and (yc > -1)
  then begin
    FMain.Top := FMain.Top+x-xc;
    FMain.Left := FMain.Left+y-yc;
    mevent.lines.add(inttostr(FMain.Top+x-xc)+' | '+inttostr(FMain.Left+y-yc));
  end;
end;
www.mcpatcher.net | www.hoeper.me

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: Form verschieben

Beitrag von felix96 »

Muss es nicht OnMouseUp sein?
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Form verschieben

Beitrag von Bauer321 »

ne das soll ja nur gehen wenn man die maustaste gedrückt hält

also bei mousedown anfangen und bei mouseup aufhören
www.mcpatcher.net | www.hoeper.me

Antworten