2 Komponenten (Positionen) tauschen zur Laufzeit
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
2 Komponenten (Positionen) tauschen zur Laufzeit
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)
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
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)
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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 6906
- 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
Evtl. nütz dir TCoolBand weiter.
Ich habe ein kleines Beispiel im Anhang,
Ich habe ein kleines Beispiel im Anhang,
- Dateianhänge
-
coolbar_test.zip
- (126.46 KiB) 134-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: 2 Komponenten (Positionen) tauschen zur Laufzeit
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
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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: 2 Komponenten (Positionen) tauschen zur Laufzeit
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.
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) 134-mal heruntergeladen
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: 2 Komponenten (Positionen) tauschen zur Laufzeit
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..
Ich probier da noch weiter rum, macht ja auch Spass...
Siro
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..

Ich probier da noch weiter rum, macht ja auch Spass...
Siro
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 6906
- 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
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.
Auf den ersten Blick sieht dies recht einfach aus.

Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: 2 Komponenten (Positionen) tauschen zur Laufzeit
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.siro hat geschrieben:Manchmal muss ich wesentlich weiter ziehen, also schon bis auf ein Feld weiter als es landen soll, damit es funktioniert.
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.
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.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.
Ja, versuch mal, das auch mit verankerten Panels hinzukriegen, ich habe hier massiven Lernbedarf...
-
- Beiträge: 758
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: 2 Komponenten (Positionen) tauschen zur Laufzeit
Nach viel probieren und forschen habe ich das Prinzip der Verankeungen anscheinend verstanden
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

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
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...