タイマーを使って時刻を表示してみよう

2014年5月8日(木)
薬師寺 国安

前回は、初めてWindows ストア アプリを作ってみました。100行には到底及ばない数行のプログラムコードでしたが、このようにしてコードを記述していく、という手順が理解できてもらえていれば良いかと思います。

そこで、今回は前回よりちょっとだけ、本当にちょっとだけですが、手の込んだアプリを作成してみましょう。タイマーを使って現在の時刻をリアルタイムに表示させるアプリです。

ただし、前回作ったWindows ストア アプリや今回作るタイマーで時刻を表示するアプリそのものは、Windows ストアの審査には通りません。すべてのアイコンを作成して完璧な状態で申請しても、リジェクトされてしまうのは明白でしょう。なぜならアプリ自体に「有用性」と「価値」がないと見なされるからです(詳細についてはまた別の回で触れたいと思います)。

今回はWindows ストア アプリの作り方を学ぶためのものですので、Windows ストアで審査に受かるかどうかは、いったん頭から外しておきましょう。

ではまず初めにプロジェクトを作成しましょう、今回は「MakingTimer」という名前にしました。

デザイン画面にコントロールを配置する

前回と同じようにデザイン画面上にTextBlockをドラッグして配置します。プロパティの「名前」に「showTimeTextBlock」と指定し、他のプロパティの設定は前回と同じにしておきます(図1)。

図1 TextBlockコントロールを配置して各プロパティを設定した
図1 TextBlockコントロールを配置して各プロパティを設定した

また、XAML内のGrid要素をViewBox要素で括り、Grid要素のBackgroundプロパティを削除しておくのも前回と全く同じ手順です。

時刻を表示するコードを書いてみよう

ソリューションエクスプローラー内のMainPage.xamlを展開して、MainPage.xaml.vbを表示します。このファイルをダブルクリックしてコードエディターを起動します。

前回解説した方法でリスト1のコードを生成します。ページがアクティブになった時のコードです。

リスト1 ページがアクティブになった時のコード

Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
        MyBase.OnNavigatedTo(e)
    End Sub

さて、Windows ストア アプリでタイマーを使うにはどうすればいいでしょうか? ちょっとWebで調べてみましょう。下記URLを見るとSystem.Windows.Threading名前空間に含まれる、Dispachertimerクラスが必要なことがわかります(図2)。

http://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatchertimer(v=vs.110).aspx

図2 タイマーに関するクラスを表示したページ
図2 タイマーに関するクラスを表示したページ

Windows ストア アプリで使用するクラスは、必ず何らかの名前空間の配下にあります。タイマーを使うためにはDispacherTimerクラスを使用します。タイマーを使用して時刻をリアルタイムに表示するコードはリスト2のようになります。

リスト2 時刻をリアルタイムに表示するコード

Public NotInheritable Class MainPage
    Inherits Page
    Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
        Dim myTimer As New DispatcherTimer
        myTimer.Interval = New TimeSpan(0, 0, 1)
        AddHandler myTimer.Tick, Sub()
                                     showTimeTextBlock.Text = DateTime.Now.ToString
                                 End Sub
        myTimer.Start()
        MyBase.OnNavigatedTo(e)
    End Sub
End Class

リスト2を実行すると、一瞬TextBlockの文字が表示されて、その後時刻が1秒刻みでリアルタイムに表示されます(図3)。最初に一瞬だけ表示されるTextBlockの文字を消すには、XAML内のTextBlockのText=”TextBlock“の個所を削除しましょう。

図3 1秒おきに時刻が表示される
図3 1秒おきに時刻が表示される

では、リスト2のコードを細かく見ていきましょう。

まず、DispacherTimerクラスの新しいインスタンスmyTimerオブジェクトを作成します。次にmyTimerオブジェクトのIntervalプロパティにイベントの発生間隔を設定します。この場合はTimeSpanを使って1秒と指定しました。TimerSpanの書式は下記の通りです。

TimeSpanの書式

TimerSpan(時間,分,秒)

次にAddHandlerステートメントで、指定したタイマーの間隔が経過し、タイマーが有効である場合に発生するTickイベントに、イベントハンドラを指定します。イベントハンドラ内では、showTimeTextBlock内に、DateTime.Now.ToStringと指定して現在の「年/月/日/時/分/秒」を表示させ、Startメソッドでタイマーをスタートさせます。これで、1秒間隔で現在の時間がリアルタイムに表示されます。

この時刻の表示を「2014年02月16日09時42分44秒」といった形式で表示させることもできます。その場合はshowTimerTextBlockに指定する値をリスト3のように記述します。

リスト3 表示させる時刻を「年月日時分秒」の形式で表示する

AddHandler myTimer.Tick, Sub()
        showTimeTextBlock.Text = DateTime.Now.ToString(“yyyy年mm月dd日hh時mm分ss秒”)
     End Sub

実行すると図4のように表示されます。

図4 現在の時刻を「年月日時分秒」で表示した
図4 現在の時刻を「年月日時分秒」で表示した

VS2012までは、タイマーを使用する際には、リスト4のようにImports文を使って名前空間を読み込む必要がありました。しかしVS2013においては、この名前空間の読み込みは不要になっています。この名前空間をImports文で読み込むと、System.Theadingに置き換えられます。デフォルトでDispacherTimerクラスの使用が可能になっているのです。リスト4はVS2012でタイマーを使う際の書き方です。

ただし、VS2013ですべての名前空間の読み込みが免除されているのかというと、決してそうではありません。クラスを使用する場合には基本的にImports文で名前空間を読み込む必要があります。

リスト4 名前空間を読み込む書き方

Imports System.Windows.Threading
Public NotInheritable Class MainPage
    Inherits Page
    Protected Overrides Sub OnNavigatedTo(e As NavigationEventArgs)
        MyBase.OnNavigatedTo(e)
    End Sub
End Class
  • タイマーを使って時刻を表示するプログラム

    『Windows ストア アプリ 100行プログラミング』 第3回のサンプルプログラムです。
薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています