Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Designer Programmierung, Felder verschieben (https://www.delphipraxis.net/135718-designer-programmierung-felder-verschieben.html)

Freiwilderer 16. Jun 2009 15:48


Designer Programmierung, Felder verschieben
 
Hi
und zwar schreibe ich momentan einen einfachen Designer für Masken.
Man wird TLables, TMaskEdits und TCheckboxes anglegen können (das funktioniert auch schon).
Außerdem kann man die Felder per positionsangaben an fixe stellen auf der Maske verschieben und morgen werde ich noch das Verschieben mit Strg+Pfeiltasten umsetzen.
Was auch schon geht, allerdings nicht so, wie ich es gerne hätte, und da kommen wir zu meiner eigentlichen Frage ist das verschieben per Drag and Drop, also per Maus.

über diese netten Zeilen kann ich die Felder nach belieben verschieben:
Delphi-Quellcode:
procedure TfrmMain.Felderverschieben(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   if (Button = mbLeft) and (MaskDesign = True)then
    begin
     ReleaseCapture;
     TControl(Sender).Perform(wm_SysCommand, sc_Size or 1, 0);
    end;
end;
Felderverschieben ist dabei einfach die Procedure, die ich den während der Laufzeit zugeordneten Feldern unter MouseDown zuordne.

Da das so allerdings realtiv unsauber ist, das ich die Felder pixelweise verschieben kann, würde ich gerne eine Art Raster festlegen können.
Das heißt ich drücke auf einen knopf, um das Raster zu aktivieren und fortan kann ich die felder nur noch in 5-pixel schritten verschieben.

hat jemand ne idee, wie man das umsetzen könnte ? gibt es vielleicht sogar einen Parameter, den ich der wm_SysCommand funktion zuordnen kann ?

würde mich über anregungen und lösungsvorschläge sehr freuen,

mit freundlichen Grüßen

Freiwilderer

markus5766h 16. Jun 2009 16:21

Re: Designer Programmierung, Felder verschieben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ob Du die Raster-Parameter an Sys-Command übergeben kannst, weiß ich nicht,
ich habe mir für so etwas ein array von TPoint angelegt und die Positionen
eines (virtuellen) Rasters gespeichert.
Beim loslassen der gezogenen Elemente habe ich dann per Schleifen den
nächstgelegenen TPoint gesucht (z.B. mit einer Toleranz von 2 Pixeln, wenn
das Raster 8 Pixel beträgt) und lasse dann das Element am TPoint "einrasten".
Ist vielleicht nicht die beste Lösung, aber funktioniert.

Hab' mal 'ne Unit als Beispiel angehangen, im Ereignis > W2MouseUp(.....
wird ein Spielstein an einer Spielfläche "eingerastet".

Freiwilderer 16. Jun 2009 18:53

Re: Designer Programmierung, Felder verschieben
 
hi,
das mit dem einrasten hab ich kurz vor feierabend auch noch gemacht ... aber das gefällt mir persönlich gar nicht ...
am liebsten wärs mir, wenn das feld während des bewegens schon über das raster "springen" würde

trotzdem vielen Dank für deinen Lösungsansatz

mfg

Freiwilderer 18. Jun 2009 09:30

Re: Designer Programmierung, Felder verschieben
 
hi,
also ich habs jetzt anders gelöst, is allerdings etwas umständlicher
im prinzip setze ich den Mauszeiger beim Klicken in das zu verschiebene Feld in die Mitte des Feldes.
(MouseDown)
dann speichere ich die Position des cursers in eine TPoint variable.

im onMouseMove frage ich dann in 4 if Abfragen ab, ob die aktuelle curser position mehr als 5 pixel von der gespeicherten entfernt ist (natürlich für x und y einzeln), setzte dann das feld 5 pixel in die eine oder andere richtung und setze auch den TPoint wert auf die neue koordinate.
Das funktioniert nun genau so, wie ich mir das vorgestellt hatte :)

falls jemand den quellcode haben will, bitte mail an freiwilderer@gmx.de ... das is zu kompliziert zum posten hier und ich weiß, wie ärgerlich es ist, wenn man zwar ein thema findet, welches zum eigenen problem passt, aber keine lösung drin steht, sondern nur, jetzt läufts ;D

mfg

hoika 18. Jun 2009 09:58

Re: Designer Programmierung, Felder verschieben
 
Hallo,

also ich habe folgendes benutzt,
um ein Form zu verschieben.

Delphi-Quellcode:
procedure TForm_About.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Perform(WM_SYSCOMMAND, SC_MOVE + 1, 2);
end;
Wie das mit Raster gehen soll, wüsste ich jetzt aber auch nicht ... ;)


Heiko

Freiwilderer 18. Jun 2009 10:43

Re: Designer Programmierung, Felder verschieben
 
hi
wie gesagt, das verschieben war ja nich das problem ;)
mit der funktion, wie du sie beschrieben hast, hatte ich es am anfang umgesetzt, aber finde das mit dem raster schon schöner, habe jetzt einen schalter eingebaut, mit dem man das raster an und abschalten kann, für die feinjustierung kann man mit STRG + Pfeiltasten die Positionen pixelweise verändern, mit shift + pfeiltasten die größe. im grunde genau so, wie in delphi selbst, nur, dass man in delphi das raster glaub ich nich abschalten kann ;D

bis dann

mfg


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr.

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