喫茶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メッセージで処理可能です.

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


[2458] Re4:TreeViewに他コンポからドラグドロップの勉強中です。返信 削除
2009/6/16 (火) 02:44:37 宮 〔HomePage
▼ Mr.XRAYさん
>> ポイントはマウス座標値の変換作業です.

有り難うございます。
私も一歩一歩進んでいます。
まず、今回のエクスプローラの勉強で
ファイルリストListViewからファイルを複数ドラッグして
拙作のブラウザでファイルをオープンできるようになりました。
また、プレイリストにもドロップできるようになりました。
今は実験です。
つまり、いままでは、エクスプローラからの
ドロップしかできなかったのが
自アプリの他のコンポーネントからドラッグできたと言うことです。
WMDropFilesなどでドロップするのと
DragOver DragDropでドラグドロップする概念が区別付けられませんでした。
やっと違いがわかりました。
次のステップとしてツリービューのマウスの座標から
該当ノードを選択状態にすればいいんですね。
挑戦してみます。
では。




[2460] マウスフックのタイミング返信 削除
2009/6/16 (火) 09:32:28 Mr.XRAY
余計なお世話かもしれませんが,
フックは,自アプリが非アクティブになったら開始して,
アクティブになったら,ストップする方が効率がいいです.

この検出にはWM_ACTIVATEメッセージを処理します.
メッセージハンドラの作成は
http://mrxray.on.coocan.jp/Others/A_IDETechnique.htm#07
のあたりを参考に.

procedure TForm1.WMActivate(var Message: TWMActivate);
begin
    if Message.Active=WA_INACTIVE then begin
      //フォームが非アクティブになったの処理
    end else begin
      //フォームがアクティブになった時の処理
    end;
end;

[2462] Re:マウスフックのタイミング返信 削除
2009/6/16 (火) 22:08:43 Mr.XRAY
> フックは,自アプリが非アクティブになったら開始して,
> アクティブになったら,ストップする方が効率がいいです.


またまた,ポカです.
非アクティブになったらフックかけられませんね.失礼しました.


[2463] Re2:マウスフックのタイミング返信 削除
2009/6/16 (火) 23:16:31 宮 〔HomePage
▼ Mr.XRAYさん
>ストップする方が効率がいいです.
>
> またまた,ポカです.
> 非アクティブになったらフックかけられませんね.失礼しました.


あの〜、いずれにしても、なんのことやら解りません。
むむりだぁ〜。

当分無理そう。
コツコツ。
では。


[2466] Re3:マウスフックのタイミング返信 削除
2009/6/17 (水) 07:45:56 Mr.XRAY
> 当分無理そう。

ありっ!?


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