喫茶XRAYトップページ

[スレッド全体
]

[2412] TreeViewに他コンポからドラグドロップの勉強中です。返信 削除
2009/6/3 (水) 14:41:54 宮 〔HomePage
よろしくお願いします。winXP Delphi 6 Personalです。
MrXRAYさんのサンプルプログラム800-01のFolderTree1をモデルに
エクスプローラなどからドロップしてコピー、移動が出来るように
挑戦していますが、TreeViewのフォルダを反転表示して指定できません。

MrXRAYさんのサンプルでそういうのがないか探したのですが
残念ながら簡易エクスプローラもやっておられないので
質問させていただきました。

TreeView内のノードのドラッグドロップは自分もやっているのですが
他のコンポからのドラッグのサンプルを見かけません。
もしかして非常に難しいのでしょうか?

サンプル800-01に下記のようなコードを追加してみました。
(自分の能力で書いたのではなく拾い集めたものです)
しかし、Listboxには確かにドロップしているのですが
フォルダを指定(反転表示できない)
が出来ないのでコピーコードなど書けません。

  private
  //------ドラッグドロップ関係追加
   TreeView1OldProc: TWndMethod;
   procedure TreeView1NewProc(var message: TMessage);

procedure TForm1.FormCreate(Sender: TObject);
 // 以前のプロシージャを保存
 TreeView1OldProc := TreeView1.WindowProc;
 // 新しいプロシーシャをセット
 TreeView1.WindowProc := TreeView1NewProc;
 // ファイル受け取りの登録
 DragAcceptFiles(TreeView1.Handle, True);

procedure TForm1.TreeView1NewProc(var message: TMessage);
var
 FileName: array[0..MAX_PATH] of Char;
 i, Count: Integer;
begin
 if (message.Msg = WM_DROPFILES) and (TreeView1.Visible=true) then
 begin  // WM_DROPFILES の処理を横取りする
  Count := DragQueryFile(message.wParam, $FFFFFFFF, nil, 0);
  for i := 0 to Count - 1 do
  begin
   DragQueryFile( message.wParam, i, FileName, SizeOf(FileName));
   ListBox1.Items.Add(FileName);
  end;
  DragFinish(message.wParam); // 忘れないように
 end
 else
 TreeView1OldProc(message);
 // それ以外のメッセージは元のプロシージャを実行する
end;

なお、画面右半分にTWebBrowser貼り付けて、
テストが簡単になるように下記のコードを追加しています。
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
 WebBrowser1.Navigate(FullPath); //--------追加
end;

よろしくお願いします。

[2414] Re:TreeViewに他コンポからドラグドロップの勉強中です。返信 削除
2009/6/3 (水) 17:49:17 Mr.XRAY
▼ 宮さん

> MrXRAYさんのサンプルでそういうのがないか探したのですが
> 残念ながら簡易エクスプローラもやっておられないので


小生の作成するのは,原則ドラックandドロップはないです.
これは,周囲の人の操作をみる限り,いろいろ問題が発生するためです.

でも,個人的には作成したことはあります.

>挑戦していますが、TreeViewのフォルダを反転表示して指定できません。
> 質問させていただきました。


後で調べてみましょうか.
そんなにややっこしかった記憶はないんですが...


[2415] Re2:TreeViewに他コンポからドラグドロップの勉強中です。返信 削除
2009/6/4 (木) 00:01:15 宮 〔HomePage
▼ Mr.XRAYさん
> ▼ 宮さん
>
> 小生の作成するのは,原則ドラックandドロップはないです.
> これは,周囲の人の操作をみる限り,いろいろ問題が発生するためです.


私も個人的にはそう感じます。

マスターのこの種の関連サンプルを見ると
簡易エクスプローラを見るまでもなく、
ファイルのコピー移動をドラッグ&ドロップを使うべきでないという
ポリシーを感じとれます。

最近私もそうですが指がかじかんできて
老人はまず失敗します。
移動中ならどこに落っことしたか判らず、フォルダを
片っ端から開けて探すことがあります。

しかし、何気なくエクスプローラで使っているのに、
このサンプルはほとんど見かけないので
やってみようと感じたわけです。(案の定出来ませんでしたが(^_^;))

> 後で調べてみましょうか.

時間があるときでいいです。お願いします。
では。

[2456] Re3:TreeViewに他コンポからドラグドロップの勉強中です。返信 削除
2009/6/16 (火) 00:58:37 Mr.XRAY
▼ 宮さん

少し時間ができましたので,前に作成したのを探しました.
見つかりませんでした.

ちょっとくどうようですが,説明を
まっ,私も,自分でグローバルフックはUACの問題があることを,どこかの
記事に書いたか,書こうとしたつもりで,白猫さんに指摘されるまで忘れる
程度の頭脳ですので,もしかしたら記憶違いがあるかも知れません.

ます,エクスプローラに限らず,他のアプリからドラッグしてきた場合,
目的のアプリ(この場合は,自アプリのTTreeView)で選択状態に出来ない
理由は簡単です.

自アプリがアクティブでないからです.

どうするかというと,マウスのグローバルフックをします.
サンプルプログラム集のどこかにあったかと思いますが,この場合,
DLLにする必要はありません.何故なら,マウスの動作を制御するわけ
ではないからです.

それで,マウスがTreeViewのことろにきたら,後は,その座標位置の
Nodeを選択状態にします.

それから,提示されたコードでは,TTreeviewのウィンドウプロシージャーを
再定義して使用していますが,ドロップを受け入れるためだとしたら,
その必要はないと思ます.
AcceptFilesメッセージで処理可能です.

時間があればまた再作成したいとは思いますが...
期待はしないでくださいませ.
ポイントはマウス座標値の変換作業です.


[2457] Re4:TreeViewに他コンポからドラグドロップの勉強中です。返信 削除
2009/6/16 (火) 01:02:32 Mr.XRAY
> 記事に書いたか,書こうとしたつもりで,白猫さんに指摘されるまで忘れる
> 程度の頭脳ですので,もしかしたら記憶違いがあるかも知れません.


私は,物忘れはいい方なんです.物覚えは悪いんですが... (^^;


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82