Delphi-PRAXiS
Seite 1 von 2  1 2      

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 TreeView Drag&Drop wahlweise als Kind einfügen (https://www.delphipraxis.net/181482-treeview-drag-drop-wahlweise-als-kind-einfuegen.html)

Sherlock 19. Aug 2014 14:02

TreeView Drag&Drop wahlweise als Kind einfügen
 
Hidiho,

ich hab da eine klassische TTreeView, die eine nutzerdefinierbare Hierarchie wiedergibt bzw. deren Änderung ermöglicht. Drag&Drop funktioniert zur Zeit gut. Im Drop geschieht im Kern das klassische
Delphi-Quellcode:
src.MoveTo(dest, naInsert);
. Falls man eine neue Hierarchieebene wünscht, muss man sich derzeit mit einem angehängten Kontextmenü behelfen und einen Untereintrag erzeugen, auf den man dann wiederum den eigentlich in die Ebene zu verschiebenden Eintrag fallen lassen kann.
Ich würde das gerne ändern. Es gibt da eine handvoll Useability- und Entwicklungsfragen, die zu klären sind :)
  • Wie ermögliche ich dem Anwender zwischen dem bisherigen
    Delphi-Quellcode:
    naInsert
    und dem "neuen"
    Delphi-Quellcode:
    naAddChild
    zu unterscheiden? Ctrl+Drag? Oder Timer im DragOver (was ich derzeit erfolgreich getestet habe)
  • Wie stelle ich diese Unterscheidung, im Baum dar? Irgendwie sollte der künftige Vorfahr-Knoten seine "Erwartung" anzeigen. Für naInsert reicht das Standardverhalten, um zu zeigen, "vor mir wird das verschobene Ding landen". Aber wie signalisiere ich das "als mein Kind wird das verschobene Ding landen"? Mir will da gerade gar nichts einfallen...
Hat einer von Euch da eine Idee, oder sowas bereits umgesetzt?

Sherlock

Jumpy 19. Aug 2014 15:12

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Hallo,

wir haben das seinerzeit glaub ich so gemacht, dass wenn man ein Item auf ein anderes Droped, so wird es als Child eingefügt und wenn man es auf Höhe eines Items ins leere daneben dropt, so wird es als "Geschwisterchen" an der neuen Position eingefügt.

Ich meine mit einem eigenen Cursor der sich je nachdem ändert wurde der Unterschied signalisiert, aber für genauere Info muss ich erst mal nachgucken, geht aber leider erst morgen, da ich gerade unterwegs bin.

Sherlock 20. Aug 2014 12:46

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Hat nicht noch jemand eine Idee? Cursor hört sich ja für die Darstellung nicht schlecht an, ich müsste mal schauen ob ich was hübsches finde. Ich bin noch auf eine dritte Möglichkeit gestoßen, daß Verhalten an sich zu implementieren, in dem man mit Delphi-Referenz durchsuchenGetHitTestInfoAt auf htOnItem, htOnIndent oder htOnRight prüft. Das finde ich aber etwas zu fummelig, habe Grobmotoriker (Mediziner) als Kunden.

Sherlock

Jumpy 20. Aug 2014 13:08

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Zitat:

Zitat von Sherlock (Beitrag 1269239)
Ich bin noch auf eine dritte Möglichkeit gestoßen, daß Verhalten an sich zu implementieren, in dem man mit Delphi-Referenz durchsuchenGetHitTestInfoAt auf htOnItem, htOnIndent oder htOnRight prüft. Das finde ich aber etwas zu fummelig, habe Grobmotoriker (Mediziner) als Kunden.
Sherlock

Das ist genau das was ich meinte.

Das Problem was ich mit dem CTRL-Taste gedrückt halten habe, ist das ich es mit Kopieren verbinde, d.h. das dragged child / node wird nicht an die neue Position gezogen, sondern es wird eine Kopie des childs erzeugt und an der gewünschten Stelle eingefügt.
Dieses Verhalten haben wir so (neben dem oben genannten) schon einmal in einem TreeView verwendet und es ist mMn das, was man von "überall" her sonst beim Drag & Drop gewohnt ist, sei es eine Zelle in Excel, eine Datei im Explorer, ...

