第5回 初めてのWindowsアプリの開発連載:簡単! Visual Studio 2017入門(4/5 ページ)

» 2017年06月09日 05時00分 公開
[かわさきしんじInsider.NET編集部]

Timerコンポーネントのイベントハンドラーを追加する

 ここまでに作成したプログラムの時刻が更新されない理由は、時刻更新のTimerコンポーネント(「secTimer」オブジェクト)と時刻表示のLabelコントロール(「timeNow」オブジェクト)が結び付けられていないからである。この結び付けは「イベント」という機能を利用することで実現できる。

 イベントとは、前述したように、フォームやコントロール、コンポーネントなどのオブジェクトが発行するメッセージのことである。このイベントが発生したときに実行されるイベントハンドラーと呼ばれるメソッド(=イベントを処理するためのメソッド)を、[プロパティ]ウィンドウの[イベント]項目で設定できる。これによって設定されたイベントハンドラーを通じて、オブジェクトとオブジェクト(この例では「secTimer」と「timeNow」)を結び付けることが可能となる。

 よって、Timerコンポーネント(「secTimer」オブジェクト)は1秒ごとに時間経過のイベントを発行するので、それを処理するイベントハンドラーのメソッドを追加する必要がある。

 次の画面は、実際に[プロパティ]ウィンドウのイベント項目にイベントハンドラーとなるメソッドを追加しているところだ。

TimerコンポーネントへのTickイベントのイベントハンドラーの追加 TimerコンポーネントへのTickイベントのイベントハンドラーの追加
[プロパティ]ウィンドウのイベント項目にイベントハンドラーとなるメソッドを追加しているところ。
(1) Timerコンポーネントオブジェクトのイベントを編集するために、Windowsフォームの下にあるTimerコンポーネント(この例では「secTimer」オブジェクト)を選択する。
(2) [プロパティ]ウィンドウの[イベント]ボタンをクリックする。すると、下にある表にイベント項目がリストされる。
(3) [動作]カテゴリーの中にある[Tick]項目(=Tickイベント:時間経過のイベント)に「secTimer_Tick」を設定する。といっても、手動で入力する必要はなく、[Tick]と書かれた項目部分をダブルクリックすることで、自動的に「secTimer_Tick」メソッドが設定される。設定されると、そのメソッドのソースコードがコードエディタによって自動的に開かれる。

 [プロパティ]ウィンドウのイベント項目の[動作]カテゴリーの中にある[Tick]という項目部分(=時間経過のイベント)をダブルクリックすると、Tickイベントのイベントハンドラーとして「secTimer_Tick」メソッドが自動的に追加される(追加されるメソッドの命名パターンは「<オブジェクト名>_<イベント名>」という形式になる)。

 メソッドが追加されると、次の画面のように、コードエディタによってそのメソッドのソースコードが表示される。

Tickイベントのイベントハンドラーとして追加されたsecTimer_Tickメソッド Tickイベントのイベントハンドラーとして追加されたsecTimer_Tickメソッド
[プロパティ]ウィンドウの[Tick]イベント項目をダブルクリックすると、自動的にsecTimer_Tickメソッドが追加されて、コードエディタにそのメソッドのソースコードが表示される。

 自動追加されたTickイベントのイベントハンドラーは次のようなものだ。

private void secTimer_Tick(object sender, EventArgs e)
{

}

