Delphi7です。
TSpeedButton のMouseDownのイベント中に
1..ShowMessage('###');
を入れると[OK]を押したあとボタンはDownのままですが、
2.Form1.Caption:='###';
だと、ボタンはDownのあと。すぐにUpにもどります。
1.のケースで[OK]を押した後、ボタンをUpにもどす方法はありませんか。
https://www.petitmonte.com/bbs/answers?question_id=8067
こんな感じで、ボタンを押した処理の部分にpostmessageを仕込んでおき、ボタンの処理が完全に終了した段階で後から処理をさせる方法はどうですか?
> を入れると[OK]を押したあとボタンはDownのままですが、
申し訳ありません.解決策ではありません.
こんな現象があるんですね.知りませんでした
で,やつてみました.
フォームに TSpeedButton を 2 つ配置してテストしてみました.
GroupIndex の値は共にデフォルトの 0 のままです.
TOpenDialog でも発生しました.
マウスの右ボタン押下だと発生しませんでした.
OnClick イベントでは発生しませんでした.
動作確認は Windows 10 ビルド 19043 Pro 64 bit + Delphi XE5(UP2) Pro VCL-32 です.
「あ」さん。
申し訳ありません、へこんだSpeedButtonをUpにするために送るメッセージが分かりません。
通常、 TSpeedButtonは、MouseDown->Click の順に発生するようですが、1.のようにMouseDownのイベント中に、ShowMessage('###');
を入れて、イベントを中断すると[OK]を押してMouseDownを抜けたあとボタンはDownのままで、次の Clickが発生しないようです。
2. Form1.Caption:='###'; のように中断させなければ、次にClickに移るようです。
背景、SpeedButtonの クリックと [Ctrl]+クリック で別の処理をしたいのですが、[Ctrl]+クリック の場合に確認のメッセージを出したいのです。
仕方がないので、MouseDownのところで、確認のメッセージを出さずに、フラグをセットし、その値によって次のClickで処理する、しかないかなと
思っていましたが、もう少しスマートな方法がないかとお尋ねした次第です。
> [Ctrl]+クリック の場合に確認のメッセージを出したいのです。
[Ctrl] キーが押されているかを判定したいのであれば,例えば GetKeyState 関数が利用できます.
if (GetKeyState(VK_CONTROL) and 1) = 1 then begin
// または if GetKeyState(VK_CONTROL) <> 0 then begin
//
end;
お示しした事例は、送るメッセージと、それを受け取ったときのハンドラを両方とも独自に実装するものです。
送るメッセージは、リンク先に合わせて言えば、 WM_MyMsg1です。
別の話ですが、もしイベントが起こらないなら、showmessageの後にその処理内容を直接呼んでも良いのでは無いでしょうか。
メッセージで後から処理する方法だと、ボタンを押した時の処理が完全に終わった後でshowMessage Dialogが出ると思います。
MouseUp で処理したら?
ExplorerのPopMenuとか Edgeのお気に入りとか
大抵のメニューって MouseUpで処理されてるよね
ボタンのクリックとは、本来キャンセル出来るのが正しい(ボタンの上でマウスの左ボタンを押して、ボタンの上からマウスを移動させてボタンの上に無い位置にマウスカーソルをもっていって、マウスの左ボタンを放すとキャンセル)ので、
Mr.XRAY様の言っているのが正しく、
procedure Form1.SpeedButton1Click(....)
begin
if (GetKeyState(VK_CONTROL) and 1) = 1 then
ShowMessage('###')
else
Form1.Caption:='###';
end;
なのかもしれませんね。
四角四面な回答ですいません。
そういえば、onclickイベントも使用していないのですね
意図的に使い分けているのかもしれませんが
「あ」さん、SpeedButton1をクリックしたときの処理と、その処理を取り消すのに[Ctrl]+クリック だったので「MouseDown」にしたのですが、その時取り消していいかの確認のために、メッセージが必要になりました。そうして一旦イベントを中断すると「MouseDown」から抜けた後もSpeedButton1がへこんだままになり困っていました。(この理由は分かりません)。ClickのイベントなかでGetKeyStateで取得できるとは知らなかったので、助かりました。MouseUp でもうまく処理できました。「あ」さん、残念ながらせっかくアドバイスをいただきながら浅学のため生かすことができず申し訳ありませんでした。
みなさん、本当にありがとうございました。
ツイート | ![]() |