喫茶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
> 記事に書いたか,書こうとしたつもりで,白猫さんに指摘されるまで忘れる
> 程度の頭脳ですので,もしかしたら記憶違いがあるかも知れません.


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


[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
> 当分無理そう。

ありっ!?


[2467] ドラッグ&ドロップの必要性返信 削除
2009/6/17 (水) 09:03:10 Mr.XRAY
▼ 宮さん

> 当分無理そう。

前にも書きましたが,この機能はなくてもいいと思いますよ.
私自身がパソコンの操作に,他の人よりなれているかは判断できませんが,
この操作は間違いの元ですので,やりません.

必ずメニューから選択し,貼り付け先もメニューで選択して行って
います.特にWindow XPからはそうです.
XPが普及し始めた頃,あるサイトで,この操作は間違いの元のとなる
のでやめた方がいいという記事を読んだことがあります.

職場で,誰かがこの操作を覚えて,自慢そうに他の人に見せていました.
でも,この操作間違いで「ファイル行方不明事件」が多発しました.
その度に呼ばれ,「ファイルの検索」作業をしました.
こういうことは止めてほしいです.私でさえやらないのに.

機能があれば,存在すれば,それが価値があるわけではないと
思います.
掲示板等でも,いろいろな仕様や機能実現の質問がありますが,実際
実用的には,と疑問に思うことがあります.
もちろん,当然ですが,いろいなことへの兆戦は必要だと思います.

拙作のファイル日時変更のように,Itemの特定の場所ではなく,
全体に新規とか追加であれば操作間違いはまずありません.

# 再作成して,サンプルに掲載しようか迷っているんですけどね (^^;
# 何言ってんだ!? 役にも立たないサンプルがいっぱいあるじゃないか!
# というフリはなしですよ.


[2468] Re:ドラッグ&ドロップの必要性返信 削除
2009/6/17 (水) 14:21:26 宮 〔HomePage
▼ Mr.XRAYさん
>
> 機能があれば,存在すれば,それが価値があるわけではないと
> 思います.



開発途中で、ネットで集めた参考コードなどを改造してテストした
短いプログラムを雑然とストックしているのですが、その整理をしました。
そしたら、エクスプローラーでドラッグ&ドロップで分類したつもりが
結構、意図しないあちこちのフォルダに入っていて
探せなかったのを発見したり有意義でした。

これは、分類ミスではなく、ドロップミスです。
いや、ドロップミスだけではなく、結構ねらいを定めてドロップしても
するっと隣のフォルダに入ったりします。欠陥ですね。
つまり、エクスプローラーでドラッグ&ドロップはやってはいけない。

ですから、先に質問したドラッグドロップの件は、前言取り消します。
すみません。m(_ _)m



[2471] Re2:ドラッグ&ドロップの必要性返信 削除
2009/6/17 (水) 16:59:55 Mr.XRAY
▼ 宮さん

Windows 2000までは,結構間違いは少なかったんです.
XPになって,どうもマウスか,エクスプローラだか分かりませんが,
動きが微妙になったようですね.


[2484] エクスプローラからDrag & DropでTreeViewに返信 削除
2009/6/19 (金) 19:15:22 Mr.XRAY
サンプル作成してみました.
Vistaでは反転表示できません.

http://mrxray.on.coocan.jp/Delphi/plSamples/800_FolderTree.htm#04

コンポーネントにして内部処理をすれば可能なのかも知れませんが,
現在のところ何とも言えません.


[2485] Re:エクスプローラからDrag & DropでTreeViewに返信 削除
2009/6/20 (土) 09:57:39 宮 〔HomePage
▼ Mr.XRAYさん
>>
>XPになって,どうもマウスか,エクスプローラだか分かりませんが,

動きが微妙になったようですね.

やはりそうですか。
違うフォルダに落としているのが、こんなに多いとは
いよいよ自分も惚けてきて手の自由がきかなくなったのか
と思っていました。

ドラッグドロップは、ツリービューで
フォルダやファイルの移動などには使うべきではないですね。

> コンポーネントにして内部処理をすれば可能なのかも知れませんが,
> 現在のところ何とも言えません.


有り難うございました。
ご苦労様でした。
勉強になりますから、研究させてください。
では。


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