フレッシュマン企画 連載
簡単!Visual Studio 2005入門

第5回 初めてのWindowsアプリケーションの開発

デジタルアドバンテージ 一色 政彦
2007/07/09

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

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

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

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

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

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

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

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

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

private void secTimer_Tick(object sender, EventArgs e)
{
}

 この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イベントのイベント・ハンドラのメソッドが自動的に追加され、そのメソッドのソース・コードがコード・エディタによって自動的に開かれる。なお本稿の例では、Labelコントロールがフォーム全体を覆いつくしているので、タイトル部分をダブルクリックする必要がある。

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

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

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

private void Display_Load(object sender, EventArgs e)
{
}

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

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

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

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


 INDEX
  [フレッシュマン企画 連載]簡単!Visual Studio 2005入門
  第5回 初めてのWindowsアプリケーションの開発
    1.Windowsアプリケーション開発の手順
    2.コントロールやコンポーネントを配置する
    3.クラスやオブジェクトのプロパティ(性質)を変更する
  4.オブジェクトのイベント・ハンドラを追加する
    5.複数の処理を1つのメソッドにまとめるには?

インデックス・ページヘ  「簡単!Visual Studio 2005入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間