Die Timer und Warten Geschichte die du oben erwähnt hast verstehe ich so: du verweilst auf einem Node, dieser klappt auf und du kannst den gedraggten Node an der richtigen Position in den ChildNodes des gerade geöffneten Nodes einfügen. Falls dem so ist, sehe ich neben der Wartzezeit das Problem dann, wenn der Node auf den du draggst noch keine Childnodes hat und nicht aufklappen kann.

Sherlock 20. Aug 2014 13:13

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Ich finde ja das Verhalten des (Datei)Explorers ganz schön, wenn man eine Datei auf einen Ordner zieht, der Unterordner hat, wird der nach einer kurzen Zeit aufgeklappt, damit man dort aussuchen kann.
Aber ich versuche zusammen mit aussagekräftigen Cursorn mal die Variante mit den HitTests. Mal schauen wie sich das anfühlt. Danke, Jumpy.

Das mit dem Timer hast du genau richtig verstanden, und mein Problem dabei auch erkannt. :D

Sherlock

himitsu 20. Aug 2014 13:16

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Zitat:

Das Problem was ich mit dem CTRL-Taste gedrückt halten habe, ist das ich es mit Kopieren verbinde
Ich nicht, bzw. er könnte ja Shift verwenden.

D&D + Strg = immer kopieren
D&D + Shift = immer verschieben
D&D + Strg + Shift = immer verlinken

immer ... ohne Strg/Shift wird ein Standardverhalten verwendet, aus den obrigen Optionen, welches kontextabhängig sein kann (siehe Exploerer und Verschieben innerhalb einer Partition oder in eine Andere)

Sherlock 20. Aug 2014 14:17

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Also ich könnte mich mit der HitTest-Methode anfreunden, wenn ich das mit den Cursorn hinbekäme. Kurzer Denkanstoß, bitte. Ich dachte OnDragOver wäre das Richtige Event, um den Cursor abhängig vom HitTest zu setzen, aber er bleibt immer
Delphi-Quellcode:
crDrag
:stupid: Scheint, als würde das
Delphi-Quellcode:
Accept
den Cursor bestimmen und sonst nichts :(. Insofern dürfte
Delphi-Quellcode:
MouseMove
auch nicht wirklich etwas bringen. Grml...

Sherlock

Dejan Vu 20. Aug 2014 14:38

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Imitiere doch das Verhalten des Explorers, d.h. Du rufst von dem Knoten der als Vater-kandidat fürs droppen in Frage kommt (GetHitTestInfoAt) dann einfach 'Expand' auf. Und wenn der noch keine Kinder hat, dann fügst Du an dem Knoten, nach einer kurzen Wartezeit einen Dummyeintrag ein und rufst Dann Expand auf. Der Dummyeintrag sieht so aus wie das, was Du da droppen willst... Wenn der Cursor dann weiter bewegt wird, schmeisst Du den Dummyeintrag wieder raus. und rufst für den Knoten, denn Du im Rahmen der Drag-Operation ein Expand aufrufen musstest, eben wieder collapse auf. Das ist zwar Wurschtelkram mit listen ('expanded', 'dummyEntries'), die man pflegen muss, aber es sollte funktionieren. Kann höchstens sein, das das schrottig aussieht.

Aviator 20. Aug 2014 21:25

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Oder einfach den VirtualTreeView benutzen. Der bringt schon sehr viele Funktionen von Haus aus mit und man kann trotzdem noch alles steuern/verbieten oder sonstwas. Noch dazu unterstützt er OLE Drag&Drop und normales VCL Drag&Drop. Und den Aufklappmechanismus hat der Tree meines Wissens nach auch. (Kann man glaube ich sogar einstellen, wie der reagieren soll)

Jumpy 21. Aug 2014 08:21

AW: TreeView Drag&Drop wahlweise als Kind einfügen
 
Bzgl. Cursor bei Drag & Drop hab ich mich seinerzeit hier schlau gemacht. Vielleicht hilft dir das Kapitel über "Customising the Drag Cursor" ja weiter:

http://www.blong.com/Conferences/Bor...stomComponents


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 Uhr.
Seite 1 von 2  1 2      

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