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:
Sie manuell die Eigenschaft Unterklasse der WM_DROPFILES
Fenster Nachricht zu verarbeiten.
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:
schreiben eine Klasse, die die IDropTarget
Schnittstelle (oder die Nutzung implementiert eine bereits bestehende Implementierung, wie beispielsweise aus Anders Melander's Drag&Drop suite).
registrieren Sie diese Klasse mit dem TListBox.Handle
Fenster mit RegisterDragDrop()
.
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.
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