• 締切済み

RaiseEventのメリット

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

みんなの回答

noname#221368
noname#221368
回答No.2

>RaiseEventを使用しないといけない処理とは、どういうもの?  #1さんはどう思うかわかりませんが、私は、Event化しなければならない処理というものは、とりあえずないと思っています。あなたの疑問は、#1さんの、 >RaiseEvent myTest の部分は、Call GlobalModule.myTest()などで実装できるはずだ、という事だと思います。ここでGlobalModule.myTest()は、GlobalModuleというModule(Bas)の中にある、myTestというSubroutineです。  その通りです。その通りですが、GlobalModule.myTest()は、Global変数(Applicationレベルの変数)を使うようなものです。構造化プログラミングが全盛の頃、「ちゃんと管理された」Global変数の便利さを強調しすぎて、批難ごうごうになった記憶があります。  でもGlobal機構は便利なんですよね。昔はGlobal機構の「ちゃんとした管理」は、全て自前で行う必要がありました。「自前」であるだけに、それはErrorではなく「Bug」の温床だったのです。  状況を複雑にしているのは、VBではGlobalスコープを、そのままでは使用できない事です。それでModuleなどを用意し、そこにPublicな変数や関数を用意して、あたかもGlobalなように扱います。じっさい先のGlobalModule.myTest()は、myTest()で動くはずです。でもこれは利点なんですよ。「呼び出し先を指定しなくても良い」からです。逆に言うと、それが「Bug」の温床になる原因です。  Eventは、ApplicationのGlobal動作の管理機構です。   (1)RaiseEvent myTestは、呼び出し先を指定していないので、Global機構の便利さを、そのまま使えます。   (2)管理は、Public Event myTest()とDim WithEvents oClass as myClassで行います。   (3)EventとWithEventsの対で、どのGlobal関数が、どこへ接続されるかを管理します。  言葉で言うとわかりにくいのですが、必要に応じて(全てをEvent化せよとは、決して言いません)Eventを導入すると、(1)~(3)の効果として、コードに非常にメリハリが付きます。これは小さい事に見えるかも知れませんが、実際上はとても重要な事です。やってみると、わかります。そして(1)~(3)の応用が、Interface(Implements)とDelegateです。  Event Doriven(Eventを使える事)とObject志向は、本来別物ですが、両者は非常に相性の良いものであり、どちらも「プログラマーに楽させる」ために開発されてきた技術です。なので私は、必要に応じてEventは、どんどん使うべきだと思っています。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

コントロールやクラスなどで ユーザー定義のイベントを呼び出す必要がある場合です フォームに貼り付けたボタンなどのClickイベントなどはユーザーが独自にコードを記述できないと面白くありませんよね この場合にコントロール側で RaiseEventをつかってユーザーが作成したClickイベントが呼ばれるようにします 一例です クラスモジュール myClassに Public Event myTest() Public myTask(VyBal nValue as integer)   dim n as integer   for n = 1 to 1000     if n mod navle = 0 then       ' ここでユーザー定義のイベントへ処理を移す       RaiseEvent myTest     end if   next End Sub といったコードがあったとします これを呼び出すフォーム側では Dim WithEvents oClass as myClass Sub Command1_Click() oClass.myTask(100) End Sub Sub Form_load()   Set oClass = new myClass End Sub Sub oClass_mTest()   MsgBox "myClassから呼ばれました" End Sub といったような使い方になります

