• ベストアンサー

C# イベント処理

C#初心者ですが、イベント処理で困っています。VB6ではフィールドにてEventを宣言し、RaiseEventでイベントを発行し、WithEventsを使って他クラスでそのイベントを受け取る事ができますが、C#でどうしたら良いかわかりません。デリゲートとイベントについて理解が出来ていないので、簡単な参考例で教えて頂けないでしょうか?

  • n4bqv
  • お礼率16% (1/6)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

delegate void update(string message); // Event class talker { public event update changed; public void notify() { changed("Hello!"); // RaiseEventに相当 } } class listener { public void print(string message) { System.Console.WriteLine("event occurred: " + message); } } class foo { public static void Main() { talker t = new talker(); listener l = new listener(); // talkerで発生するEventをlistenerのメソッドprintで受けさせる t.changed += new update(l.print); // Event発行! t.notify(); } }

関連するQ&A

  • VB.NETユーザーイベントの使い道は?

    ユーザーイベントがなくてもデリゲートを使えばいいと思うのですが VB.NETでRaiseEventを使うのはどんなときですか? 内部ではイベントもデリゲートも同じ処理をしているのに わざわざRaiseEventキーワードが用意されているのはそれなりの理由があるんですよね?

  • デリゲートとイベントの関係(VB.NET2005)

    VB2005の本に書いてある内容が理解できません。 誰か助けてください! ---------- イベントとデリゲートの仕組み  .NETイベントが内部ではデリゲートとして処理されることを理解すれば、その威力を存分に引き出すことができます。 もう少し厳密に言うと、イベントを発行するクラスには、そのイベントをサブスクライブするクライアントすべてをポイントする、プライベートデリゲートフィールドが定義されています。 イベントが発行されると、.NETのイベントインフラストラクチャによって該当するデリゲートフィールドのInvokeメソッドが呼び出されます。そして、Invokeメソッドからすべてのクライアントにイベントが通知されます。  このことは、.NET Frameworkで定義されているイベントごとに対応するデリゲートが存在することからもうかがい知ることができます。 [オブジェクトブラウザ]を使用すれば、それを確認できます。 たとえば、第2引数としてEventArgsオブジェクトを受け取るイベントはすべて、内部ではSystem.EventHandlerデリゲートを通じて管理されます。 ほとんどのWindowsフォームコントロールが公開するKeyPressイベントは、KeyPressEventHandlerデリゲートによって処理されますが、このデリゲートは、第1引数としてObject、第2引数としてKeyPressEventArgsオブジェクトを受け取るSubプロシージャをポイントします。 ---------- 全体的にちんぷんかんぷんですが特に「サブスクライブ」などがわかりません よろしくお願いします。

  • 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# イベントハンドラについて

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=70546 ここで紹介されているソースをさんこうにしていたのですが、 public event EventHandler TextBox1Changed; が果たしている役割がよくわかりません。 これは何のためにあるのでしょうか? たとえば、 http://dobon.net/vb/dotnet/vb2cs/event.html コチラのサイトでは、 public event EventHandler Time; と System.Threading.Thread.Sleep(5000); if (Time != null) { Time(this, EventArgs.Empty); } のように書かれていますが、いきなりif (Time != null)を記述してエラーがでないということは、Cのプロトタイプ宣言のような機能を有しているのでしょうか? また、この例ではなにもしないので具体的な使い方もみえてこず、この次の例はすでに理解を超えていてさっぱりわかりません。 イベントハンドラはいったいどのような役割を担っているのでしょうか?

  • eventの概念が理解できません

    こんにちは。オブジェクト志向でVB、C#を学んでいます。デリゲートを理解してeventについて学んでいますが、よく理解できません。 イベントとは、「あるアクションが発生したことを自動的に通知するための仕組み」と本にあります。 さらに、「送信側オブジェクトのイベント(と呼ばれるクラスメンバーに、受信側のイベントハンドラー(と呼ばれるメソッド)を登録します。」とあります。 下記が本に載っているコードです。 私が理解できているのは、 ・戻り値が無し、引数をとらないメソッドを参照するオブジェクト。MyEventHandlerというデリゲートを宣言 ・戻り値が無し、引数をとらないメソッドを参照するオブジェクト。SomeEvent変数を宣言 ・MyEvent型のevt変数の宣言 理解できないのは、 evt.SomeEvent += Handler;。何をやっているかわかりません。 ここをわかりやすくお教え頂けませんでしょうか? using System; //MyEventHandler型を宣言。ここは理解できます。 delegate void MyEventHandler(); class MyEvent{ //イベントの宣言。EventHandler型の変数、SomeEvent。 public event MyEventHandler SomeEvent; public void Fire(){ if(SomeEvent !=null) SomeEvent(); } } class EventDemo{ static void Handler(){ //←イベントハンドラー Console.WriteLine("Event occurred"); } static void Main(){ MyEvent evt = new MyEvent(); evt.SomeEvent += Handler; evt.Fire(); } } また、もう一点お教え下さい。フォーム上のボタンをクリックした時に、メッセージを表示するようなイベントはどのような形で動いているのでしょうか? senderはイベントの発生元のオブジェクトがそのまま入っていて、eはイベントの補足情報が入っているのは理解しました。 ボタンをクリックした時に、ボタンクラスから何らかの情報が送られてきて、それをsenderとeで受取ると思うのですが、これのどこにeventとデリゲートが関わってくるのでしょうか? 何かモヤモヤしてeventがわかりません。 宜しくお願い致します。 private void btn_Click(object sender, EventArgs e) { messagebox.show("hello"); }

  • WaitForMultipleObjectのイベントの処理について

    はじめまして。 現在.NET 2003環境のVC++にて開発を行っています。 そこで知恵をかして頂きたいのですが、 WaitForMultipeObjects関数で待機している場合、 引数で指定している複数のイベントオブジェクトが ほぼ同時にシグナル化した場合、イベントの取りこぼし が発生する場合ってあるのでしょうか。 <例> スレッドA     スレッドB      スレッドC           for(;;){ SetEvent([0])     res = WaitFor...  SetEvent([1])             SleepEx(100, FALSE);           } ・スレッドBが複数のイベントを待機 ・スレッドA、Cがイベント発行 ・この場合、A、Cでほぼ同時にイベントが発生された場合、  (1)A(またはC)発行のイベントを取りこぼす  (2)A(またはC)発行のイベントを処理したのち、   のこりのイベントを再度処理する(for(;;)でループしている為) 取りこぼしの可能性があるとしたら、対応方法もできれば 知りたいです。 以上、よろしくお願い致します。

  • C# のイベントって

    C#を勉強中の者です。 むかし MFC VC++ を少しだけかじったことがありまして、 その中で、ウィンドウメッセージというものをよく利用していました。 C#ではイベントというものをよく利用するようですが、 これは MFC C++ でいうところのウィンドウメッセージと同じようなものでしょうか。 つまり、イベントというのは、メッセージキューにためられたメッセージが処理される際に呼ばれるものなのでしょうか。 仮にそうだとすると、イベントを発行するというのは、ウィンドウメッセージを送るのと同じようなものでしょうか。 ウィンドウハンドルとかないし、違うような気がしますね...。 でも、割り込みというのとは違いますよね...? 入門書は読んだんですが(いくつも読んだわけではないのですが...)、 使い方は書いてあってなんとなく理解はできた一方、 仕組み的なところがしっくりきません。 分かりやすい説明をいただけるとうれしいです。 よろしくお願いします。

  • VB.Netの勉強をしています。

    VB.Netの勉強をしています。 表現が正しくないかもしれませんが VB6.0では、RaiseEventで発生させたイベントをWithEventsで指定した変数に発生させる事が 出来たと思います。 VB.Netで同じことをいたいのですが、どのように実現したらよいかわかりません。 どなたか、教えていただけませんでしょうか。 具体的には  開いているフォーム、ロードしたコントロールすべてに、イベントを通して、更新通知を  知らせてあげたいのですが。  プロパティーを使用する方法等も考えましたが、イベントが綺麗かな~と思いまして。。。

  • C#のフォーム間のイベント駆動

    C#悩んでおります。初心者です。 Form1とForm2があります。 Form1にはピクチャボックスが二つ並んでいて。 Form2にはチェックボックスが二つ並んでいます。 Form2のチェックボックスをオン-オフすると、それぞれのピクチャーのイメージを変更したいのですが、 なにせ、Form2の状況をForm1に知らせる方法がわかりません。 なにやら、デリゲートとイベントを使ってForm1に知らせるらしい、ということまではわかったのですが、具体的にどうやるのかわかりません。 いろいろネットで調べてはいるのですが、Form1,2が分かれていない例や、静的変数を使った例が多く、だめです。 静的だとイベントが発生しないので、イメージを更新するタイミングが無いですし、Form1,2が分かれていない場合を無理やりに分かれて記述すると、必ず記述のエラーが出ます。 どうすればいいのでしょうか?

  • RaiseEventのメリット

    はじめまして。 VBでイベントを発生させる時にRaiseEventを使用しますが このメリットがいまいちよくわかりません。 類似した処理が複数ある場合に一箇所に集中できるメリットが あると聞きましたがそれなら自分でコントロールや標準モジュール、 クラスモジュールに自分で適した関数を作れば良いと 思うのですがRaiseEventを使用しないといけない処理とは どういうものなのでしょうか?

専門家に質問してみよう