Entry search

第13回 日記アプリケーションを作る ―その9 閲覧機能の実装

前回までで入力機能の実装はほぼ完了した。後は閲覧機能を残すのみとなったわけである。とりあえず今回の閲覧画面のデザインは簡易的なものを用意しているが、ここはそれぞれの腕の見せ所である。
では、閲覧画面の実装を考えていこう。

しくみを考える

閲覧画面は、ある意味楽である。日記を読み込んで表示すればいいわけだから、入力画面でやった日記の読み込み機能と基本的には変わらない。

一覧画面から、表示する日付を指定したら、閲覧画面(viewForm)に渡して、閲覧画面ではその日付の日記を読み込み表示する。

日記を表示するための処理

まずは、日付を渡される準備をしておこう。第11回で行ったのと同じだ。ソリューションエクスプローラのviewFormを右クリックして「コードの表示」を選択してコードを表示しよう。そして以下のコードを追加する。

Imports System.IO
Public Class viewForm
    Public opendateString As String
End Class

またファイルの扱いになるので、System.IOの宣言をしている。

では続けて読み込み処理を実装しよう。第11回でも行ったのと同じようにFormのLoadイベントに読み込み処理を実装する。コード画面の左上にあるプルダウンメニューから「(viewForm イベント)」を選択し、右側からは「Load」を選択する。すると viewForm_Loadメソッドが表示されるので以下のコードを実装する。

    Private Sub viewForm_Load(ByVal sender As Object, …
        loaddiary()
    End Sub
Private Sub loaddiary() ' textBox のクリア Me.titleLabel.Text = "" Me.contentText.Text = "" Me.monthLabel.Text = DateTime.Parse(opendateString).ToString("MMMM") Me.dateLabel.Text = DateTime.Parse(opendateString).Day.ToString() 'ファイルパスの取得 Dim filepath As String filepath = Me.getFilePath() + ".txt" 'ファイルの有無のチェック If File.Exists(filepath) Then ' 読み込みのためにファイルを開く Using sr As New StreamReader( _ filepath, _ System.Text.Encoding.GetEncoding("Shift-JIS") _ ) ' テキスト読み込み Me.titleLabel.Text = sr.ReadLine() Me.contentText.Text = sr.ReadToEnd() End Using End If filepath = Me.getFilePath() + ".jpg" Me.loadpicture(filepath) End Sub Private Sub loadpicture(ByVal filepath As String) If File.Exists(filepath) Then Dim bmp As System.Drawing.Bitmap bmp = New System.Drawing.Bitmap(filepath) Me.contentPicture.Image = bmp Else Me.contentPicture.Image = Nothing End If End Sub Private Function getFilePath() As String Dim filename As String filename = "\My Documents\MyDiary\" + opendateString Return filename End Function

ずらっとコードが出ているが、実は見てみると分かるようにほとんどは編集機能を実装した際の内容から持ってきたものである(loaddiary関数にまとめている)。getFilePathの中身の一部と、titleText がtitleLabelに変更。そして、日付表示のためのコードを追加しているだけである。

続けてこちらを呼び出す機能を実装する。listFormのコード画面を表示して以下のコードを追加する。

    Private Sub viewMenu_Click(ByVal sender As System.Object, …
        If Me.diaryList.SelectedIndex < 0 Then
            Return
        End If
        Dim myviewForm As New viewForm
        myviewForm.opendateString = Me.diaryList.SelectedItem.ToString()
        myviewForm.ShowDialog()
    End Sub

この機能も「編集」機能とあまり変わらない。違いがあるのは、閲覧機能の場合はリストに何もなければ表示しないため判定してreturnしている。Return関数はこの時点でこの後の処理をすべてせずにこの関数を終了するものである。

一度テスト実行して動作確認をしておこう。

「次へ」と「前へ」をどう実装するか(準備編)

さて、問題はここからである。日記の次へ、前へという機能であるが、これを実装するためには、既存の日記の一覧が必要になる。

そこで、この閲覧画面のはじめに日記の一覧を作成するのも手だが、日記の一覧はそもそも一覧画面でチェックしているはずだ。そこで、日記の一覧をチェックする際に、日記のリストを作成して、閲覧画面を表示する際にはこの一覧を渡すようにしよう。

まずは、viewForm側に以下のコードを追加しよう。

Imports System.IO
Public Class viewForm
    Public diarylist As System.Collections.ArrayList
    Public index As Integer
    Public opendateString As String
        :

ArrayListは名前のとおりリストを扱うための変数だ。一覧画面からこのdiaryListに渡すことになる。そしてもう1つの変数indexはリストの何番目を指定したかも渡してもらうための変数である。

では、今度はlistForm側でリストを作成して渡す処理を実装してみよう。

Imports System.IO
Public Class listForm
    Private diaryArrayList As System.Collections.ArrayList

まずは、リストのための変数を準備している。

続けてリストを作成しよう。ファイルから日記一覧を作成しているところでリストの作成をする。

    Private Sub listForm_Load(ByVal sender As Object, …Me.diaryArrayList = New System.Collections.ArrayList()

        For Each file As String In _
            Directory.GetFiles(folderpath, "*年*月*日.txt")
            Dim datename As String
            datename = Path.GetFileNameWithoutExtension(file)
            Me.diaryList.Items.Add(datename)
            Me.diaryArrayList.Add(datename)
        Next

        Me.diaryList.DataSource = Me.diaryArrayList

    End Sub

まずは、空のリストを作成する(New System.Collections.ArrayList() )。そして、リストボックスに項目が付いていた部分を削除して、このリストに追加するように変更している。ただしこのままでは、リストボックスに一覧が追加されない。そこで最後に、リストボックスとこの作成したリストを紐付ける。こうするとまとめて登録できるほか、リストを変更するとリストボックスの内容も変更される。これをバインドと呼ぶ。

さて、リストが完了したので最後に閲覧画面を表示する際にリストと、リストの何番目が選択されているのかを渡すように変更しよう。

    Private Sub viewMenu_Click(ByVal sender As System.Object,…
        If Me.diaryList.SelectedIndex < 0 Then
            Return
        End If

        Dim myviewForm As New viewForm
        myviewForm.opendateString = Me.diaryList.SelectedItem.ToString()
        myviewForm.diarylist = Me.diaryArrayList
        myviewForm.index = Me.diaryList.SelectedIndex
        myviewForm.ShowDialog()
    End Sub

先ほどは日付の文字列を渡していたが、今度はリストを渡すことに変更している。と、いうことで、今度は受け入れ側も修正しなければならない。

続いてviewForm側のコードの修正である。

    Private Sub loaddiary()

        '日付の取得
        opendateString = diarylist(index).ToString()

        ' textBox のクリア
        Me.titleLabel.Text = ""
        Me.contentText.Text = ""
            :

リストから、日付を取り出す処理を追加している。リストからの内容の取得は リスト(番号) の形で取得する。

ここで一度実行してテストをしてみよう。コードをいろいろ変更したが、基本的には同じ結果となるように変更しているので動作は変わらないはずだ。

「次へ」と「前へ」をどう実装するか(実装編)

さて、本題の次へ、前への機能の実装である。基本的にリストと、インデックスがあるので話は簡単である。インデックスを変えてやればいいだけだ。

閲覧画面のデザイン画面を表示して、「前の日記」メニューをダブルクリックして、以下のコードを実装しよう。

    Private Sub previousMenu_Click(ByVal sender As System.Object, …
        If index > 0 Then
            index = index - 1
            loaddiary()
        End IfEnd Sub

リストのインデックスを1つ減らせばよいだけだが、マイナスになってはいけないので事前にチェックしている。インデックスを変えたら、loaddiaryを呼び出して表示を変更する。

同じく「次の日記」メニューも同じように変更する。

    Private Sub nextMenu_Click(ByVal sender As System.Object, …
        If index < diarylist.Count - 1 Then
            index = index + 1
            loaddiary()
        End If
    End Sub

同じくオーバーフロー処理をしている。まず、オーバーフロー処理にはリストの個数が必要だが、これはdiarylist.Countで取得できる。気をつけるのは、indexが0からスタートするということである。つまり5個の日記リストがあった場合、diarylist.Countは5となるが、indexは0から4までとなる。そのためdiarylist.Count - 1と比較しているのである。

テスト

さて、実行してみよう。リストから日記を選んで、「日記の表示」を選んで日記が表示されることを確認しよう。また、「前の日記」「次の日記」を押して日記が切り替わること、を確認しよう。

01s.png

まとめ

これで日記アプリの完成である!しかし、まだ油断してはいけない。たとえば何箇所にも同じコードが書かれているとか、まだ動きとしておかしい部分もある。またアプリケーションとしてもきちんと抑えておくべき点がある。

次回はこういった問題1つひとつチェックして修正していこう。完成までもう一息だ。

<執筆者プロフィール>

高橋 忍
元は、某重工業メーカにて航空機の自動操縦システムのソフトウェア 開発に従事。 その後、マイクロソフトにて開発サポート、コンサルタントを経て、 現在はエバンジェリストとして開発者に新しい技術を紹介している。難しい技術を楽しくわかりやすく伝えるのがモットー。
http://blogs.msdn.com/shintak/

高橋 忍のブログ
http://blogs.msdn.com/shintak/default.aspx
MSDN eye: 第 8 回「Windows Mobile 開発」
http://www.microsoft.com/japan/msdn/eye/

<書籍情報>

Windows Mobile 5.0のアプリケーション開発について、もっと詳しく知りたくなったら

Windows Mobile 5.0 アプリケーション開発 Beginner's Book

Windows Mobile 5.0 アプリケーション開発 Beginner's Book

高橋 忍・著/280ページ/2色印刷/B5変形/CD-ROM付
価格3129円(税込)/ISBN4-7741-2891-0/技術評論社・刊
発売日・2006年9月22日

This article posted by staff on 2006/10/26 12:22

Track back URL

http://www.willcom-fan.com/adm/mt-tb.cgi/161

Track backs: