AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TreeView Drag&Drop wahlweise als Kind einfügen
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView Drag&Drop wahlweise als Kind einfügen

Ein Thema von Sherlock · begonnen am 19. Aug 2014 · letzter Beitrag vom 21. Aug 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#1

TreeView Drag&Drop wahlweise als Kind einfügen

  Alt 19. Aug 2014, 15:02
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 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 naInsert und dem "neuen" 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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#2

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

  Alt 19. Aug 2014, 16:12
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 20. Aug 2014, 13:46
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#4

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

  Alt 20. Aug 2014, 14:08
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.
Ralph

Geändert von Jumpy (20. Aug 2014 um 14:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 20. Aug 2014, 14:13
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.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 20. Aug 2014, 14:16
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (20. Aug 2014 um 14:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 20. Aug 2014, 15:17
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 crDrag Scheint, als würde das Accept den Cursor bestimmen und sonst nichts . Insofern dürfte MouseMove auch nicht wirklich etwas bringen. Grml...

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

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

  Alt 20. Aug 2014, 15:38
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.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

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

  Alt 20. Aug 2014, 22:25
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)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#10

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

  Alt 21. Aug 2014, 09:21
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
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:13 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