2 Komponenten (Positionen) tauschen zur Laufzeit

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.

2 Komponenten (Positionen) tauschen zur Laufzeit

Beitragvon siro » 19. Apr 2017, 19:38 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)

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Grüße von Siro
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 188
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 20. Apr 2017, 17:22 Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

Evtl. nütz dir TCoolBand weiter.
Ich habe ein kleines Beispiel im Anhang,
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2877
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon siro » 20. Apr 2017, 21:09 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
Grüße von Siro
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 188
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 21. Apr 2017, 08:31 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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2117
Registriert: 8. Apr 2011, 08:01

Beitragvon siro » 21. Apr 2017, 17:29 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.. :roll:

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

Siro
Grüße von Siro
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 188
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 21. Apr 2017, 17:40 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. :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 2877
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 21. Apr 2017, 18:18 Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

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...
wp_xyz
 
Beiträge: 2117
Registriert: 8. Apr 2011, 08:01

Beitragvon siro » 22. Apr 2017, 14:58 Re: 2 Komponenten (Positionen) tauschen zur Laufzeit

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Grüße von Siro
"C" verCehnfacht die Entwicklungszeit...
siro
 
Beiträge: 188
Registriert: 23. Aug 2016, 13:25
Wohnort: Berlin
OS, Lazarus, FPC: Windows 7 Windows 8.1 Windows 10 | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Programmierung



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried