Visual Basic 入門講座
VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

第4回 イベントを逃すな

この記事が対象とする製品・バージョン (バージョンの確認方法)

VB2019 Visual Basic 2019 ◎ 対象です。
VB2017 Visual Basic 2017 ◎ 対象です。
VB2015 Visual Basic 2015 ◎ 対象です。
VB2013 Visual Basic 2013 ◎ 対象です。
VB2012 Visual Basic 2012 ◎ 対象です。
VB2010 Visual Basic 2010 ◎ 対象です。
VB2008 Visual Basic 2008 ◎ 対象です。
VB2005 Visual Basic 2005 ◎ 対象です。
VB.NET 2003 Visual Basic.NET 2003 △ 対象外ですがほとんどの操作は同じなので参考になります。
VB.NET 2002 Visual Basic.NET (2002) △ 対象外ですがほとんどの操作は同じなので参考になります。
VB6対応 Visual Basic 6.0 × 対象外です。

入門講座の第4回では「イベント」について説明します。前回の「プロパティ」と今回の「イベント」の概要が分かれば、あともう少しで最低限必要な知識はそろいます。がんばって習得してください。

概要

・イベントが発生すると自動的にイベントハンドラーが実行される

・イベントハンドラーの作り方

・画像ファイルを表示させる

 

1.どこにプログラムするのか

 

たとえば、画像を表示するプログラムを作りたいと思ったとして、画像を表示させる方法はインターネット等で検索すればすぐ分かります。多分次のようなコード(プログラム)を発見することでしょう。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019


Me.BackgroundImage = Image.FromFile("C:\Windows\Web\Wallpaper\Windows\img0.jpg")

■リスト1

Me (Me = ミー)はこの場合はフォームのことです。BackgroundImage(読み方:BackgroudImage = バックグラウンドイメージ)は 背景画像をあらわすプロパティです。

でも、このプログラムを一体どこに書けばよいのでしょうか?

「イベント」をよく理解すればこういった問題で悩むことはあまりなくなります。これを読んでいる方はまだイベントについて何も知らないはずなので、丁寧に順を追って説明しましょう。

問題は「画像をいつ、どのタイミングで表示したいか?」ということです。

フォームが表示されたときはじめから画像を表示したいのか、それとも、ボタンが押されたときに表示したいのか、それともフォームをクリックしたら表示するのか…などなどです。

このようなタイミングのことを「イベント」といいます。

この例では「フォームが表示された」、「ボタンが押された」、「フォームをクリックした」などがイベントです。そしてイベントごとにプログラムを書く場所はある程度限定されます。

 

2.Clickイベント

 

では、具体的にプログラムしてみましょう。まずはボタンが押されたときに画像が表示されるようにしましょう。

「ボタンが押された」というイベントはClickイベント (読み方:Click = クリック)と呼びます。

ボタンがクリックされたときに何かを実行するというプログラムは入門講座でも既に登場しています。今回は「イベント」の視点で改めて眺めてみることにします。

 

まず、新しいWindowsフォームアプリケーションをを作成してください。

Windowsフォームアプリケーション

■画像1:新しいプロジェクトを作成した直後

 

そしてフォームにボタンを1つ貼り付けてください。

フォームにButtonを1つ貼り付けたところ

■画像2:ボタンを貼り付けた状態

 

このボタンがクリックされたらフォームに画像を表示することにします。

 

ボタンをダブルクリックしてください。そうすると、画面がコードエディターに切り替わります。

この操作はこれまでの入門講座でも何回かやっていますね。

 

ボタンをダブルクリックすることで次のコード(プログラム)が自動的に生成されますので、ボタンをダブルクリックするという手順がとても重要です。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

End Sub

■リスト2:ボタンのClickイベントハンドラー

このプログラムはボタンがクリックされたときに実行されます。これをクリックイベントのイベントハンドラーと呼びます。

 

このプログラムは自動生成しないで自分でキーボードから同じように入力しても構いませんが、なかなか記述量が多いので、自分でキーボードで入力する人はまずいません。

操作方法 画面を切り替える方法

イベントハンドラーを自動生成しないで、単にデザイン画面とコードエディタを切り替えたいだけの場合は、画面上部のタグをクリックします。

タブ

 

この自動生成されたコード(プログラム)の中でイベントハンドラーとして重要なのは Handles Button1.Click です(読み方:Handles = ハンドルズ、Click = クリック)。これが付いているので、Button1をクリックしたときにこのイベントハンドラーが実行されます。

 

もっとわかりやすくこれがButton1のクリック時に実行されるコードだと表示することもできます。やってみましょう。

みなさんの画面にはナビゲーション バーが表示されているでしょうか?

バージョンによって少し違うのですがナビゲーションバーはコードエディタの一番上に表示されている下の画像で示す領域です。

コードエディターの上部にナビゲーションバーが表示されている

 

もし、表示されていないならば[ツール]メニューの[オプション]から、テキストエディター - Basic と展開し、ナビゲーション バーをチェックしてから OK をしてください。

ナビゲーションバーの表示設定

これをチェックするとコードエディターにナビゲーション バーのが表示されます。

 

ナビゲーション バーは現在テキストのカーソル(点滅する | )がある位置のプログラムの位置づけを示しています。Private Sub Button1_ClickからEnd Subの間の行をクリックするなどして、上の画像でいうところの3行目から6秒行目のどこかにテキストのカーソルがある状態にしてください。

ナビゲーション バーには Button1 と Click が表示されます。それで、これがButton1をクリックしたときに実行されるイベントハンドラーであるということがわかります。ナビゲーションウィンドウは何かと便利なのでこのあとは表示したままにしておいてください。

参考:ナビゲーション バー

https://docs.microsoft.com/ja-jp/visualstudio/ide/navigating-code?view=vs-2019#navigation-bar

 

さて、それではここに先ほどの画像を表示するプログラムを書いてみましょう。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Me
.BackgroundImage = Image.FromFile("C:\Windows\Web\Wallpaper\Windows\img0.jpg")

End
Sub

■リスト:ボタンをクリックするとフォームに C:\Windows\Web\Wallpaper\Windows\img0.jpg を表示する。

ここでは仮に「img0.jpg」という画像ファイルを指定しています。これはWindowsの標準の壁紙なので多くの環境に存在すると思います。画像はパソコンの中にある普通の画像ファイルであればだいたい使えるのでみなさんのお好みの画像を指定してください。指定できる画像の形式はbmp、gif、jpeg、png、tiffです。

実際に実行して試してみてください。

 

ここでのポイントは、

イベントが発生したらイベントハンドラに記述したプログラムが実行される

ということです。

 

3.イベントハンドラーの作り方

 

3−1.ナビゲーションバーによるイベントハンドラーの生成

今度はMouseHoverイベント (読み方:MouseHover = マウスホバー) のイベントハンドラーをプログラムしてみましょう。

MouseHoverイベントはマウスカーソルが上に来ると発生するイベントです。クリックしなくてもマウスカーソルを重ねるだけで発生します。

コードエディターのナビゲーションバーを使ってイベントハンドラーを生成してみましょう。

真ん中のドロップダウンリストでButton1が選択されていなければ選択してください、そして右のドロップダウンリストからMouseHoverを選択してください。

右のドロップダウンリストを展開するとたくさん選択肢が出てきますが、これは全部Button1で使用できるイベントなんです。

ナビゲーションバーでButton1 MouseHoverを選択

メモ メモ  -  古いバージョンのナビゲーションバー

古いバージョンのVisual Basicではナビゲーションバーにドロップダウンリストが2つしかありません。左でButton1を選択し、右でMouseHoverを選択してください。

古いバージョンのナビゲーションバー

MouseHoverを選択するとMouseHoverのイベントハンドラーが次のように自動生成されます。

 

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_MouseHover(sender As Object, e As EventArgs) Handles Button1.MouseHover

End Sub

Handlesの後ろがクリックイベントのときはButton1.Clickだったのに、今度はButton1.MouseHoverになっています。

 

マウスが上に来たらボタンを光らせてみましょう。次のようにプログラムしてください。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_MouseHover(sender As Object, e As EventArgs) Handles Button1.MouseHover

    Button1.BackColor = Color.Yellow

End Sub

実行して、ボタンの上にマウスを持っていくと、ボタンの色が黄色くなるのが確認できます。

でも、マウスをボタンの外に移動しても色は元に戻りません。MouseHoverイベントが発生したらボタンの色を黄色にするというプログラムはしているのに、マウスが外にでていったら元の色に戻すというプログラムをしていないからです。マウスが外に出て行くときにはMouseLeaveイベント(読み方:MouseLeave = マウスリーブ)が発生しますからこのイベントを使いましょう。

3−2.プロパティウィンドウによるイベントハンドラーの生成

ナビゲーションバーでMouseLeaveイベントのイベントハンドラーを生成しても良いのです、勉強のためプロパティウィンドウを使ってやってみます。

デザイン画面に切り替えてButton1を選択してください。プロパティウィンドウでButton1が選択されている状態でイベントボタンをクリックしてください。

プロパティウィンドウにButton1で使用できるイベントの一覧が表示されます。

説明どおりにやっている場合、ClickイベントとMouseHoverイベントにはイベントハンドラーが表示されていますが、それ以外のイベントには何も設定されていない状態になっています。

プロパティウィンドウのイベント一覧

ここでMouseLeveを探して、ダブルクリックしてください。

そうするとMouseLeaveイベントハンドラーが生成されます。下記のようにプログラムしてください。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Button1_MouseLeave(sender As Object, e As EventArgs) Handles Button1.MouseLeave

    Button1.BackColor = SystemColors.Control
    Button1.UseVisualStyleBackColor = True

End Sub

元の色がWindowsの視覚スタイルを利用したコントロール用の表示なので、黄色にするときより少しプログラムが増えています。私が説明したいのはイベントなので、このプログラムについては深入りしませんように。

これでマウスがボタンの外に出るとボタンの表示は元に戻ります。1度実行してみてください。

3−3.イベントハンドラーの作り方まとめ

ここまででイベントハンドラーの作り方を3つ説明しました。簡単に振り返っておきます。

1つ目は、デザイン画面でコントロールをダブルクリックする方法です。この方法だとそのコントロールで最もよく使うであろうイベントハンドラーが生成されます。ボタンの場合はクリックイベントです。

2つ目は、ナビゲーションバーからイベントを選択する方法です。

なお、上述の説明ではナビゲーションバーの中央のドロップダウンリストでButton1を選択したからButton1のイベントハンドラーが生成されているのですが、フォームのイベントだけはナビゲーションバーの真ん中のドロップダウンリストでフォームではなく「(Form1のイベント)」のように書いてあるものを選択することで選択できるようになります。

 

 

そして3つ目はプロパティウィンドウをイベント一覧に切り替える方法です。

 

まだ紹介していない方法もあります。たとえば、イベントハンドラーを自動生成しないで自分で入力することもできます。コードエディターでP r v a …と自分で入力して End Subまで入力すれば、それはイベントハンドラーになります。もちろん1文字でも間違えるとイベントハンドラーにならないかもしれません。どこを間違えるかによります。

キーボードで自分で入力する人はプロにもまずいません。でも、Webサイトのサンプルなどをコピー&貼り付けすることはしばしばあります。

 

4.フォームのイベント

 

フォームにも重要なイベントがいくつかあります。こういったことは「習うより慣れろ」です。どんどんいろんなイベントを使ってみましょう。

Windowsフォーム アプリケーションでは文字通りアプリケーションはフォームと共に開始し、フォームを閉じると終了します。

開始と終了に関連する主なイベントは次の4つです。

  イベント 読み方 発生するタイミング
