• ベストアンサー

Visual-C#の event キーワードの「意義」が分かりません

Wernerの回答

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

> 本来イベントハンドラと呼ぶべきメソッド名をアーギュメントとして取り得る、 > 単なるデリゲート型クラスにしか思えないのですが。 「メソッド名」は文字列ではなく、メソッドそのものと思っていいよね? (名がついてるとどうも文字列のことに思えてしまう) あと、デリゲートonKeyDownのアーギュメントとは? もしかしてこの部分のことなのかな? > this.onKeyDown = onKeyDown; デリゲートonKeyDownもイベントによって呼び出されるものではあるので イベントハンドラの意味からするとおかしくない気もするけど、 C#では「イベント変数にイベントハンドラ(デリゲート)を追加する」みたいな 言い方をするので確かにちょっと違和感はあるかも。 気になるなら、ページ最下部に「お問い合わせ」があるので そこから問い合わせてみてはどうでしょう。

mha01
質問者

お礼

再び回答いただきまして恐縮です。 >> 本来イベントハンドラと呼ぶべきメソッド名をアーギュメントとして取り得る、 >> 単なるデリゲート型クラスにしか思えないのですが。 >「メソッド名」は文字列ではなく、メソッドそのものと思っていいよね? >(名がついてるとどうも文字列のことに思えてしまう) >あと、デリゲートonKeyDownのアーギュメントとは? >もしかしてこの部分のことなのかな? >> this.onKeyDown = onKeyDown; ここでのメソッド名とは、 this.Button1.Click += new System.EventHandler( this.Button1_Click );  ←(1) において、デリゲートクラスであるEventHandlerが、具現化する際にアーギュメントとして用いているthis.Button1_Clickの内の、「Button1_Click」の部分に相当するものです。 もっとも、サイトのサンプルでは、KeyboadEventHandlerという名称のデリゲートクラス型(何でデリゲートクラス名としてEventHandlerなんていう、いかにもイベントハンドラと混同しやすい名前をわざわざ付けるのかも分からないんですが)を定義しているので、 delegate void KeyboadEventHandler(char eventCode); KeyboadEventHandlerデリゲートクラス型のオブジェクト変数として宣言されたonKeyDownのアーギュメントは、メソッドじゃなくてchar型変数のeventCodeになるのですけど、 本来、イベントハンドラとは(1)のButton1_Clickメソッド(その実装はForm1.cs内でプログラマが行います)のような、きちんとした実体のあるメソッドのことを呼んでいるわけで、そのメソッドへの参照を含む存在+αに過ぎないデリゲートオブジェクトをイベントハンドラと呼ぶべきではないと思うわけです。 >気になるなら、ページ最下部に「お問い合わせ」があるので 気がつきませんでした。親切なサイトですね。問い合わせてみます。

関連するQ&A

  • Visual Studio 2008 で VC++ .NET を使って

    Visual Studio 2008 で VC++ .NET を使って開発をしています。 クラスについて現在勉強しているんですけど、早速詰まってしまいました。 『クラス内のメソッドを呼び出す時に、Form1等のフォームを指定し、クラス側ではそのフォームにボタンを配置する。 配置して、そのボタンをクリックされると、ダイアログで「Hello World!」と表示する』 このようなソフトを作りたいのです。(特に意味はなく、勉強したいため) ボタンの配置までは出来るんですが、「クリックされると」の部分が出来ません。 今までは、(クラス使ってないときでは) this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); など、 EventHandlerにthisを与えていたのですが、クラスだとthisが使えなくて困っています。 分かる方お願いします (コードはNGワード扱いされたので、URLを張ります。) http://azio.web.fc2.com/code.txt

  • C# ユーザコントロール内のボタン押下を親で知る

    こんにちは。ユーザーコントロール内のボタンをクリックした時、そのユーザーコントロールをおいている親フォーム側で、それを知るにはどのようにすればよいでしょうか? ---------------------------------------------------------------------- [Form1.cs] void Inform_UserControlButton1Click() { //親が持っている変数を使って処理を行いたい } void Form1_Load(....) { //ユーザコントロールを設置 UserControl1 ctrl = new UserControl1(); this.Controls.Add(ctrl);   //ユーザコントロール内のbutton1を見つける List<Control> ctrl = new List<Control>(cps.Controls.Find("button1", false)); //Form1が持っている変数を使う為の関数を通るようにしたい (Button)ctrl[0].Click += new System.EventHandler(Inform_UserControlButton1Click); //←エラー } ---------------------------------------------------------------------- [UserControl.cs] button1が配置されています。 ---------------------------------------------------------------------- こんな感じにしてできないかなー?と思っていたのですが、//←エラーのところで、 イベント 'System.Windows.Forms.Control.Click' は += または -= の左側にのみ表示されます。 となってしまい上手くいきません。 どのようにすればよいでしょうか?

  • c# イベント用デリゲートの引数

     こんにちは。c#初心者です。  今回はイベントに用いるためのデリゲートの引数に関する質問です。  通常、「System.Windows.Forms.Control」のイベントで用いられているデリゲートの引数は全て  void SampleHandler(object sender, SampleEventArgs e)  のようになっていますが、コントロール以外のクラス(System.Windows.Forms.Controlから派生しないクラス)、例えばコレクションクラスのようなものでも同じように「EventHandler<T>」デリゲートを使わなければならないのでしょうか?  それともう一つ質問です。コントロールクラスでのイベントの引数は  SampleHandler(object sender, …  のようにせずに  SampleHandler(SampleControl sender, …   としてはいけないのでしょうか? (いけないと思いますが…)  質問は以上の2点です。どなたか詳しい方がいらっしゃいましたら教えていただけませんか?

  • C# 子のコントロールからイベントを送る方法?

    毎度お世話になっております。 何の手も加えていないフォームに自分で作った ユーザコントロールを張り付け、そのコントロールからイベントが 発生したら、親フォームを閉じるようにしたいと思っています。 下記にサンプルを記述します。 フォーム側(using文、Designer文は省略) namespace WindowsFormsApplication1 { public partial class Form1 : Form { private string[] stLines = { "こんにちは。", "こんばんは。", "おはよう。", "さようなら。", "おやすみなさい。", }; public Form1() { InitializeComponent();  // 省略 JLabel j = new JLabel(stLines); j.Dock = DockStyle.Fill; this.Controls.Add(j); } } } ユーザコントロール側(Labelを継承) namespace WindowsFormsApplication1 { public class JLabel : Label { private string[] stLines = null; private int lineNo = 0; public JLabel(string[] Lines) { this.Click += new System.EventHandler(this.Jlabel_Click); this.stLines = Lines; this.lineNo = 0; } private void Jlabel_Click(object sender, EventArgs e) { this.lineNo++; if (this.stLines.Length > this.lineNo) { this.Text = this.stLines[this.lineNo]; } else { //ここでイベントを発生させたい //this.lineNo = 0; } } } } 上記のように、渡された文字列をもとに、クリックするごとに次の行を 表示するプログラムですが、行番号が行数を超えた場合にイベントを 発生させて、それを親のフォームが監視し、受け取った際にフォームを 閉じるといった処理をさせたいのです。 親のフォームにクリックイベントを仕掛ければ楽ではありますが、 子供のコントロールからの信号を、親が受け取る…といった流れにしたいのです。 以上、よろしくお願いいたします。

  • なぜ、clickイベントが起こってしまうのか? 回避するにはどのように

    なぜ、clickイベントが起こってしまうのか? 回避するにはどのようにしたら? お世話になります。 Visual Studio 2008 C#での開発です。 以下のような簡単なコードでの実験なのですが、 フォームには radioボタン2個とボタンが配置されています。 やりたいことは  1.button1がクリックされたらbutton1自身を使用不可にする  2.radioButton1がクリックされたらbutton1を再度使用可にする です。 しかし、どうもbutton1のクリックイベントの途中でradioButton1の クリックイベントが発生してしまい、思ったような動作になりません。 どのようにしたらbutton1のクリックイベントの途中のradioButton1の クリックイベントの発生を止めることができるのでしょうか? よろしくお願いします。 namespace WindowsFormsApplicationTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Console.WriteLine("1:button1がクリックされました"); Console.WriteLine("2:button1のenabled=" + button1.Enabled); button1.Enabled = false; Console.WriteLine("6:button1のenabled=" + button1.Enabled); } private void radioButton1_Click(object sender, EventArgs e) { Console.WriteLine("3:radioButton1がクリックされました"); Console.WriteLine("4:button1のenabled=" + button1.Enabled); button1.Enabled = true; Console.WriteLine("5:button1のenabled=" + button1.Enabled); } } } 上のコードでの実験結果 1:button1がクリックされました 2:button1のenabled=True 3:radioButton1がクリックされました 4:button1のenabled=False 5:button1のenabled=True 6:button1のenabled=True

  • 【.NET】動的に作成したコントロールの操作

    動的に作成したコントロールのイベントハンドラから、 同じく動的に作成したコントロールを操作するにはどうすれば良いのでしょうか? どちらのコントロールもKani.csからForm1.csに追加するものです。 例) ・Form1.cs ~省略~ namespace Chef {  ~省略~  KANI kani = new KANI();  kani.form1 = this;  kani.KanaFire();  ~省略~ ・Kani.cs ~省略~ namespace Chef {  public class KANI{   public Form1 form1;   public void KaniFire(){    //ラベル作成    Label LabelTARABA = new Label();    LabelTARABA.Text = "かにふらい";    form1.Controls.Add(LabelTARABA);    //ボタン作成    Button ButtonZUWAI = new Button();    form1.Controls.Add(ButtonZUWAI);    ButtonZUWAI.Click += new System.EventHandler(ButtonZUWAI_Clicked);   }   public void ButtonZUWAI_Clicked(object sender, System.EventArgs e){    /*ここでLabelTARABAを操作したい*/   }

  • 継承したコントロールのイベント

    VB2005を使用しています。 form1にbutton1が設置(ツールボックスからの貼り付け)されているとして、 form2で継承「Inherits form1」します。でリビルド。 この時点で、form2はform1と全く同じデザインです。 form2で継承したbutton1は  Public Class Form2   ~  End Class 内で Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click のようにイベントを設定できないのでしょうか? いろいろ検索等はして、「オーバライド」なるものがあることはわかったのですが、具体的な使い方などが全くわかりません。 できれば簡単なコードなんかを教えていただければとても助かるのですが。オーバーライド以外でもなにか可能な方法があれば是非アドバイスください。 宜しくお願いいたします。

  • C# フォームを閉じてもプログラムが終了しない

    前略 ・C#の初心者です。 ・下記のようなプログラムを作りたいと思っています。プログラムは<作りたいプログラム>の仕様どうりに動作していますが、Form1のFormClosingイベントに Application.Exit()を追加しないと フォーム1で "X"(閉じる)をクリックしても(フォームは非表示になりますが)プログラムが終了しません。プログラムでどこかおかしな部分があると思っています。Application.Exit()を追加しないでもプログラムを終了する方法を教えてください。 <作りたいプログラム> (1)Form1 のbutton1をクリックすると新しいForm2が作成され表示される。Form2が表示されるとForm1は非表示となる。 (2)Form2 のbutton1をクリックするとForm2が非表示となりForm1が表示される。 (3)Form1 の "X"(閉じる)をクリックしてプログラムを終了する。 //Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace formClose { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); //フォーム2を表示 this.Hide(); //フォーム1を非表示 } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Application.Exit(); //アプリケーション終了 } } } //Form2.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace formClose { public partial class Form2 : Form { Form1 form1 = new Form1(); public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.Close(); //フォーム2を閉じる } private void Form2_FormClosing(object sender, FormClosingEventArgs e) { form1.Show(); //フォーム1を表示する } } } 以上

  • C# のクリックイベント

    別のイベントからクリックイベントを発生させるのに Button1.PerformClick(); は、うまくいくのですが、 これがピクチャーボックスになったとき pictureBox1.PerformClick(); 下記のエラーが出てしまいます。 ピクチャーボックスのボタンクリックイベントを発生させる方法はないでしょうか? 'System.Windows.Forms.PictureBox' に 'PerformClick' の定義が含まれておらず、型 'System.Windows.Forms.PictureBox' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

  • C#プログラムにて

    C#プログラムにて お世話になります。 C#初心者です。 プログラムコードを書き始めで、早速行き 詰っています。 ステップでコードの動きを確認したところ、 program.csのMainから下記のForm1.csに 移りForm1のデザイナが表示されるのですが、 button3を押してもForm3が表れません。 また、ステップの黄色いカーソルと言いますか ステップの位置情報も消えています。 何がどう悪いのか分からなく困っています。 どなたかご親切な方、ご教授頂きたく 宜しくお願い致します。     記 using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { Form3 cForm3 = new Form3(); cForm3.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { DialogResult ans; ans = MessageBox.Show("最新のコード表を照会しますか?", "Microsoft Visual Studio", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (ans == DialogResult.OK) Application.Exit(); } private void button12_Click(object sender, EventArgs e) { Form4 cForm4 = new Form4(); cForm4.ShowDialog(); } } }