エクスプローラではお馴染みのドラッグ&ドロップの機能を実装してみます。基本的にはTreeViewコントロールはその機能を持っているので、細々としたプログラムを書く必要はありませんが、ドラッグの開始やドロップ先の検出などのいくつかのコードはイベントプロシージャに記述する必要があります。
なお、掲載しているサンプルフォームでは、多階層のツリーデータまではプログラムやテーブル構造が考慮されていません。それについては、応用としてデータ構造やアルゴリズムを別途検討してみてください。
ポイント
- OLEDragModeプロパティ
- OLEドラッグモードを設定します。ドラッグ&ドロップを行なうためには、これに定数ccOLEDragAutomatic(自動モード)を代入します。なおこの設定は、プログラム上ではなく、TreeViewコントロールのプロパティシートからデザイン時に行なってもかまいません。
- OLEDropModeプロパティ
- OLEドロップモードを設定します。ドラッグ&ドロップを行なうためには、これに定数ccOLEDropManual(マニュアルモード)を代入します。なおこの設定は、プログラム上ではなく、TreeViewコントロールのプロパティシートからデザイン時に行なってもかまいません。
- MouseDownイベント
- TreeViewコントロールでマウスのボタンが押し下げられたときに発生します。ドラッグ&ドロップにおいては、ドラッグの開始時となります。ここで、選択されたNodeオブジェクトをフォーム内でPublicなNodeオブジェクト変数に代入します。それによってドロップ先にその情報を伝えることができます。
- OLEDragOverイベント
- マウスがドラッグ中に通過したときに発生します。ここでは通過中のノードのテキストをハイライト表示します。
- OLEDragDropイベント
- ドロップされたときに発生するイベントです。ドラッグ元のノードの情報がPublicなNodeオブジェクト変数に代入されていますので、そのノードの親ノードを、ドロップされたノード(正確には最後に通過したノード)に差し替えます。それによってノードが移動されます。
サンプルフォームの実行例
"バードワイン"をドラッグ開始

"加工食品"にドラッグしようとしているところ

ドラッグ完了!

さらに"バードワイン"の下に"清涼スカッシュ"をドラッグ&ドロップ(ただし本サンプルではこれは階層が多いため正しく保存されませんのでご注意!)

サンプルDBのダウンロード
comctl_05.lzh(comctl_05.mdb)
|