イベント Load ロード フォームがはじめて表示される直前に発生します。
イベント Shown ショウン フォームが表示された直後に発生します。最初に動かしたい処理はこのタイミングでプログラムします。
イベント FormClosing フォームクロージング フォームが閉じる直前に発生します。この段階ではまだ閉じる操作をキャンセルできる場合があります。
イベント FormClosed フォームクローズド フォームが閉じた直後に発生します。最後に動かしたい処理はこのタイミングでプログラムします。

この他にボタンと同じようにClickイベントやMouseHoverイベントなどもあります。

参考:フォームのイベントの一覧

https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.form?view=netframework-4.8#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88

 

デザイン画面でフォームをダブルクリックするとLoadイベントのイベントハンドラーが生成されるため、プログラム開始時に何か処理を行いたい場合はLoadイベントに記述するプログラムが多いです。世の中の書籍やWebサイトを見てもおそらくほとんどの説明が開始時のプログラムを記述する場所としてLoadイベントを紹介していると思います。

しかし、Loadイベントはエラー発生時にエラーに気がつけない場合があるので、私はお勧めしていません。変わりにプログラム開始時に行いたい処理はShownに記述するようにしましょう。

ShownはVB2005で追加されたイベントです。それより前のバージョンでは使用できません。

イベントハンドラーの生成方法はフォームでも同じです。Shownイベントのイベントハンドラーを生成させてみてください。

メモ メモ  -  もう説明済みのつもりですが、その方法がわからなければ・・・

たとえば、デザイン画面でフォームをクリックして、プロパティウィンドウでForm1が選択されている状態にします。その状態でプロパティウィンドウをイベントの一覧に切り替え、ShownをダブルクリックするとShownのイベントハンドラーが自動生成されます。

 

今は退屈ですが、Shownが発生したという出力だけ記述しておくことにしましょう。次のようにしてください。

VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

    Debug.WriteLine("Shownが発生しました。")

End Sub

Debug.WriteLine (読み方:Debug = デバッグ、WriteLine = ライトライン)はちょっとプログラムの確認をするときに便利な機能です。

これを実行すると、出力ウィンドウに指定したメッセージが表示されます。

出力ウィンドウはプログラムを実行中には右下に表示されています。「出力」というタブをクリックすることで他のウィンドウから切り替わります。

表示されていない場合は、[ウィンドウ]メニューでウィンドウレイアウトをリセットするか、[デバッグ]メニューの[ウィンドウ] - [出力] で表示できます。

実行時の出力ウィンドウ

このウィンドウにはいろいろな情報が表示されるため、出力ウィンドウの上側にある「出力元」という部分で内容を切り替えられます。Debug.WriteLineで書き込んだ内容は「デバッグ」を選択すると表示されます。

実行を停止すると下側に表示されています。

デザイン時の出力ウィンドウ

今度はFormClosingイベントとFormClosedイベントも利用して次のようにプログラムしてみてください。

VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Form1_Closed(sender As Object, e As EventArgs) Handles Me.Closed

    MsgBox("フォームが閉じました。")

End Sub

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
   
    MsgBox("フォームが閉じますよ。", MsgBoxStyle.Information)
    MsgBox("本当に閉じますよ!", MsgBoxStyle.Exclamation)

End Sub

これでプログラムを実行してから、フォームの右上の×ボタンでフォームを閉じようとすると3つのメッセージが順番に表示されます。

なお、イベントハンドラー同士はどちらが上にあっても下にあっても実行の順番には影響しません。フォームが閉じる直線に実行されるのがForm1_FormClosingであり、フォームが閉じた直後に実行されるのがForm1_Closedであるというイベントのタイミングに従って実行されます。

イベントハンドラー内のプログラムは基本的には上から下へと順番に実行されます。

 

せっかくなので最初の例で出した画像の表示もプログラムして見ましょう。Form1のShownイベントに次の通り記述してください。

VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown

    Me.BackgroundImage = Image.FromFile("C:\Windows\Web\Wallpaper\Windows\img0.jpg")