自動追加されたTickイベントのイベントハンドラー

 このsecTimer_Tickメソッドは、第1パラメーター(object sender)に「イベントの送り主」が渡される(本稿の例では、TimerコンポーネントであるsecTimerオブジェクト)。また、第2パラメーターには「Tickイベントに関連付けられたデータ」が引き渡される(具体的にはSystem名前空間のEventArgsクラスのオブジェクトだが、実はこのオブジェクトには実質的なイベントデータが何も格納されていない)。なお、これらのパラメーターは使う必要がなければ、使わなくてよい。

 Tickイベントにより、このメソッドが1秒ごとに呼び出されることになるので、このメソッドの中に「Labelコントロールのテキストに時刻の文字列を設定する処理」(この処理については後述する)を追加すればよい。これにより、1秒ごとにLabelコントロールの時刻表示が更新されるはずだ(つまり、ここで初めて「secTimer」オブジェクトと「timeNow」オブジェクトが結び付けられる)。

 しかし、よく考えてみると、「時計」アプリを起動してから1秒が経過するまでは、時刻表示が更新されずに、先ほどのLabelコントロール(「timeNow」オブジェクト)のTextプロパティで設定した「12時34分 56秒」が表示されてしまうことになる。そこで、Windowsフォーム(「Display」クラスのインスタンス)が起動したときにも、同じように時刻表示の更新を行いたい。

 以上を踏まえた上で、Windowsフォームの起動時に時刻表示を更新する処理を追加してみよう。

Windowsフォームのイベントハンドラーを追加する

 Windowsフォームの起動時に時刻表示を更新するには、WindowsフォームのLoad(=起動)イベントのイベントハンドラーに、TimerコンポーネントのTickイベントと同じ「時刻の文字列を設定する処理」を追加すればよい。

 WindowsフォームのLoadイベントのイベントハンドラーも、[プロパティ]ウィンドウのイベント項目の[動作]カテゴリーの中にある[Load]項目をダブルクリックすると、Loadイベントハンドラーとして「Display_Load」メソッドを自動的に追加できる(追加されるメソッドの命名パターンは「<クラス名>_<イベント名>」の形式)。

 しかし、Loadイベントのイベントハンドラーは、もっと手軽に追加できる。実は、次の画面のように、Windowsフォームをダブルクリックするだけで自動的に追加できるのだ。なお本稿の例では、Labelコントロールがフォーム全体を覆い尽くしているので、タイトル部分をダブルクリックする必要がある(間違って、Labelコントロールをダブルクリックしないように注意すること)。

WindowsフォームのLoadイベントに対するイベントハンドラーの追加 WindowsフォームのLoadイベントに対するイベントハンドラーの追加
Windowsフォームをダブルクリックすると、Loadイベントのイベントハンドラーのメソッドが自動的に追加され、そのメソッドのソースコードがコードエディタに自動的に表示される。なお本稿の例では、Labelコントロールがフォーム全体を覆い尽くしているので、タイトル部分をダブルクリックする必要がある。

 メソッドが追加されると、次の画面のように、コードエディタによってそのメソッドのソースコードが表示される。

Loadイベントのイベントハンドラーとして追加されたDisplay_Loadメソッド Loadイベントのイベントハンドラーとして追加されたDisplay_Loadメソッド
Windowsフォームをダブルクリックすると、自動的にDisplay_Loadメソッドが追加されて、コードエディタにそのメソッドのソースコードが表示される。

 自動追加されたLoadイベントのイベントハンドラーは次のようなものだ。

private void Display_Load(object sender, EventArgs e)
{

}

自動追加されたフォームのLoadイベントのイベントハンドラー

 先ほどのTimerイベントと同様、Display_Loadメソッドの第1パラメーター(object sender)には「イベントの送り主」が渡される(本稿の例では、WindowsフォームであるDisplayオブジェクト)。また、第2パラメーターには「Loadイベントのデータ」が引き渡される(具体的にはSystem名前空間EventArgsクラスのオブジェクト)。

 Loadイベントにより、このメソッドが起動時に呼び出されることになるので、このメソッドの中に「Labelコントロールのテキストに時刻の文字列を設定する処理」(この処理については後述する)を追加すればよい。これにより、起動時にもLabelコントロールの時刻表示が更新されるはずだ。

 以上で、設計した通りの、1秒ごとに時刻表示を更新する「時計」アプリが実現できるだろう。

 しかしここでさらに考えてみると、LoadイベントとTickイベントのイベントハンドラーには、「Labelコントロールのテキストに時刻の文字列を設定する処理」という、全く同じ処理が存在する。よって、この2つの処理を1つのメソッドにまとめることができるはずだ。次に、複数の処理を1つのメソッドにまとめる方法を解説する。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。