関連するQ&A

  • 標準モジュールとは??

    独学でVB6を学んでいるど素人です。。標準モジュールとは、コントロールとか使用せず、コードを書くだけの場所なのでしょうか??またどういった時に標準モジュールを使用するのでしょうか??使用するメリットなどはあるのでしょうか??どなたかご指導御願い致します。

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

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

  • C# イベント処理

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

  • VBのフォームモジュールと標準モジュールの使い分け

    VBのフォームモジュールと標準モジュールの使い分けが今一つわかっていません。 フォームモジュールとは、フォーム(画面)上で起こったイベント(例えば、ボタンをクリックした時とか、ユーザーが行を選択したりだとか)の処理を、記述するところと解釈しています。 標準モジュールは、フォームが2つ以上あって、その2つが共通する処理(関数)などを、記述したり、フォームが1つでも、同じ処理を繰り返す場合、その処理を標準モジュールに書いたり・・・・という解釈をしています。 あってますでしょうか? フォームが一つしかない場合、もしくは2つあっても、あまり共通する処理がない場合、なんかは標準モジュールはあまり使わないのでしょうか? それとも、フォームが1つとかでも、今後のメンテの事など考慮して、標準モジュールを作ってそこにグローバル変数なんかで処理を書いた方がよいのでしょうか? どなたか、教えてくださいませんか? いろいろBBSなどで見てみるんですが、いろいろ書いてあって、どれが理想か わかりません。よろしくお願いいたします。

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

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

  • クロージャを利用するメリットについて

    コボラーです。 いや、PHP、Perl、VB、C#、JavaScript、VC++、ActionScript、Java、Objective-Cは書けるけどCOBOLは書けないのでコボラーではありませんね。 モダンなプログラムコードが好きではない、レガシーなプログラマーとしておきましょう。 自己紹介はこれくらいにして・・・ 今までもアチコチで話されていると思いますが、クロージャ(無名関数)を利用するメリットについてです。 ・グローバル変数の数を減らせる ・関数内の変数値を保持しておける この2つのメリットについては理解しました(これがメリットかどうかは別として) その他には ・1回しか利用しない関数に名前を付けなくて済む ・1回しか利用しない関数が、利用する箇所に書かれているので、コードを追っている間に迷子になり辛い こんな意見も見受けられました。 もしかしたらこれは、オブジェクト指向 vs 関数型プログラミングという話しになってしまうかもしれませんが、そもそも1回しか利用しない処理を関数化するメリットってなんでしたっけ? オブジェクト指向で考えれば、1メソッド当たりのコード数は少ない方が良いとされていますので、そもそも無名関数ではなくオブジェクティブな作りにすると思います。 関数型プログラムでは、main処理の中で複数処理するような共通処理部分を関数化し、整理をしていきますよね。 そうなると、どちらにしても「1回しか使わない処理を、そもそも関数化する必要性」が見いだせないのです。 それなのにその部分を無名関数にする必要性は感じられませんでした。 もちろんコールバックに便利とか、イベントリスナーに使うのが便利なのは理解していますし、利用しています。 もし・・・ 利用する理由が「モダンぽくてカッコいいから」というなら、それならそれで構いませんし、それについて自分の意見をぶつけるつもりもありません。 (自分のコードがレガシーでかっこ悪くて無駄だと言われたら、全力で応戦しますが・・・) ぜひ明日から私もついつい使いたくなってしまうようなクロージャの有用な利用法を私に教えて下さい。

  • VBの実行時の処理の流れ(仕組み)について教えて下さい

    WindowsXp-Pro上でVB.NET2003を使用しています。VB.NET初心者です。 VB.NETはコーディング後デバッグを行いエラーがなければ実行される訳ですが、実行時の処理の流れと言うか、仕組みについてご伝授頂きたいと思います。 VB.NETにおいてはオブジェクト指向が進んでおりコーディング作業時は全体の流れを考えなくても、クラス内でのインスタンスやサブルーチン・関数ルーチン、フォームロード時の処理、モジュール内での処理等のコーディングのみを考えていれば実行できるようになっています(少なくとも今まで私が作成したプログラムはそうでした)。しかし、色々なサンプルプログラムを作っているとこれはクラスで指定した方が良い処理とかモジュールで指定した方が良いのではと思うことが多々あります。 プロジェクトやフォーム、クラス、モジュール、コンポーネントクラス、ユーザーコントロール、データフォームウィザード、継承コントロール (これらはVisualStudioの「プロジェクト」メニューをクリックした時の項目です) 等の処理の順序が判っていればもっと効率的な処理を適材適所に配置できるのではないかと思います。 これらをコーディングレベルで結構ですので機械内での処理の順序をご説明頂ければ幸いに思います。現在のところコンピュータは並列処理はできないので必ず優先順位がつくと思うのですが、未熟な為VBの全体像がつかめず処理の流れも判らずにいます。 よろしくお願い致します。

  • VB6.0 ExeとDllの違い

    いつもお世話になっております。 今更ながらなのですがVB6.0について質問させて下さい。 新規でVB6.0を起動すると、「標準Exe」・「ActiveXExe」・「ActiveXDll」・「ActiveXコントロール」等がでてきますよね? 普段アプリを開発する時は「標準Exe」しか使用しないのですが、「ActiveXExe」・「ActiveXDll」・「ActiveXコントロール」の違いは何なのでしょうか?(どういうときに使い分けるのでしょうか?) ActiveXDll・・・ソースコードのみ?参照設定する?(クラスやモジュールと何が違うのでしょうか?) ActiveXコントロール・・・独自のコンポーネント(部品)を作る?(OCXのようなものでしょうか?) ActiveXExe・・・(一番分かりません) どなたかご教示お願いします。

  • クラスモジュール

    私は5年位vbaをやっていますが 標準モジュールとフォームモジュールしか使った事が有りません。 エクセルだったらシートモジュールはあります。 クラスモジュールの存在は知って、 学ぼうと思ったのですが 意味がよくわからない為挫折しました。 でも今自分がやりたい事はクラスモジュールがなくても出来ています。 クラスモジュールを学んで使うと もっと作業が捗るのでしょうか? クラスモジュールを使う事のメリットを教えていただけますか?

  • VBAユーザー関数を外部から制御

    ExcelのVBAで、標準モジュールにワークシートで使うユーザー関数を記述しています。 ユーザー関数は、使い勝手を組み込みのワークシート関数と同様にするため、 Application.Volatile (True) で自動再計算するようにしており、数百カ所以上のセルに使用しています。 しかし、他のVBAモジュールでユーザー関数の戻り値が変わるような操作をすると、その都度 数百か所以上が再計算されるため、非常に時間がかかります。 ユーザー関数のApplication.Volatile (False) にすると瞬間で終了する処理が、数分かかる場合も あります。 他のVBAモジュールから、一時的にユーザー関数の処理内容を変更するようなことは可能でしょうか。

専門家に質問してみよう