マウスのクリックをフォーム上のボタンに対応させるには?

解決


B級プログラマー  2003-11-26 06:00:26  No: 5747

通常、フォーム上のボタンを押すために、マウスカーソルをボタンにあわせて左クリックしますが、カーソルをあわせることなく右クリックしただけで、ボタンが押される処理というのは、どういうふうにするのでしょうか?出来れば左クリックについても教えて欲しいです。よろしくお願いします。


たかみちえ  URL  2003-11-26 07:15:16  No: 5748

わたしも最近、聞いたことですけど——。

  TApplication.OnMessageには、アプリケーションのあらゆるメッセージが送られてきます(どのコントロールに送られたものであっても)。
WM_LBUTTONDOWNなどももちろん送られてきます。

  ボタンをクリックさせるには、TButton.Clickをはじめ、いろいろな方法があります(メッセージを送るとか、関連付けたアクションのExecuteを呼ぶとか——

  B級プログラマというのならば、これ以上の説明は不要ですよね(^_^)


B級プログラマー改め、ただの学生  2003-11-26 07:39:29  No: 5749

けっして見栄をはったわけではないのですが、実は私はただの学生です。誤解を生むようなネームを使用してすいませんでした。結果、たかみちえ様の発言の意味を理解するだけの知識を持ち合わせていません。よろしければ、もう少しやさしく教えていただいてもよろしいでしょうか?ほんとすいません。


ただの学生  2003-11-26 09:43:21  No: 5750

procedure TForm1.WMLButtonDown(var MSG:TWMLButtonDown );
begin
        button1.Click
end;
たかみちえ様のレスをもとに、上記のソースを導き出せることが出来ました。
いろいろややこしくて、すいませんでした。


Mr.XRAY  URL  2003-11-26 22:53:49  No: 5751

解決ということなのですが,
これって,もしかして,

procedure TForm1.Button1Click(Sender: TObject);
begin
    ShowMessage('右だよ');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     ShowMessage('左だよ');
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     if Button=mbRight then Button1Click(nil);
     if Button=mbLeft  then Button2Click(nil);
end;

という動作のことですか.最初の文章から,この動作のことかとは思ったの
ですが,これだとイベントで簡単にできてしまうので,違うかなと.
Formの外側でマウスをクリックしてもということなのでしょうか.

(Delphi7で確認.Delphi7じゃないこのイベントはないのかしらん)


Mr.XRAY  URL  2003-11-26 22:53:55  No: 5752

解決ということなのですが,
これって,もしかして,

procedure TForm1.Button1Click(Sender: TObject);
begin
    ShowMessage('右だよ');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     ShowMessage('左だよ');
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     if Button=mbRight then Button1Click(nil);
     if Button=mbLeft  then Button2Click(nil);
end;

という動作のことですか.最初の文章から,この動作のことかとは思ったの
ですが,これだとイベントで簡単にできてしまうので,違うかなと.
Formの外側でマウスをクリックしてもということなのでしょうか.

(Delphi7で確認.Delphi7じゃないこのイベントはないのかしらん)


Mr.XRAY  URL  2003-11-26 22:54:05  No: 5753

解決ということなのですが,
これって,もしかして,

procedure TForm1.Button1Click(Sender: TObject);
begin
    ShowMessage('右だよ');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     ShowMessage('左だよ');
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     if Button=mbRight then Button1Click(nil);
     if Button=mbLeft  then Button2Click(nil);
end;

という動作のことですか.最初の文章から,この動作のことかとは思ったの
ですが,これだとイベントで簡単にできてしまうので,違うかなと.
Formの外側でマウスをクリックしてもということなのでしょうか.

(Delphi7で確認.Delphi7じゃないこのイベントはないのかしらん)


Mr.XRAY  URL  2003-11-26 22:56:02  No: 5754

ごめんなさい.
操作ミスで同じのをたくさん送ってしまいました.


たかみちえ  URL  2003-11-27 21:15:22  No: 5755

確かにそれでもできるんですけど、
それだとフォームの中のコントロールにフォーカスが当たってるとき、メッセージが来ませんね。
質問者本人の書いたソースも、同じ問題が起こるはずです。わたしがやってみたのはWM_KEYDOWNだったので、ちょっと違うかもしれませんが。

  OnMessegeならば、フォームのどこにフォーカスがあろうとも、ちゃんとメッセージが回ってきます。
そのときにWM_LBUTTONDOWNなどを拾って処理してあげれば、いいです。

> 実は私はただの学生です。
  ちなみにわたしもただの学生


Mr.XRAY  URL  2003-11-27 22:22:57  No: 5756

>OnMessegeならば、フォームのどこにフォーカスがあろうとも

なるほど.そういうことですか.
了解しました.


Halbow  2003-11-27 22:33:07  No: 5757

Halbow です。

> OnMessegeならば、フォームのどこにフォーカスがあろうとも、ちゃんとメッセージが回ってきます。

そうですね。Application.OnMessage は、メインのメッセージループが回っていて、メッセージキューに入るメッセージだけを受け取れます。コントロールが親に送る  SendMessage() や  TOpenDialog  などの非VCLのダイアログを表示しているときや、メニューループのときのメッセージは受け取れません。これらをちゃんと受け取るためにはローカルフックが必要です。

>  ちなみにわたしもただの学生

わたしはただのオヤジです。(笑)


Mr.XRAY  URL  2003-11-28 04:20:11  No: 5758

余談なんですが,恥ずかしながら,かなり(少し?)前まで,ローカルフック
も,EXE組込みのリソースも,何で必要なんだろう,と思っていました.

でも,今は,ローカルフックもグローバルフックも,EXE組込みのリソース
もしっかりお世話になっています.
きっかけは,ある動作や仕様を満たしたいがどうやったら...
と考えていたところ,MLや色々の掲示板,サイトで過去にみた情報が役に
たったという訳です.

Application.OnMessageにはかなり悩んだものです.
本当にフックは強力ですね.

>わたしはただのオヤジです。(笑)

わたしもただのオヤジです.(^_^);


ただの学生  2003-11-28 09:16:47  No: 5759

みなさんたくさんのご意見ありがとうございました。ぶっちゃけた話、みなさんのデルファイレベルが高すぎて、理解できるレスは、皆無と言っていいほどでした。
私も早くデルファイ談義ができるように日々、勉強したいと思っています。レスをくれたみなさん、本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加