2017-01-18 4 views
2

Ist es möglich, Knoten von TVirtualStringTree in ein VCL-Steuerelement zu ziehen, wenn die DragType auf dtOLE gesetzt ist (nicht dtVCL)Wie Drag & Drop von Knoten aus TVirtualStringTree in ein VCL-Steuerelement mit DragType dtOLE?

Ich habe eine Situation, wo ich brauche Knoten zu ziehen von einem VT zu einem anderen VT in der Lage sein (dtOLE funktioniert gut), aber gleichzeitig, während des Ziehens, brauche ich eine Option, die Knoten in eine TListBox (oder andere VCL-Steuerelement) fallen lassen können.

Ich versuchte Einstellung DragAcceptFiles() API für die TListBox Griff, aber es hatte keine Wirkung.

Wie kann es gemacht werden?

Antwort

3

Es gibt keine DragAcceptFiles Eigenschaft auf TListBox. Wenn Sie meinen, dass Sie die Win32-API-Funktion DragAcceptFiles() auf dem TListBox.Handle Fenster aufrufen, würde das nur funktionieren, wenn:

  1. Sie manuell die Eigenschaft Unterklasse der WM_DROPFILES Fenster Nachricht zu verarbeiten.

  2. TVirtualStringTree bietet das CF_HDROP Format während OLE ziehen.

2 ist jedoch nicht wahr. CF_HDROP ist nur zum Ziehen von Dateisystempfaden gedacht, was nicht TVirtualStringTree ist. Also mit DragAcceptFiles() ist out.

TVirtualStringTree (und andere TBaseVirtualTree Nachkomme) verwendet benutzerdefinierte Datenformate während OLE zieht (der Schnittstellenbereich der VirtualTrees.pas Einheit dieses Format-IDs erklärt, so dass Sie sie nicht manuell in Ihrem eigenen Code müssen registrieren):

  • CF_VIRTUALTREE enthält eine IStream oder HGLOBAL, die eine serialisierte Form der ausgewählten Baumknoten enthält, die gezogen werden. Die Serialisierung besteht aus einer Reihe von Datenabschnitten, die jeden Knoten beschreiben. Sie müssen sich auf die Implementierung der VirtualTree.pas Einheit beziehen, um dieses Format zu entschlüsseln (ich werde es hier nicht tun).

  • CF_VTREFERENCE enthält ein HGLOBAL Halten eines TVTReference Datensatz enthält einen Zeiger auf die tatsächlichen TBaseVirtualTree Objekt (das auch in den Schnittstellenabschnitt des VirtualTrees.pas Einheit erklärt wird), die von und die ID des Prozesses gezogen wird, dass der Baum gehört zu.

um Also, für Sie in der Lage sein Baumknoten auf den TListBox fallen, werden Sie folgendes tun:

  1. schreiben eine Klasse, die die IDropTarget Schnittstelle (oder die Nutzung implementiert eine bereits bestehende Implementierung, wie beispielsweise aus Anders Melander's Drag&Drop suite).

  2. registrieren Sie diese Klasse mit dem TListBox.Handle Fenster mit RegisterDragDrop().

  3. in Ihrer IDropTarget Implementierung können Sie die IDataObject für die CF_VIRTUALTREE und CF_VTREFERENCE Formaten zur Verfügung gestellt abfragen. Bei Erfolg hat Ihre Methode Drop() Zugriff auf die Daten des Baumknotens, die gezogen werden, und kann sie bei Bedarf in die Datei TListBox kopieren.

Angenommen, Ihre TListBox im gleichen Prozess besteht, wie die TVirtualStringTree aus gezogen wird, würde ich nur CF_VTREFERENCE empfehle die Konzentration auf, da es ein sehr kleines und einfach-Format (siehe die Umsetzung der TBaseVirtualTree.GetTreeFromDataObject()-Methode), und Analysieren der CF_VIRTUALTREE Daten wäre Overkill (siehe die Implementierung der TBaseVirtualTree.ProcessOLEData() Methode), wenn Sie nur direkt über die Quelle TVirtualStringTree aufzählen können.

+0

Ich bezog mich auf DragAcceptFiles() API. Ich erkannte später, dass es Unsinn war. Auf jeden Fall hat mir deine Antwort sehr geholfen. Vielen Dank! Ich habe 'CF_VTREFERENCE' verwendet und die Knotenauswahl mit' VT.GetSortedSelection' getroffen – zig