[delphi-users:5259] TreeView1へのDragDrop操作についての質問

20 views
Skip to first unread message

nagao

unread,
Aug 5, 2019, 3:04:08 AM8/5/19
to delphi...@freeml.com
nagaoです。いつも教えて頂き、ありがとうございます。
このフォーラムは未だ新規の投稿を受けて頂いているようなので質問させ
ていただきます。

procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
HT:tHITTests;
begin
HT:=TreeView1.GetHitTestInfoAt(X,Y);
if (htOnItem in HT) or (htOnLabel in HT) then
TreeView1.selected:=TreeView1.GetNodeAt(X,Y);
showmessage(TreeView1.selected.Text);
end;

Windows10+Delphi 10.1 Berlin の動作環境で上記のテストプログラムを作成し
てみました。
例えばtextが'ああ'というtreenodeの行にDragDropする操作をする場合、
正確に'ああ'と表示されている所にDragDropすれば、
TreeView1.selected:=TreeView1.GetNodeAt(X,Y);
のコードが動作してくれますが、同じ行でもそれ以外の所にDragDropした
場合には、そのような動作はしてくれません。
希望する行のどの位置にDragDropして、常に
TreeView1.selected:=TreeView1.GetNodeAt(X,Y);
が動作するようにする方法はないのでしょうか?

また、Windowsに標準装備されいるエクスプローラでは、右側の
ファイルを左側のフォルダが一覧表示されている所にDragDrop
しようとする場合、DragDropをする直前でも、MouseMoveに反応して
左側の画面では、フォルダ名だけでなく、マウスがいる行全体が
反転表示されますが、そのようなことが、TreeView1でもできない
でしょうか?



MLホームページ: https://www.freeml.com/delphi-users

----------------------------------------------------------------------
【重要】必ずお読みください
■freeml byGMOサービス終了のお知らせ■
2019年12月2日(月)12:00をもちまして、
サービスの提供を終了させていただきます。
詳しくはこちら
http://ck.freeml.com/rd.php?cid=11272
------------------------------------------------------[freeml byGMO]--

「WiMAX(ワイマックス)」ならおトクなGMOとくとくBB。
今なら高額ポイントがもらえます♪
まずはかんたん登録♪ -ポイントタウン-
https://www.pointtown.com/ptu/rd.cgi?cid=9533
----------------------------------------------------------------------

Fukushi

unread,
Aug 8, 2019, 11:27:33 PM8/8/19
to delphi...@freeml.com
nagaoさん、こんにちは。福士です。

> 例えばtextが'ああ'というtreenodeの行にDragDropする操作をする場合、
> 正確に'ああ'と表示されている所にDragDropすれば、
> TreeView1.selected:=TreeView1.GetNodeAt(X,Y);
> のコードが動作してくれますが、同じ行でもそれ以外の所にDragDropした
> 場合には、そのような動作はしてくれません。
> 希望する行のどの位置にDragDropして、常に
> TreeView1.selected:=TreeView1.GetNodeAt(X,Y);
> が動作するようにする方法はないのでしょうか?

ちょっと調べてみましたが、GetHitTestInfoAtは同じ行の右側の空いて
いる部分だとhtOnRightを、左側の部分だとhtOnIndentを返します。
ですので判定の

| if (htOnItem in HT) or (htOnLabel in HT) then



if (HT * [htOnItem, htOnLabel, htOnRight, htOnIndent]) <> [] then

のようにhtOnItem、htOnLabel、htOnRight、htOnIndentのいずれかが
含まれていたら、というようにすれば希望の動作になると思います。


> また、Windowsに標準装備されいるエクスプローラでは、右側の
> ファイルを左側のフォルダが一覧表示されている所にDragDrop
> しようとする場合、DragDropをする直前でも、MouseMoveに反応して
> 左側の画面では、フォルダ名だけでなく、マウスがいる行全体が
> 反転表示されますが、そのようなことが、TreeView1でもできない
> でしょうか?

これはTreeViewのShowLinesをFalseに、RowSelectをTrueにすることで
同じになると思います。


参考にしてください。

---
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp


MLホームページ: https://www.freeml.com/delphi-users

----------------------------------------------------------------------
スマホアプリ版で100万ダウンロード突破の
「キャプテン翼ZERO~決めろ!ミラクルシュート~」
HTML5ゲームプラットフォーム「ゲソてん byGMO」にて、
PCブラウザ版を好評配信中!
https://gesoten.com/games/genre/sports/tsubasa-zero

nagao

unread,
Aug 9, 2019, 1:05:24 AM8/9/19
to delphi...@freeml.com
福士さん、こんにちは。nagaoです。
私の希望することはすべて満たされました。
親切に教えて頂き、誠にありがとうございました。
Reply all
Reply to author
Forward
0 new messages