End Sub

これでプログラム開始時点から背景に画像が表示されているフォームの完成です。

画像ファイルは実際にみなさんのパソコンに入っているものを指定してください。

 

5.イベントドリブン での 自動処理

 

5−1.イベントドリブン

ここまでの説明で、「どこにプログラムしたらよいのか?」ということはだいたい分かっていただけたと思います。

処理したいタイミングのイベントハンドラーに記述するということです。

このようにイベントが発生するとそれに対応するイベントハンドラーに記述された処理が実行されるという仕組みを イベントドリブン と呼びます。日本語で言うところのイベント駆動という意味です。

Windowsフォームアプリケーションは基本的にイベントドリブンです。

 

5−2.Timerコンポーネント

Windowsフォームアプリケーションで、ゲームのように自動的にどんどん進行していくプログラムを作るには、Timer コンポーネント(読み方:Timer = タイマー)を使うのをお勧めします。

ここで言う「コンポーネント」とはコントロールと同じようなものなのだけど目には見えないものを指しています。TimerコンポーネントはButtonと同じようにツールボックスから配置できます。コンポーネントタブにあります。ただし実行時には目に見えません。

Timerコンポーネントには時間が経つと発生する Tick (読み方:Tick = ティック)というイベントがあります。どのくらい時間が経つとTickイベントが発生するかはIntervalプロパティ(読み方:Interval = インターバル)で設定できます。

ためしにフォームにTimerコンポーネントを配置してみましょう。コンポーネントは配置するとフォームの下側に表示されます。

Timerコンポーネントがフォームの下側に表示されている

次にプロパティウィンドウを使ってEnabledプロパティをTrueに(読み方:True = トゥルー)してください。

Enabledプロパティは有効/無効の状態を表しています。Trueとはプログラムでは良く出てくるとても重要な値で、「オン」や「有効」、「はい」などの肯定的な意味があります。つまり、EnabledプロパティをTrueにするということの意味はタイマーを有効にするという意味です。

なお、Trueの反対語はFalse(読み方:False = フォルス)です。こちらは「オフ」や「無効」、「いいえ」などの否定的な意味になります。

 

次にIntervalプロパティを 1000 に設定してください。これは1秒ごとにTickイベントを発生させることを意味します。もし、500に設定すると0.5秒後とにTickイベントが発生します。このような単位をミリ秒と呼びます。

そして、Tickイベントハンドラーに次のように記述してみてください。

VB.NET 2002 VB.NET 2003 VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    Me.Text = CStr(Val(Me.Text) + 1)

End Sub

プログラムの内容は今回は説明しませんが、簡単に書くとこのプログラムは Me.Text をTickイベントが発生するたびに +1 するものです。フォームのプログラムではMeとはフォームのことで、そのTextプロパティはタイトルバーに表示されている一連の文字(たとえば「Form1」)を指します。CStr(読み方:CStr = シーエスティーアール)とかVal(読み方:Val = バル)は、値の型を変換するなどしているのですが、型については今後の入門講座で扱います。

実行すると、1秒ごとにタイトルバーがカウントアップしていきます。

メモ メモ

・・・と本文では簡単にプログラムを作っていますが、もうこの操作は自分のものにしたでしょうか?初めて使うコントロールやコンポーネントでも操作は同じです。

まだ入門講座第4回なので念のためこのサンプルを作る動画も掲載しておきます。でも、この時点ではこの操作は自分だけでできるようになっていることを期待しています。

TimerのTickイベントをプログラムする動画

 

このようにTimerを使うと自動的にどんどん処理が進んでいくというプログラムをイベントを使って記述することができます。

なお、TimerのIntervalプロパティはミリ秒単位なので1秒の1000分の1の細かさで指定できますが、あまり精度は高くなく、細かい値を設定しても正確にその通り動いてくれるわけではありません。あくまでTickイベントを発生させるための目安の時間として使ってください。このTimerを利用して時間測定などはしないほうが良いです。