第5回 初めてのWindowsアプリの開発:連載:簡単! Visual Studio 2017入門(5/5 ページ)
.NETのWindowsアプリ開発を学びたいが、何から手を付ければよいのか? そんなときは、こんなアプリ開発から始めてみよう!
複数の処理を1つのメソッドにまとめるには?
それでは、「Labelコントロールのテキストに時刻の文字列を設定する処理」を実行する1つのメソッドを作成してみよう(メソッドの定義方法については、第3回の「メソッドを定義するには?」を参照)。
まずはメソッドの名前を決定しよう。このメソッドは、「Labelコントロールのテキストに時刻の文字列を設定する処理」という内容なので、ディスプレイ領域(=Display)の時刻テキスト(=Time)を設定(=Set)する処理という意味で「SetDisplayTime」というメソッド名にしよう。
次に、メソッドのパラメーター(入力)と戻り値(出力)を決めよう。どのような入力が必要だろうか? 例えば、現在の時刻を入力値として受け取ることが考えられるだろう。だが、現在の時間はメソッドの中で取得すればよいので、わざわざ入力パラメーター(=引数)として受け取る必要性はない。そこで本稿では、パラメーターに何も受け取らないことにする(もちろん入力パラメーターとして現在の時刻を受け取るというメソッド仕様でも全く問題はない)。
また、このメソッドにはどのような出力が必要だろうか? 例えば、時刻テキストの設定に成功したか失敗したかという結果を戻り値として返すことが考えられるだろう。だが、時刻文字列の取得やLabelコントロールへのテキスト設定が失敗する可能性はほぼゼロだと思われるので、成功/失敗という情報を返す必要性はないと考えられる。そこで本稿では、戻り値は何も返さないことにする(もちろん、例えばディスプレイに設定した時刻を戻り値として出力しても間違いではない)。
このようにして、メソッドの状況を考えながら、パラメーターと戻り値を決定してメソッドを定義していく。今後、メソッドの定義を行う際の参考にしてほしい。
以上により決定したメソッドの定義は次のようなものになる。
private void SetDisplayTime()
{
}
このメソッドはパラメーターを持たず、値を返さない。
メソッドの前にあるprivate修飾子(VBではPrivate修飾子)はアクセシビリティーを指定するためのものだ(アクセシビリティーについては、第4回の解説を参照していただきたい)。ここでは、他のクラスからこのメソッドを呼び出す必要はないので、クラス内でのみのアクセスを許可するprivate修飾子を指定している。
そして、これをDisplay.csファイルのDisplayクラスの定義内に追加する。SetDisplayTimeメソッドは、Displayクラスで内部的に利用するprivateなメソッドなので、その内容を定義しているスコープ内に記述する必要がある。ここまでの手順に従って作業をしていれば、Display.csファイルにはDisplayコンストラクタ、イベントハンドラーであるsecTimer_Tickメソッド、同じくイベントハンドラーであるDisplay_Loadメソッドが含まれていて、カーソルはDisplay_Loadメソッドのスコープの内部にある。
そこでカーソルをDisplay_Loadメソッドのスコープの直下に移動するなどして、Displayクラスの定義内かつ他のメソッドの定義外で次のように入力していけばよい*3。
*3 コードエディタにDisplay.csファイルのコードが表示されていなければ、[Display.cs]タブをクリックするか、ソリューションエクスプローラーに表示されているツリーから[Display.cs]を選択して[コードの表示]ボタンをクリックしよう。その後、適切な位置にカーソルを移動する。
DisplayクラスにSetDisplayTimeメソッドを追加
(1) secTimer_Tickメソッドのスコープ。
(2) Display_Loadメソッドのスコープ。
(3) SetDisplayTimeメソッドのスコープ。カーソルが他のメソッドのスコープ内にあれば、その外に移動して、上述のコードを入力する。このとき、「private」の「p」を入力した時点で入力候補がポップアップ表示される。また、開きかっこを入力すると対になる閉じかっこが自動的に入力される。このような入力支援機能については次回紹介するので、取りあえずはそのまま入力しよう。
このメソッドの中に、「Labelコントロールのテキストに時刻の文字列を設定する処理」を実装すればよいので、最終的なメソッドの実装は次のようになる。
private void SetDisplayTime()
{
timeNow.Text = DateTime.Now.ToString("HH時mm分 ss秒");
}
timeNowオブジェクト(Labelコントロール)のTextプロパティ(テキスト)に、System名前空間のDateTime構造体のNowプロパティの値を、ToStringメソッドにより時刻表示用に文字列化して設定している。
System名前空間は、ソースファイルの冒頭に「using System;」というコードにより宣言されているので、ここには記述されていない(詳しくは第4回の解説を参照)。Nowプロパティの値は、現在時刻が設定されたDateTime構造体のオブジェクトである。ここでは、そのオブジェクトが持っているToStringメソッドを呼び出すことで、オブジェクトが持つ値を文字列に変換している。
DateTime.Now.ToStringメソッドのパラメーターに指定されている「HH時mm分ss秒」という記述は「書式指定文字列」と呼ばれるもので、この文字列中の「HH」「mm」「ss」が自動的に数字に置き換わり、例えば「20時15分56秒」のような通常の時刻表示テキストとなる(詳しくは「.NET TIPS:日付や時刻を文字列に変換するには?」を参照されたい)。
なお構造体とは、(現段階では)クラスと同じものだと認識しても問題ない。もちろん詳しく見れば、この両者には機能面に違いがあるということも頭の片隅に置いておいてほしい(詳しくは「改訂版 C#入門」の「値型と参照型」の項を参照していただきたい)。
それでは、このSetDisplayTimeメソッドをLoadイベントとTickイベントのイベントハンドラーで使用してみよう。
イベントハンドラーで自作メソッドを使用するには?
自作メソッドの使用方法は特に難しくない。LoadイベントとTickイベントのそれぞれのイベントハンドラーで、SetDisplayTimeメソッドを呼び出すだけだ(メソッドの呼び出し方法については、第3回の「定義済みのメソッドを使用するには?」を参照されたい)。具体的には、次の画面のように記述すればよい。
それぞれのイベントハンドラーでのメソッドの呼び出し
LoadイベントとTickイベントの各イベントハンドラーの中でSetDisplayTimeメソッドを呼び出して、「Labelコントロールのテキストに時刻の文字列を設定する処理」を実現している。
そして、ここまでに作成したプログラムをビルドして実行したのが次の画面である。
ここまでに作成したプログラムをビルドして実行した画面
ここまでのコーディング作業で完成したプログラムの実行画面。プログラムの実行については、第1回の「生成されたプログラムを動かす」を参照してほしい。
(1) WindowsフォームのOpacityプロパティに「50%」を指定したため、半透明となり背景が薄く見える。時刻も正常に1秒ごとに更新される。
以上で「時計」アプリは完成である。
ここまでに作成したC#のソースコードは以下のリンクからダウンロードできる。
また、VB開発者の参考のために、VB 2017のソースコードも用意した。
以上で「時計」アプリのプログラミング作業を通して、開発者の目的通りのアプリを完成させることができた。これをきっかけに、さまざまなアプリ開発に乗り出してほしいと思う。次回はIntelliSenseなど、開発者がより効率的にコーディングを行えるよう、VS 2017のIDEが提供している機能を取り上げることにする。
Copyright© Digital Advantage Corp. All Rights Reserved.