ボタンを右クリックするには?

解決


AS  2012-09-28 18:58:28  No: 43032

おはようございます。

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

ボタンを右クリックするためにOnMouseDownを使ったのですが、
ボタンの上で右クリックしたら動作しないようです。
ボタンのすぐ傍なら動きます。

どうしたら、ボタンを右クリックできますか。


Mr.XRAY  2012-09-28 20:07:18  No: 43033

こんにちは,

エスパーの登場が期待される質問文章ですが,

>ボタンの上で右クリックしたら動作しないようです。

この「右クリック」というのは,どのイベントのことを言うのですか.
言葉通りですと,クリックとなり,OnClick と推定できますが,
OnClick は,マウスの左ボタンの操作のことですが...
でも,OnMouseDown って書いてありますね.さて,どちらでしょう.

>ボタンのすぐ傍なら動きます。

ボタンのすぐ傍ってどこですか.どのイベントでですか.


igy  2012-09-28 20:07:55  No: 43034

>ボタンを右クリックするためにOnMouseDownを使ったのですが、

このOnMouseDownは、ボタンではなく、フォームなどのOnMouseDownイベントのことだと思うのですが、

ボタンのOnMouseDownイベントでは、だめですか?


エス8  2012-09-28 23:25:39  No: 43035

>ボタンのすぐ傍なら動きます。
//procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer) ;

>ボタンを右クリックするために
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then              
      Canvas.Brush.Color := clRed 
  else if Button = mbRight then 
      Canvas.Brush.Color := clBlue ;
      Canvas.Ellipse(X,Y,X+10,Y+10) ;
end ;

がんばって。


AS  2012-09-29 03:07:41  No: 43036

皆さん。ありがとうございました。

