2017-01-18 11 views
2

DragTypedtOLE(ないdtVCL)に設定されている場合、VCLコントロールにTVirtualStringTreeからノードをドラッグ&ドロップすることが可能ですDragDetleを使ってTVirtualStringTreeからVCLコントロールにノードをドラッグ&ドロップする方法は?

私は、私は別のVTに1つのVTからノードをドラッグできるようにする必要がある状況があります(dtOLEはうまく動作しますが)同時に、ドラッグしている間にノードをTListBox(または他のVCLコントロール)にドロップできるオプションが必要です。

TListBoxハンドルにDragAcceptFiles() APIを設定しようとしましたが、効果がありませんでした。

はどのようにそれを行うことができますか?

答えて

3

TListBoxにはDragAcceptFilesという特性がありません。手動WM_DROPFILESウィンドウメッセージを処理するためプロパティをサブクラス

  1. :あなたがいる場合にのみ動作しますTListBox.Handle窓、上のWin32 API DragAcceptFiles()関数を呼び出していることを意味します。

  2. 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上にツリーノードをドロップすることができるようにするためには、あなたが次のことを行う必要があります:

  1. IDropTargetインタフェース(または使用を実装するクラスを作成例えば、Anders Melander's Drag&Drop suiteからの既存の実装である。

  2. TListBox.Handleウィンドウを持つクラスは、RegisterDragDrop()を使用して登録してください。あなたのIDropTarget実装で

  3. 、あなたはCF_VIRTUALTREECF_VTREFERENCE形式で提供IDataObjectを照会することができます。成功すると、Drop()メソッドは、ドラッグされているツリーノードデータにアクセスし、必要に応じてTListBoxにコピーできます。

    TBaseVirtualTree.GetTreeFromDataObject()メソッドの実装を参照)、それは非常に小型でシンプルな形式ですので、私は、ちょうどCF_VTREFERENCEに焦点を当て示唆し、TVirtualStringTreeがからドラッグされているとしてあなたTListBoxが同じプロセスに存在すると仮定し、

ソースTVirtualStringTreeを直接列挙することができる場合は、CF_VIRTUALTREEのデータを解析することは過度になります(TBaseVirtualTree.ProcessOLEData()メソッドの実装を参照)。

+0

私はDragAcceptFiles()APIを参照していました。私は後でそれがナンセンスだと分かった。いずれにせよ、あなたの答えは私に大きな時間を助けました。ありがとう!私は 'CF_VTREFERENCE'を使い、' VT.GetSortedSelection'を使ってノードを選択しました。 – zig

関連する問題