TListBox
にはDragAcceptFiles
という特性がありません。手動WM_DROPFILES
ウィンドウメッセージを処理するためプロパティをサブクラス
:あなたがいる場合にのみ動作しますTListBox.Handle
窓、上のWin32 API DragAcceptFiles()
関数を呼び出していることを意味します。
TVirtualStringTree
は、OLEドラッグ中にCF_HDROP
形式を提供します。
2は真ではありません。 CF_HDROP
は、ファイルシステムのパスをドラッグするためのもので、TVirtualStringTree
がドラッグするものではありません。だからDragAcceptFiles()
を使用しています。 (あなたがあなた自身のコード内で手動で登録する必要はありませんので、VirtualTrees.pas
ユニットのインターフェース部は、これらのフォーマットIDを宣言する)
TVirtualStringTree
(および他のTBaseVirtualTree
の子孫)は、ドラッグOLE中にカスタムデータ形式を使用しています。
CF_VIRTUALTREE
には、選択されたツリーノードがドラッグされているシリアル化された形式を保持するIStream
またはHGLOBAL
が含まれています。シリアライゼーションは、各ノードを記述する一連のデータチャンクで構成されます。このフォーマットを解読するには、VirtualTree.pas
ユニットの実装を参照する必要があります(私はここでそれを行うつもりはありません)。
CF_VTREFERENCE
からドラッグされている実際のTBaseVirtualTree
オブジェクトへのポインタとツリーが属するプロセスのIDを含む(またVirtualTrees.pas
ユニットのインターフェース部で宣言されている)TVTReference
レコードを保持HGLOBAL
が含まに。
だから、あなたはTListBox
上にツリーノードをドロップすることができるようにするためには、あなたが次のことを行う必要があります:
IDropTarget
インタフェース(または使用を実装するクラスを作成例えば、Anders Melander's Drag&Drop suiteからの既存の実装である。
TListBox.Handle
ウィンドウを持つクラスは、RegisterDragDrop()
を使用して登録してください。あなたのIDropTarget
実装で
、あなたはCF_VIRTUALTREE
とCF_VTREFERENCE
形式で提供IDataObject
を照会することができます。成功すると、Drop()
メソッドは、ドラッグされているツリーノードデータにアクセスし、必要に応じてTListBox
にコピーできます。
(TBaseVirtualTree.GetTreeFromDataObject()
メソッドの実装を参照)、それは非常に小型でシンプルな形式ですので、私は、ちょうどCF_VTREFERENCE
に焦点を当て示唆し、TVirtualStringTree
がからドラッグされているとしてあなたTListBox
が同じプロセスに存在すると仮定し、
ソースTVirtualStringTree
を直接列挙することができる場合は、CF_VIRTUALTREE
のデータを解析することは過度になります(TBaseVirtualTree.ProcessOLEData()
メソッドの実装を参照)。
私はDragAcceptFiles()APIを参照していました。私は後でそれがナンセンスだと分かった。いずれにせよ、あなたの答えは私に大きな時間を助けました。ありがとう!私は 'CF_VTREFERENCE'を使い、' VT.GetSortedSelection'を使ってノードを選択しました。 – zig