喫茶XRAYトップページ

[スレッド全体
]

[4023] Re8:947_ExplorerBrowser の plExplorerFolderTreeにて返信 削除
2010/12/16 (木) 20:36:08 Sara
▼ Mr.XRAYさん こんばんは

> いつでもどうぞ.解決の保証はありませんが. (^^;

との優しい言葉を真に受けて、やってまいりました。(^^;

plExplorerFolderTreeにOnMouseEnterイベントを発生させるには、
どうすればよいでしょうか?

よろしくお願いいたします。m(_ _)m

[4024] Re9:947_ExplorerBrowser の plExplorerFolderTreeにて返信 削除
2010/12/16 (木) 23:23:15 Mr.XRAY
▼ Saraさん,どうも

> plExplorerFolderTreeにOnMouseEnterイベントを発生させるには、
> どうすればよいでしょうか?


http://mrxray.on.coocan.jp/Delphi/plSamples/947_ExplorerBrowsert.htm#03
ですよね.
これは,
http://msdn.microsoft.com/en-us/library/bb774328%28v=VS.85%29.aspx
のリストの,INameSpaceTreeControlCustomDrawインターフェイスを
使用しています.

インターフェイスのリストから,使えそうなのを調べて,そのインターフェイス
を実装することになります.
ただし,インターフェイスの組合せによっては,正常に機能しない場合があります.

今,ちょっとみたところでは,
INameSpaceTreeControlEvents:
http://msdn.microsoft.com/en-us/library/bb761567%28v=VS.85%29.aspx

が使えそうですね.ここの
OnItemClick MethodのnsctsFlags [in]に
Indicates which button was clicked and the kind of click.
One of the following values:
という説明があります.

サンプルでは,

  TplCNameSpaceTreeControlHost = class(TInterfacedObject,
                                       INameSpaceTreeControlCustomDraw)

となっていますから,

  TplCNameSpaceTreeControlHost = class(TInterfacedObject,
                                       INameSpaceTreeControlCustomDraw,
                                       INameSpaceTreeControlEvents)
として,このINameSpaceTreeControlEventsの定義のところを開いて,
([Ctrl]+クリックでShlObj.pasの定義のところを開く)
メソッド(関数類)を全て実装します.インターフェイスでは,必要な関数だけを
実装するということはできません.全てです.
戻り値は,とりあえず,Result := S_OK などとしておいて,
MSDNの英語の記事を解読しながら,作成していくことになります.


[4025] Re10:947_ExplorerBrowser の plExplorerFolderTreeにて返信 削除
2010/12/16 (木) 23:29:23 Mr.XRAY
> 戻り値は,とりあえず,Result := S_OK などとしておいて,

イベントの検出だけですから,MSDNの該当関数の説明を全て読んだわけでは
ないですが,何もすることはないようなきがします.
(Result := S_OKでいいという意味です)

Result := E_NOTIMPL;
という,何もしないというのもあります.


[4026] Re10:947_ExplorerBrowser の plExplorerFolderTreeにて返信 削除
2010/12/16 (木) 23:37:25 Mr.XRAY
> として,このINameSpaceTreeControlEventsの定義のところを開いて,
> ([Ctrl]+クリックでShlObj.pasの定義のところを開く)
> メソッド(関数類)を全て実装します.


釈迦に説法になってしまうと思いますが,定義してある関数のコードを,
全てコピーして,自分のプロジェクトのところに貼り付け,後は,
[Ctrl]+ [Shift] + [C]
で一揆に実装部を作ってしまうと便利です.


[4027] すみません.勘違いでした返信 削除
2010/12/16 (木) 23:50:42 Mr.XRAY
▼ Saraさん

> plExplorerFolderTreeにOnMouseEnterイベントを発生させるには、
> どうすればよいでしょうか?


あっ,ゴメンなさい.OnMouseEnterですか.
マウスクリックと勘違いしていました.


[4028] Re:すみません.勘違いでした返信 削除
2010/12/18 (土) 06:32:55 Mr.XRAY
▼ Saraさん

> あっ,ゴメンなさい.OnMouseEnterですか.

う〜む.OnMouseEnterね.どうしたらいいんだろう.
フック,それとも何かのメッセージ処理でできるのかな.
ちょっと考えます.


[4029] Re2:すみません.勘違いでした返信 削除
2010/12/18 (土) 10:35:20 Sara
▼ Mr.XRAYさん

> う〜む.OnMouseEnterね.どうしたらいいんだろう.
> フック,それとも何かのメッセージ処理でできるのかな.
> ちょっと考えます.


お手数をおかけしております。m(_ _)m

WndProcにはそれらしきメッセージは返ってきません。
CM_MOUSEENTERもだめですね・・・コンポーネント上だけでなく、
メインフォーム上で受けてもplExplorerFolderTreeは反応しません。
(他のコンポーネントは反応しますが・・・)
ので、やっぱりフックですかね・・・(やったことない・・・orz)


[4030] Re3:すみません.勘違いでした返信 削除
2010/12/18 (土) 19:12:19 Mr.XRAY
▼ Saraさん

スミマセン.レスがちょっ間が空いて.

> ので、やっぱりフックですかね・・・(やったことない・・・orz)

じゃぁ,やってみますか.
その前に,もう少し調べてみます.


[4031] グローバルマウスフックしかないようです返信 削除
2010/12/19 (日) 20:15:05 Mr.XRAY
> その前に,もう少し調べてみます.

今のところ,マウス操作のフックしか思いつきません.
DLLにしたくないのであれば,
http://mrxray.on.coocan.jp/Delphi/plSamples/260_HookKeyMouseEvent.htm#03

ですね.


[4034] Re:グローバルマウスフックしかないようです返信 削除
2010/12/20 (月) 20:30:36 Sara
▼ Mr.XRAYさん こんばんは

> 今のところ,マウス操作のフックしか思いつきません.
> DLLにしたくないのであれば,
> http://mrxray.on.coocan.jp/Delphi/plSamples/260_HookKeyMouseEvent.htm#03

なろほど、参考になります。
現在、パソコンを置いてある部屋が利用できないため、
検証ができません。(別室でミニノートを使用中)
明日には多分使えますので、検証しだい、ご報告いたします。

よろしくお願いいたします。

[4036] Re2:グローバルマウスフックしかないようです返信 削除
2010/12/21 (火) 20:29:48 Sara
▼ Mr.XRAYさん こんばんは

> > 今のところ,マウス操作のフックしか思いつきません.
> 明日には多分使えますので、検証しだい、ご報告いたします。


検証しました。問題なく動作しているようです。

が、さすがに、この方法だと、コンポーネントに組み込むわけには
いかないですよね・・・(^^;

でもまぁ 動いてるし良いか(^^;

大変ありがとうございました。m(_ _)m

[4039] Re3:グローバルマウスフックしかないようです返信 削除
2010/12/21 (火) 23:39:35 Mr.XRAY
▼ Saraさん

> が、さすがに、この方法だと、コンポーネントに組み込むわけには
> いかないですよね・・・(^^;


むむっ,う〜ん.そうですね.結構ややこしいコードになる感じがします.
できなくはないでしょうが,
Saraさんも,現在いろいろテストしている段階のようですので,
もうしばらく様子を見てみてはいかがでしょうか.


[4044] Re4:グローバルマウスフックしかないようです返信 削除
2010/12/22 (水) 00:46:27 Sara
▼ Mr.XRAYさん

> むむっ,う〜ん.そうですね.結構ややこしいコードになる感じがします.
> できなくはないでしょうが,
> Saraさんも,現在いろいろテストしている段階のようですので,
> もうしばらく様子を見てみてはいかがでしょうか.


そうですね。そうします。(^^)

しかし、グローバルフックを使っているとデバッガでブレークしてもマウス制御が
戻ってくるまで少し時間がかかるんですね・・・(^^;



[4045] Re5:グローバルマウスフックしかないようです返信 削除
2010/12/22 (水) 11:18:15 Mr.XRAY
▼ Saraさん

> しかし、グローバルフックを使っているとデバッガでブレークしてもマウス制御が
> 戻ってくるまで少し時間がかかるんですね・・・(^^;


ハハハッ.固まったかと思うでしょう.
フックのデバックは,ものにもよるのかも知れませんが,面倒なようです.
DLLのデバッグなんかも.
Delphiのデバッガーも使いやすくなってきたようですが,あまり使ってないです.
CPUウィンドウもあまり,読めないので使いません.

最近使っているのは,HalbowさんのDebugWndUnitと,
テスト用のフォームに,TMemoを配置して,そこに出力するようにしています.
この時,コンポのPublicに
  FMemo : TMemo
としておいて,テスト用フォームのユニットで,Compo.FMemo := Memo1;
そして,コンポ内で追跡する値を,FMemo1.Lines.Add();
等としています.広い画面を有効に使っています.

フック関係のプログラムは,個人的には難しい方ではないかと思っています.


[4056] Re6:グローバルマウスフックしかないようです返信 削除
2010/12/22 (水) 21:10:08 Sara
▼ Mr.XRAYさん こんばんは

> 最近使っているのは,HalbowさんのDebugWndUnitと,
> テスト用のフォームに,TMemoを配置して,そこに出力するようにしています.
> この時,コンポのPublicに
>   FMemo : TMemo
> としておいて,テスト用フォームのユニットで,Compo.FMemo := Memo1;
> そして,コンポ内で追跡する値を,FMemo1.Lines.Add();
> 等としています.広い画面を有効に使っています.


なるほど、それはいいですねぇ。
さっそく、真似します。(^^;V

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