MouseDownについて

解決


きわ  2022-08-31 05:28:47  No: 150412  IP: 192.*.*.*

Delphi7です。
TSpeedButton のMouseDownのイベント中に
1..ShowMessage('###');
を入れると[OK]を押したあとボタンはDownのままですが、
2.Form1.Caption:='###';
だと、ボタンはDownのあと。すぐにUpにもどります。
1.のケースで[OK]を押した後、ボタンをUpにもどす方法はありませんか。

編集 削除
 2022-08-31 10:52:48  No: 150413  IP: 192.*.*.*

https://www.petitmonte.com/bbs/answers?question_id=8067

こんな感じで、ボタンを押した処理の部分にpostmessageを仕込んでおき、ボタンの処理が完全に終了した段階で後から処理をさせる方法はどうですか?

編集 削除
Mr.XRAY  2022-08-31 23:17:15  No: 150414  IP: 192.*.*.*

> を入れると[OK]を押したあとボタンはDownのままですが、 

申し訳ありません.解決策ではありません.
こんな現象があるんですね.知りませんでした
で,やつてみました.

フォームに TSpeedButton を 2 つ配置してテストしてみました.
GroupIndex の値は共にデフォルトの 0 のままです.
TOpenDialog でも発生しました.
マウスの右ボタン押下だと発生しませんでした.
OnClick イベントでは発生しませんでした.

動作確認は  Windows 10 ビルド 19043 Pro 64 bit + Delphi XE5(UP2) Pro VCL-32 です.

編集 削除
きわ  2022-09-01 04:53:22  No: 150415  IP: 192.*.*.*

「あ」さん。
申し訳ありません、へこんだSpeedButtonをUpにするために送るメッセージが分かりません。
通常、 TSpeedButtonは、MouseDown->Click の順に発生するようですが、1.のようにMouseDownのイベント中に、ShowMessage('###');
を入れて、イベントを中断すると[OK]を押してMouseDownを抜けたあとボタンはDownのままで、次の Clickが発生しないようです。
2. Form1.Caption:='###';  のように中断させなければ、次にClickに移るようです。
背景、SpeedButtonの クリックと [Ctrl]+クリック で別の処理をしたいのですが、[Ctrl]+クリック の場合に確認のメッセージを出したいのです。
仕方がないので、MouseDownのところで、確認のメッセージを出さずに、フラグをセットし、その値によって次のClickで処理する、しかないかなと
思っていましたが、もう少しスマートな方法がないかとお尋ねした次第です。

編集 削除
Mr.XRAY  2022-09-01 06:24:42  No: 150416  IP: 192.*.*.*

> [Ctrl]+クリック の場合に確認のメッセージを出したいのです。

[Ctrl] キーが押されているかを判定したいのであれば,例えば GetKeyState 関数が利用できます.

  if (GetKeyState(VK_CONTROL) and 1) = 1 then begin
  // または if GetKeyState(VK_CONTROL) <> 0 then begin
   //
  end;

編集 削除
 2022-09-01 11:07:30  No: 150417  IP: 192.*.*.*

お示しした事例は、送るメッセージと、それを受け取ったときのハンドラを両方とも独自に実装するものです。
送るメッセージは、リンク先に合わせて言えば、 WM_MyMsg1です。

別の話ですが、もしイベントが起こらないなら、showmessageの後にその処理内容を直接呼んでも良いのでは無いでしょうか。

編集 削除
 2022-09-01 11:14:48  No: 150418  IP: 192.*.*.*

メッセージで後から処理する方法だと、ボタンを押した時の処理が完全に終わった後でshowMessage Dialogが出ると思います。

編集 削除
AAAAA  2022-09-01 16:05:24  No: 150421  IP: 192.*.*.*

MouseUp で処理したら?
ExplorerのPopMenuとか Edgeのお気に入りとか
大抵のメニューって MouseUpで処理されてるよね

編集 削除
mam  2022-09-02 02:38:54  No: 150422  IP: 192.*.*.*

ボタンのクリックとは、本来キャンセル出来るのが正しい(ボタンの上でマウスの左ボタンを押して、ボタンの上からマウスを移動させてボタンの上に無い位置にマウスカーソルをもっていって、マウスの左ボタンを放すとキャンセル)ので、
Mr.XRAY様の言っているのが正しく、

procedure Form1.SpeedButton1Click(....)
begin
  if (GetKeyState(VK_CONTROL) and 1) = 1 then
    ShowMessage('###')
  else
    Form1.Caption:='###';
end;

なのかもしれませんね。
四角四面な回答ですいません。

編集 削除
 2022-09-02 03:41:02  No: 150423  IP: 192.*.*.*

そういえば、onclickイベントも使用していないのですね
意図的に使い分けているのかもしれませんが

編集 削除
きわ  2022-09-02 08:30:30  No: 150424  IP: 192.*.*.*

「あ」さん、SpeedButton1をクリックしたときの処理と、その処理を取り消すのに[Ctrl]+クリック だったので「MouseDown」にしたのですが、その時取り消していいかの確認のために、メッセージが必要になりました。そうして一旦イベントを中断すると「MouseDown」から抜けた後もSpeedButton1がへこんだままになり困っていました。(この理由は分かりません)。ClickのイベントなかでGetKeyStateで取得できるとは知らなかったので、助かりました。MouseUp でもうまく処理できました。「あ」さん、残念ながらせっかくアドバイスをいただきながら浅学のため生かすことができず申し訳ありませんでした。
みなさん、本当にありがとうございました。

編集 削除