第7回 Windowsアプリのデバッグ&リリース連載:簡単! Visual Studio 2017入門(3/6 ページ)

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

アプリを閉じる機能の実装

 [終了]がクリックされたときに発生するClickイベントを処理するためのメソッド(Clickイベントハンドラー)を追加する。これには、次の画面のように、メニュー項目の[終了 (X)]をダブルクリックするだけでよい。

[終了]項目のClickイベントハンドラーの追加 [終了]項目のClickイベントハンドラーの追加
Clickイベントハンドラーを追加するには、メニュー項目の[終了]をダブルクリックするだけだ。

 これにより、次のメソッドがフォーム(=Displayクラス)のソースコードに追加される。

private void menuItemClose_Click(object sender, EventArgs e)
{

}

空のmenuItemClose_Clickメソッド

 [終了]がクリックされると、このmenuItemClose_Clickメソッドが呼び出される。よって、先ほど調べたアプリを終了する方法(フォームを閉じるメソッド=Form.Closeメソッド)を、このメソッドの中に記述すれば、[終了]がクリックされたときにフォームが閉じられ、アプリが終了するようになる。具体的には次のようなコードを記述すればよい。

private void menuItemClose_Click(object sender, EventArgs e)
{
  // フォームを閉じる → アプリを終了する
  this.Close();
}

menuItemClose_Clickの実装

 上記のコードにある「this」(C#の場合。VBでは「Me」)は、自分自身のオブジェクト、つまり(Formクラスを継承した)Displayクラスのインスタンスを意味する。よって「this.Close()」というコードは、DisplayオブジェクトのCloseメソッドを呼び出すという意味になる。

 なおVS 2017では、この「this.Close()」と記述する際、「this.」と入力すると、そのthis(=Displayオブジェクト)に含まれるメンバーの一覧が自動的に表示される。前回も簡単に説明したが、これはIntelliSense(インテリセンス)と呼ばれる機能である。IntelliSenseは、[Ctrl]+[Space]キーを押すことで、手動でも表示できる。また、文字の入力途中で[Ctrl]+[Space]キーを押すと、コードの入力を補完してくれる。IntelliSenseを使いこなせば開発生産性を高められるので、ぜひ使い慣れてほしい。

VS 2017のIntelliSense(インテリセンス)機能 VS 2017のIntelliSense(インテリセンス)機能
IntelliSenseは、基本的にIDEによって自動的に表示されるが、[Ctrl]+[Space]キーを押すことで、手動でも表示できる。いったんIntelliSenseを閉じてしまった後に、IntelliSenseを再表示したい場合には[Ctrl]+[Space]キーを利用すればよい。

 以上で、アプリを終了する機能を実装できた。これを再度ビルドして実行すると、今度は実際にアプリが終了するようになったはずだ。

 次に、「フォームがフェードアウトしながら終了する機能」を実装しよう。

フォームのフェードアウト機能の実装

 ここでは、フォームのフェードアウトを行う、次のようなシグネチャのメソッドを追加しよう(ソースコードに書き込めばよい)。

private void FormFadeOut()
{

}

フォームをフェードアウトさせる機能を実装するFormFadeOutメソッドのシグネチャ

 このFormFadeOutメソッドに、フォームをフェードアウトさせる機能を実装する(後述)。

 FormFadeOutメソッドの追加が終わったら、先ほど実装した「アプリを終了する処理」の前に、そのFormFadeOutメソッドを呼び出すようにしよう。具体的には、次のようなコードになる。

private void menuItemClose_Click(object sender, System.EventArgs e)
{
  // フォームをフェードアウトさせる
  FormFadeOut();
  // フォームを閉じる → アプリを終了する
  this.Close();
}

menuItemClose_Clickメソッド内へのFormFadeOutメソッドの追加

 仕上げとして、実際のフェードアウト処理をFormFadeOutメソッド内に記述する。フェードアウトとは徐々にウィンドウが見えなくなっていくことなので、現在50%の不透明度(第5回の解説でOpacityプロパティを50%に指定した)を49、48、47……と、1ずつ減らしていけばよい(不透明度が減っていく=透明になっていく)。ただし、コンピュータ(CPU処理)のスピードは非常に速いので、単に減らすだけだと、あっという間に0%まで減ってしまう。そこで、1%減るごとに1ミリ秒だけ処理を停止することにしよう(処理の停止には、System.Threading名前空間に所属するThreadクラスの静的メソッドSleepを使えばよい)。これにより少し時間をかけてフェードアウトするようになる。

 このフェードアウト処理を実装したのが、次のコードである(実はコード内に正しくない部分があるが、これは以降の説明のための故意の誤りである)。

private void FormFadeOut()
{
  for (int n = 49; n >= 0; n++)
  {
    // 49%から1%ずつ不透明度を少なくする(=透明になる)
    this.Opacity = (double)n / 100;
    // 1%減るごとに1ミリ秒処理を停止する
    System.Threading.Thread.Sleep(1);
  }
}

フォームをフェードアウトさせる機能を実装するFormFadeOutメソッドの実装

 ここまででコーディングは完了である。

 早速、完成したソースコードをビルドしたら[Ctrl]+[F5]キーを押すかメニューバーから[デバッグ]−[デバッグなしで開始]を選択して実行してみよう。実行した「時計」アプリのフォーム上で右クリックしてコンテキストメニューを表示し、そのメニューから[終了]を選択すると、次の画面のように、アプリがフリーズして「応答なし」の状態になってしまった。これは先ほど実装したコードに何らかのバグがあるためと考えられる。

バグのあるプログラムの実行画面 バグのあるプログラムの実行画面
バグのあるプログラムを実行したところ。また、そのアプリを強制終了しているところ。
(1) [終了]を実行すると、アプリがフリーズして「応答なし」の状態になってしまう。
(2) アプリを終了するには、[Ctrl]+[Alt]+[Del]キーを押してメニューから[タスク マネージャー]を選択すると(あるいは、タスクバーを右クリックしてコンテキストメニューから[タスク マネージャー]を選択すると)表示される[タスク マネージャー]の[プロセス]タブから終了したいアプリのプロセス(この例では「MyClock」)を選択する。
(3) [タスクの終了]ボタンをクリックすれば、選択したアプリが強制終了する。

 このアプリには、「バグ(Bug)」があるためそれを取り除く「デバッグ(Debug)」が必要となる。よって次に、そのデバッグ方法について解説する(バグの箇所はお気付きの方も多いだろうが、ここでは目をつぶっていていただきたい)。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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