2 Komponenten (Positionen) tauschen zur Laufzeit

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
siro
Beiträge: 730
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

2 Komponenten (Positionen) tauschen zur Laufzeit

Beitrag von siro »

Hallo zusammen,
ich brauche mal wieder eine Anregung, wie ich eine Aufgabe lösen kann.


Ich habe mein Kurvenfenster mit verschiedenen Skalierungen. rechts farbig dargestellt.
Jede Kurve hat seine eigene vertikale Skalierung samt Offset.
Das sind alles eigene Komponenten abgeleitet von TCustomControl und mit Anchors verbunden.
Nun möchte ich mit der Maus z.B. die dritte(grüne) Skalierung nach links vorne schieben,
wo sich momentan die rote Skalierung befindet.
Also im Prinzip zwei Komponenten von der Position her tauschen. (zur Laufzeit)

Kurven_01.jpg


Nebenbei:
Mit den Anchors funktioniert erstaunlich gut, wie ich feststellen muste,
denn wenn ich eine beliebige Skalierung unsichtbar mache (Visible:=FALSE) rücken die anderen
automatisch rechts ran, ich kann auch mehrere ausblenden, das funktioniert tadellos.
Bin echt begeistert. Man muss das Prinzip erstmal verstanden haben und sollte niemals
Align und den Anchoreditor mischen. Align sollte auf alNone bleiben wenn man den Anchoreditor benutzt,
dann läuft das einwandfrei.
Aber wie kann ich jetzt die Position zweier Komponenten (während des Programmlaufs) tauschen.

Ich vermute mal, ich muss sie irgendwie in der Anchorliste tauschen.
oder geht das evtl. auch mit Drag and Drop ?.

Freue mich über jegliche Idee:
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

Beitrag von Mathias »

Evtl. nütz dir TCoolBand weiter.
Ich habe ein kleines Beispiel im Anhang,
Dateianhänge
coolbar_test.zip
(126.46 KiB) 116-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

Beitrag von siro »

Hallo Mathias,
erst einmal vielen Dank für das Project.
Ich analysiere es grade.
So in etwa soll das funktionieren.
Ich schau mir mal die Komponenten näher an.
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

Beitrag von wp_xyz »

Probier mal die beigefügte Demo. Wenn du eines der eingefärbten Panels über ein anderes ziehst, wird es beim Loslassen vor dieses geschoben. Wenn du im Sourcecode das $DEFINE LIVE_ANZEIGE aktivierst, erfolgt die Verschiebung der Panels sogar schon während des Ziehens.

Das geht alles mit Hilfe der Standard-Drag-und-Drop-Maschinerie und ist mit ein paar Zeilen Code erledigt. Allerdings dürfen die Panels hier nicht gegenseitig verankert sein. Beim Öffnen der Verankerung, um das Panel umzusetzen, springen die Panels irgendwo hin, und ich habe gleich aufgegeben. Wahrscheinlich muss man die Anker-Kette komplett lösen und nach der Verschiebung in der neuen Reihenfolge neu aufbauen, was wahrscheinlich einiges an Geflackere bewirken wird. Zur Verankerung im Quellcode siehe http://wiki.lazarus.freepascal.org/Anchor_Sides.
Dateianhänge
Panel_DragDrop.zip
(2.26 KiB) 115-mal heruntergeladen

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

Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

Beitrag von siro »

Hallo wp_xyz,
vielen Dank für deine Tests und das Projekt.
Im Prinzip funktioniert das doch garnicht so schlecht.

Manchmal muss ich wesentlich weiter ziehen, also schon bis auf ein Feld weiter als es landen soll, damit es funktioniert.
Aber ist soweit ein guter Anhaltspunkt, hab erstmal vielen Dank.

Du schriebst: Beim Öffnen der Verankerung, um das Panel umzusetzen, springen die Panels irgendwo hin, und ich habe gleich aufgegeben.
Das Problem habe ich nicht, da springt nix rum bei mir.

Ich hab mich heute mal Stundenlang mit den Anchorts befasst und neue Erkentnisse gewonnen.
Wobei mir deine Lösung ja garnicht so schlecht erscheint.

BeginDrag(Trrue,5) hab ich mal weggenommen und dafür DragMode bei den Panels auf dmAutomatic gesetzt.
Ist aber im Prinzip egal, wobei ich dachte, dass man bei deiner Version erst 5 Pixel weit Moven muss bevor das Dragging beginnt.
Das scheint aber nicht der Fall zu sein, der Cursor ändert sich sofort auf Dragging.
Hab ich nicht wirklich verstanden.. :roll:

Ich probier da noch weiter rum, macht ja auch Spass...

Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

Beitrag von Mathias »

Ich habe mir die Drag-und-Drop - Lösung angeguckt, da muss ich mich wohl auch mal einarbeiten.
Auf den ersten Blick sieht dies recht einfach aus. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

Beitrag von wp_xyz »

siro hat geschrieben:Manchmal muss ich wesentlich weiter ziehen, also schon bis auf ein Feld weiter als es landen soll, damit es funktioniert.

Ja, so ist es gedacht. Du musst mindestens bis auf ein Nachbarfeld ziehen, bis sich beim Loslassen der Maus etwas ändert. Du kannst das natürlich beliebig ändern.

Man könnte auch, statt wie in meiner LIVE_ANSICHT die Panels gleich umzusetzen, eine dicke Markierungslinie an die Stelle zeichnen, an der das Panel eingefügt werden soll.

siro hat geschrieben:BeginDrag(Trrue,5) hab ich mal weggenommen und dafür DragMode bei den Panels auf dmAutomatic gesetzt.
Ist aber im Prinzip egal, wobei ich dachte, dass man bei deiner Version erst 5 Pixel weit Moven muss bevor das Dragging beginnt.

Richtig, im Prinzip muss man ja sogar bis in das Nachbar-Panel hineinziehen, bis das Dragging hier wirklich etwas am Erscheinungsbild ändert. Ich bin das Vorgehen so gewöhnt von anderen Drag & Drop-Anwendungsfällen, wo der sofortige Beginn des Drag & Drop massiv stört.

Ja, versuch mal, das auch mit verankerten Panels hinzukriegen, ich habe hier massiven Lernbedarf...

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

Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

Beitrag von siro »

Nach viel probieren und forschen habe ich das Prinzip der Verankeungen anscheinend verstanden :roll: glaube ich....

Ich habe mal ein Projekt erstellt, was lediglich 3 Panels horizontal verankert, ohne den Objekt oder Anker Editor, sondern mittels Code.
Hier wird zum Verständnis erstmal mit Tasten getauscht.
Mit dieser Grundlage sollte es nun möglich sein, meine Komponenten zu tauschen.

Siro

Anchors_Siro.zip
(127.65 KiB) 110-mal heruntergeladen
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Antworten