ボタンのオブジェクトインスペクタのイベントでOnMouseDownと書いて作ったら、元からあった
FormのOnMouseDown(Sender: TObject; Button:TMouseButton・・・・
に飛んだので、ボタンには
OnMouseDown(Sender: TObject; Button:TMouseButtoん・・・・
はできないのかと思って、そこにプログラムを作ってしまいました。

名前を変えてやればいいのですね。

ありがとうございました。


というか  2012-09-29 03:18:46  No: 43037

あんたまともなプログラムかけるほど基礎ができてないよ。
簡単なサンプルプログラム作って基礎勉強してきたら?
例えばここでも見るとか。

http://delphi.sakura.vg/index2.html

あんたが何作ってるのかしらんが、このまま進むと近い将来、
あんた自身もユーザーも地獄を見るよ。


Mr.XRAY  2012-09-29 04:37:03  No: 43038

こんにちは,Mr.XRAYです.
私はエスパーてはないので,AS さんが実際に行った操作を知ることはできませんが,
ちょっと気になったので.それは,

>イベントでOnMouseDownと書いて作ったら

という文章です.「書いたら」と書いてありますが,
これは実際にキーボードからタイプしたのでしょうか ?
でしたら,イベントは,以下の図の説明のように作成すると便利です.
既にご存知でしたら,ゴメンなさい.

[ボタンクリックのイベントを作成]
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro01.htm#03


AS  2012-09-29 07:15:51  No: 43039

Mr.XRAYさんへ
そうですね。昔はダブルクリックしていましたね。
でも、朝は書きましたね、確かに。

お陰様で、完成しました。

朝のプログラムを直して作ったら、またおかしなエラーが出るようになったので報告だけします。
Form1.Onmousedown(…をForm1.OnImage1Mousedown(・・・に直して、Form1.Onbutton11MouseDown(・・・を作りました。
この機能は正常に働きましたが、
元からあった方OnImage1Mousedown(・・・が全然機能しなくなりました。(コンパイルはできました。)
元のOnMouseDown(・・・に名前を変えたら、全然関係ないProcedureにエラーが出るようになりました。

おそらく、朝作ったbutton11のOnMouseDownと元からあったImage1のOnmouseDown の区別をXE2が認識できなくなって、正常に処理できなくなったものと思います。(うまく説明できませんが)

で、別のところに保存している同じFormを持ち込んで、先にOnMouseDownをOnImage1mousedownに変えてから作くると、無事にエラーもなく完璧に作動するようになりました。

なんか、このXE2は質問が続きますが、今後もよろしくお願いします。

ありがとうございました。


Mr.XRAY  2012-09-29 09:04:55  No: 43040

>そうですね。昔はダブルクリックしていましたね。

昔からDelphiを使っているんですね.それは失礼しました.
でも,文章を読む限り,単純なイベント作成または設定のミスだと思うのですが,

例えば

1. 新規にプロジェクトを作成
2. ボタンを 1 つ配置
3. オブジェクトインスペクタで,このボタンの OnClick イベントを作成

  procedure TForm1.Button1Click(Sender: TObject);
  begin
  //  イベントのコードが消えないようするために入れておく
  end;
  
となる.

4. コンパイルして,フォームを閉じて終了する
5. ボタンを削除して,コンパイル
6. 正常にコンパイルできる.ボタンクリックのコードは残っている

となります.  
再度ボタンを配置して,ボタンのクリックイベントを,この残っている 
Button1Click に指定することができます.(リストに表示されます)

>区別をXE2が認識できなくなって

ではなく,認識しないようにイベントを設定,作成しているんじゃないでしょうか.


AS  2012-09-29 17:43:51  No: 43041

Mr.XRAYさんへ
確かに、そういった手順は完全にしていませんね。
アセンブラを使っていた頃はフローチャートを書いてからプログラムしていましたが、
Basicを使いだした頃から、フローも書かずに直にコーディングするようになりましたね。

「やはり、現役のプロはさすが」と思いましたよ。

で、今日来たのは、
Image1のOnMouseDownがあって、Button11にOnMouseDownを作ったらそこでエラーになるべきではと思ったからです。
XE2を使ってる人にお聞きしたいのですが、私と同じことをしてエラーが出るか出ないか教えてくださいませんか。

なんか、最近私のXE2がおかしくなってるのではと思い始めています。
昨夜もここに投降した後、プログラムしていて、修正しても実行したら全然変わってないという事態が起きました。
プログラムは確実に変えていました。
パソコンの内部の他の保存場所2か所も確認しました。
他のパソコンまで確認しましたが。
それでも、実行したらプログラムの訂正が実行時に反映されていない。
結局、「プロジェクトから削除」を実行したら訂正ができるようになりました。
この経験も初めてのことです。

私のXE2、おかしくないですか?


  2012-09-29 19:01:06  No: 43042

まず、Delphiにおけるイベントハンドラの基礎を勉強されてはいかがですか。
あなたが聞いていることは、初歩の初歩です。
ツールがおかしいのではなく、使っている人がおかしいのだということに
気づいてください。話はそこからです。

http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro01.htm

このあたりを参考にしてみてはどうですか。


  2012-09-29 19:07:30  No: 43043

それと、あなたのパソコンの構成、詳細な問題点は誰も知りません。
Windowsの権限だって邪魔をしている可能性だってあるし、あなたは
最低限の問題の切り分け、きちんと行ったのですか?

ろくに環境も示さず、おかしい教えてくれといっている方がおかしいし、
よっぽど「教えてくれ」です。

質問のイロハすらわからないのであれば、まずそちらの手順も併せて
勉強すべきでしょう。


igy  2012-09-29 22:00:55  No: 43044

“全然変わってない”
“プログラムの訂正が実行時に反映されていない”

では、ここを見ている人には、わかりません。

どのようなコードを書き、どのような動作を期待していて、実際はどのような動作になるのかなど、具体的でないと
回答しにくいですね・・・

技術系メーリングリストで質問するときのパターン・ランゲージ
http://www.hyuki.com/writing/techask.html

は、メーリングリスト向けで書かれていますが、この掲示板でご質問される場合にも
参考になるかと思います。参考までに・・・

あと、

>Image1のOnMouseDownがあって、Button11にOnMouseDownを作ったらそこでエラーになるべきではと思ったからです。

エラーになるべき理由がちょっとわかりません。


igy  2012-09-29 22:18:34  No: 43045

>結局、「プロジェクトから削除」を実行したら訂正ができるようになりました。

何を「プロジェクトから削除」したのかを書いていないので、よくわかりませんが、
再び、プロジェクトに追加したら、また、同様の現象が起きるなら、
そこから、問題点が絞り込まれるかもしれませんね・・・・

終了時にエラーが出るのを止めるためには
https://www.petitmonte.com/bbs/answers?question_id=7722

のように、プロジェクトでフォームを自動生成しているにもかかわらず、
コード上でも生成して、問題を引き起こしているってことは、ないですよね。


Mr.XRAY  2012-09-29 22:35:36  No: 43046

こんちには.

>私と同じことをしてエラーが出るか出ないか教えてくださいませんか。

多分無理だと思いますよ.
その「同じ」ことが,どういう手順なのか知ることができません.
「エスパー」でもない限り「同じこと」を再現できないと思いますよ.
ちなみに,私はエスパーではありません.
エスパーに近い,「エスパーDEKOさん」というような方もいるようですが(笑)

>Image1のOnMouseDownがあって、Button11にOnMouseDownを作ったら

これを言葉通りに受け取ると,以下のようになります.
これでエラー発生するのであれば,その Delphi XE2 は値切って購入したか,
悪霊にとり憑かれているのでしょう.
「何万行もあるアプリでの現象だから,新規プロジェクトを作成してのテストはできない」
といわず,このような単純なテストをしていく方法が一番です.
問題点の切り分けが必要なのです.

http://mrxray.on.coocan.jp/Others/HowToCreateEventfoXE2.htm


通りすがり  2012-09-30 02:20:30  No: 43047

> Form1.Onmousedown(…をForm1.OnImage1Mousedown(・・・に直して、Form1.Onbutton11MouseDown(・・・を作りました。

procedure Form1.Onmousedown(~
のソースを直接
procedure Form1.OnImage1Mousedown(〜
に書き換えたら、Image1のマウスダウンに勝手に変わるとか考えているの?

> Image1のOnMouseDownがあって、Button11にOnMouseDownを作ったらそこでエラーになるべきではと思ったからです。
procedure Form1.OnImage1Mousedown(〜
begin
  //なんらかの処理
end;
この部分を丸ごとコピペして
procedure Form1.OnButton11Mousedown(〜
begin
  //なんらかの処理
end;
このように関数名だけ変えたらエラーになるんじゃないの?という意味?
うん、エラーになるね。

そうか、関数名をボタンの名前とイベント(MouseDownとか)にするだけで、期待通りの動作になるんだ?
DelphiもXE2やらXE3になって、なんてすごい進歩をしたんだろう(棒)


AS  2012-09-30 02:56:16  No: 43048

皆さん、いろいろとありがとうございます。

基礎が分かっていないというのは本当です。

イベントとか言われてもなにそれとか思います。

igyさんへ
もう自分では、不具合が起こったことは気にしていませんが、一応具体的に
書いてみますね。
最初に
memo1.lines.add('平均='+FloatToStr(AVR));

という行があって、
それに
memo1.lines.add('合計='+kS);

を付け加えて実行したら、きちんと平均と合計が表示されたんですが、

合計はいらないと思って削除しても平均と合計が表示され続けたんです。

で、このformを「プロジェクトから削除」したら、合計が表示されなくなりました。

これ以外にも、「読み込みエラーが起こった、再起動してください」のようなことも結構起こるんで、一応、再インストールしてみます。

Mr.XRAYさんへ
このbutton1mousedownを追加する前に、このformには2個のmousedownがありました。
おそらく、6年前に作ったものだから、すっかり忘れていましたが。
一つは、RichEdit1MouseDownでこれはダブルクリックをして作ったようです。
もう一つはImage1のOnMouseDownでこれは書いたようです。
HP見させていただいて、ダブルクリックしておけば何の問題も生じなかったように思います。
今後はダブルクリックしますね。

>Image1のOnMouseDownがあって、Button11にOnMouseDownを作ったら
の件ですが、
文字通りに、Image1にonmousedownイベントで
procedure TForm1.OnmouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
を作って、
button1にOnMouseDownイベントで
procedure TForm1.OnmouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
を作るんです。
一つしかできませんよね。
Image1とbutton1で同じ名前のを作ってもエラー表示が出るようにはなっていないんですね。

私が若いころは「30過ぎたらプログラマーは無理」とか言われましたが、
最近やはり年には勝てんなとか思ってます。

今後もプログラムは続けますので、質問も続くと思いますが、よろしくお願いします。


Quest  2012-09-30 03:10:04  No: 43049

>procedure Form1.Onmousedown(~
>のソースを直接
>procedure Form1.OnImage1Mousedown(〜
>に書き換えたら、Image1のマウスダウンに勝手に変わるとか考えているの?
VB6はこれですね。
private sub Command1_Click()〜

private sub Form_Click()〜
にソース上で変更するとイベントが丸ごと移動(?)します。
ASさんは、この辺の概念を引きずってるんじゃないかな?
イベントを記述することと、それをコンポーネントに割り付けることは
個別に行う作業であることを理解されているでしょうか。


Quest  2012-09-30 03:18:10  No: 43050

>Image1とbutton1で同じ名前のを作ってもエラー表示が出るようにはなっていないんですね。
同じパラメータを持つイベント同士は共有できるんです。
もちろん、処理の内容によっては共有させられない場合もありますが
それが便利な場合もあります。


igy  2012-09-30 12:50:23  No: 43051

>を付け加えて実行したら、きちんと平均と合計が表示されたんですが、
>合計はいらないと思って削除しても平均と合計が表示され続けたんです。
>で、このformを「プロジェクトから削除」したら、合計が表示されなくなりました。

そのような現象は起きたことがないのですが、
以前の投稿でも、別のプロジェクトのフォームをコピーしたりとかしているみたいなので・・・

私だったら、

・プロジェクトとは関係ないほうのフォームを編集していないか確認
・コンパイル後、該当するフォームのdcuファイルの日時を確認
・プロジェクトの再構築を実行

など、試します。


Mr.XRAY  2012-09-30 22:03:49  No: 43052

>HP見させていただいて、ダブルクリックしておけば何の問題も生じなかったように思います。
>今後はダブルクリックしますね。

そういう問題を指摘したわけではないんですが.


take  2012-10-01 18:37:53  No: 43053

前回、前々回の質問と同様に右クリックでイベントが発生しなかった原因の
説明もないんですね・・・。

ほかの人が指摘されているように
もっと基礎のところから初めてみたほうがいいですよ。

私のおすすめとかはここです。
http://kakinotane.s7.xrea.com/

質問の内容が不明確で答える側も苦労しているのに
また「Delphi」がおかしいですか・・・

初心者マーク付きの人が車買い換えて
「私の車、動きおかしくありませんか?」
って言われても
「運転がおかしいんじゃないかな?」
と言うしか無いです。

行動した手順を時系列に説明してもらえれば答えは見つかると思います。

Delphiに限らずコンパイラは
1.各ファイルをコンパイルして中間ファイル化
2.中間ファイルをリンクして実行ファイル化
というおよそ2段階の処理が実行されます。

(1)の処理は比較的時間がかかるので(Delphiは一瞬ですが)
更新されていなければ処理されないまま(2)へ行きます。

Form1とForm2で構成されているプロジェクトがあって
これは正常動作していると仮定します。

改良したいのでこれらのプロジェクトをコピーしました。
わかりやすくするためForm1A、Form2Aとしましょうか

コピーした方で修正しようとファイルを開いたが
実はForm1の方を編集していた。
コンパイルされるのはForm1Aなので間違ってもエラーが出ない。
反映されない。元々エラーが出ているなら直らないの三拍子です。

というオチでしょうか?


Mr.XRAY  2012-10-02 02:42:00  No: 43054

こんにちは.Mr.XRAYです.take さんのレスがあったので,ついでに.

>1.各ファイルをコンパイルして中間ファイル化
>2.中間ファイルをリンクして実行ファイル化
>というおよそ2段階の処理が実行されます。

前のレスで,質問された方が確認してくれれば話しを続けようと思っていたのですが,
ほとんど無視されてしまいましたので... (悲しい,空しい)

Delphi では,.pas ファイルをコンパイルすると,.dcu というファイルができます.
これも一種の中間ファイルと言えます.
もし,.pas ファイルに変更がなければ,この .dcuを使用することにより,実行ファイルの
作成,つまり,一般的にいう「コンパイル」を高速にしているわけです.

状況にもよりますが,「再構築」をすると,これらの .dcu も更新されます.
これも状況によりますが,「再構築」をしないと,コードを編集(もちろん,削除も含みます)
しても,その結果が反映されないことがあります.
この現象が極端に現れるのが,コンポーネントの生成コード部分や,SetParent メソッド等
のコードです.
たまにレスにある,「.dcu ファイルを削除してやってみてくだい」
というのは,こういう意味もあるわけです.

参考
[「パスを通す」ということ]
http://mrxray.on.coocan.jp/Delphi/CompoInstall/index.htm#02

「心霊現象」や「オカルト現象」のように,実際には,質問された方の主張する
ことに正当性があるのかも知れません.
しかし,今後の開発をスムーズにするためにも,現象の解析をした方が,
私自身はいいのではないかと思っています.


AS  2012-10-04 02:15:48  No: 43055

皆さん、いろいろとありがとうございました。

私は今回のエラーでいろいろなことが分かりました。
takeさんの説明で、私の考えていたことが確認できました。

まだ、再構築とかdcuとかは全然わかりませんが。

ちょっと、忙しくてここに来ていませんでした。
とりあえず、プログラムの方もすることが思いつかないので、以前からおかしいと思っていたことを質問することにしました。

また、よろしくです。

一応、ここはクローズします。


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

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






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