久しぶりに投稿させて頂きます。
フォームに配置した普通のボタンのonClickイベントの発生条件は、ボタンの中でマウスをクリックして離すことで発生しますよね?
つまり、マウスをクリックしたまま、ボタンの外に出して離すとonClickは発生しませんよね?
しかし、ListViewのイベントをデバッガで追って判明したのですが、マウスをクリックして少しでも動かすと、その段階でonClickイベントが発生してしまいます。onMouseUpイベントも同様のようです。
現在作っているソフトはUIがベッキーやアウトルックのような感じになっておりまして、左ペインにTreeView。右ペインにレポート形式のListViewと詳細表示画面がそれぞれ配置されております。
ListViewからTreeViewへドラッグする場合と、ListViewをクリックした時の詳細表示の2つの処理があり、詳細表示が内容によっては若干処理に時間がかかる場合があります。
この場合、onClickやonMouseUp等のイベント処理とドラッグの描画処理が同時に行われているようで、TreeViewやListView上にマウスの軌跡が残ったり、マウスポインタの座標がおかしくなったりします(まるでワープするような・・)。
以前、質問させて頂いた残像現象と似たような状況に陥ったわけです。
StartDrag等で制御しようにも、StartDragよりも先にonClickやonMouseUp等が発生してしてしまうため、解決には至りませんでした。
ドラッグ完了時にRepaintするとこで画面自体は後始末はできましたし、残像が発生しても処理には問題はありませんが、あまりにもお粗末なので、何とかしたいのですが、いったいどうしたら良いのでしょうか?
要するにドラッグしてる間はクリックした時の処理を走らせたくないだけなんですが・・
書き忘れましたが、環境はDel6Pro+WinXPproです。
DragModeプロパティをdmAutomaticに設定されていませんでしょうか?
早速のお返事ありがとうございます。
> DragModeプロパティをdmAutomaticに設定
はい。おっしゃる通りdmAutomaticに設定しております。
それが問題なのでしょうか?
でもdmManualに変更するとドラッグ&ドロップそのものが出来なくなりますよね?
> はい。おっしゃる通りdmAutomaticに設定しております。
> それが問題なのでしょうか?
私の(少ない)経験では、dmAutomaticはお手軽ですが、どうももう1つです。
吉岡さんも今回のご経験で「思ったようにならないな」と思われたのでは
ないでしょうか?
> でもdmManualに変更するとドラッグ&ドロップそのものが出来なくなりますよね?
dmManualにして、BeginDragでドラッグを開始できます。
開始のタイミングは
OnMouseDown
OnMouseMove
OnMouseUp
で制御可能です。
> 私の(少ない)経験では、dmAutomaticはお手軽ですが、どうももう1つです。
> 吉岡さんも今回のご経験で「思ったようにならないな」と思われたのでは
> ないでしょうか?
まさにおっしゃる通りでした。
BeginDragというのは初めて使いましたが、問題が全て解決しました。
今まで何の疑問もなくdmAutomaticを使ってましたが、かなり不都合があるんですね。
非常に勉強になりました。
> dmManualにして、BeginDragでドラッグを開始できます。
BeginDragをキーワードに検索して調べてみた結果、
MouseDownにてBeginDragして、EndDragにて懸念してた詳細表示処理をすることでドラッグ後に処理をするようになりました。
MouseDownでBeginDragしてるからか、マウスを放した瞬間にEndDragしてくれますので、Treeにドラッグではなくクリックしての詳細表示にも支障がありません。
dmManualは目からウロコでした。
本当に心から感謝いたしますm(_._)m
ツイート | ![]() |