Entry search

第10回 日記アプリケーションを作る ―その6 入力機能の実装

前回はファイル一覧機能を作成したので、今回は入力機能を作成していこう。指定した日付で日記のタイトルと本文を入力・保存し、再度その内容を表示するという機能だ。

仕様の確認とプログラムの内容

さて、ここで第3回に考えた日記アプリケーションの仕様を確認しておこう。

第3回 日記アプリケーションの仕組みを考える
http://www.willcom-fan.com/wzero3/entries/staff/000205/
  • ファイル名は日時にする(例:「2006年12月31日.txt」)
  • ファイルは「\My Documents\MyDiary」の下に保存する
  • 本文の1行目はタイトル、2行目以降は本文とする

以上の仕様にあわせて、今回は入力画面からファイルを保存する機能を追加していこう。ファイルを保存する機能は次の3つのステップを必要とする。

  • 1.保存するファイルパスの作成
  • 2.ファイルがあるかどうかのチェック(ない場合は作成する)
  • 3.ファイルに内容を保存する

では1つずつ機能を追加していこう。

フォルダチェックのプログラム

Visual Studio 2005を起動して準備をしたら、ソリューションエクスプローラから「editForm.vb」をダブルクリックして入力画面を表示する。そして、左ソフトキーの「保存」メニュをダブルクリックしてイベントコードを表示しよう。

まずはファイルパスを作成するコードである。

    Private Sub saveMenu_Click(ByVal sender As System.Object, …
        Dim filepath As String 
        filepath = "\My Documents\MyDiary\"
        filepath = filepath + Me.editDate.Value.ToString("yyyy年MM月dd日")
        filepath = filepath + ".txt"
    End Sub

01.jpg

ファイル名の元となる日付はDateTimePickerコントロールから取得する。

DateTimePicker(editDate)の日付はeditDate.Valueで取得できる。これを文字列にするにはToString関数を使う。このときフォーマットを指定することができるのだ。"yyyy年MM月dd日"とすると2001年1月1日の形式で取り出すことができる。後は上記のように文字列の足し算をするだけだ。

ファイルパス = フォルダパス + ファイル名 + 拡張子

これで、ファイルパスが作成できた。続いてファイルチェックを行う。

ファイルの存在チェックのためのプログラム

ではファイルのチェックプログラムを実装しよう。以下のようにコード追加する。
今回もファイル関連の処理が多いので、Imports句を使ってSystem.IOが省略できるようにしておく。

Imports System.IO
Public Class editForm
    Private Sub saveMenu_Click(ByVal sender As System.Object, …
        Dim filepath As String
        filepath = "\My Documents\MyDiary\"
        filepath = filepath + Me.editDate.Value.ToString("yyyy年MM月dd日")
        filepath = filepath + ".txt"

        If File.Exists(filepath) = False Then
            Dim sw As StreamWriter
            sw = File.CreateText(filepath)
            sw.Close()
        End If

    End Sub
End Class

ファイルがあるかどうかのチェックにはSystem.IO.File.Exists 関数を使用する。もしファイルがあればTrueをなければFalseを返してくる関数だ。

ここではIf文を使って条件判断を行う。File.Exit関数を読んで戻り値がFalseつまりファイルがなかったら空のテキストファイルを作成する処理を行う。テキストファイルを作成するための関数はFile.CreateTextである。

CreateTextでテキストファイルを作成すると、このファイルを扱うためのStreamWriterを返してくる。そのためあらかじめStreamWriterの変数swを作成しておいて戻り値をこのswに保存する。

そして、作成し終わったらその後書き込みができるように一旦ファイルを閉じておく(sw.Close)。

ファイルにテキストを保存する

最後にファイルにテキストを保存する処理を追加しよう。

Imports System.IO
Public Class editForm
    Private Sub saveMenu_Click(ByVal sender As System.Object, …
        Dim filepath As String
        filepath = "\My Documents\MyDiary\"
        filepath = filepath + Me.editDate.Value.ToString("yyyy年MM月dd日")
        filepath = filepath + ".txt"

        If File.Exists(filepath) = False Then
            Dim sw As StreamWriter
            sw = File.CreateText(filepath)
            sw.Close()
        End If

        Using sw As New StreamWriter( _
                filepath, _
                False, _
                System.Text.Encoding.GetEncoding("Shift-JIS") _
                )
            sw.WriteLine(Me.titleText.Text)
            sw.WriteLine(Me.contentText.Text)
            sw.Close()
        End Using
    End Sub
End Class

StreamWriterはファイルを保存するためのオブジェクトである。1つめの引数は保存するファイルパス、2つめの引数はTrueの場合はファイルの追加、Falseの場合はファイルの新規保存になる。3つめの引数はテキストのエンコード方式をしてする。今回はShift-JISで保存する。

そして、StreamWriterのWriteLine関数を使って1行ずつ文字列を保存する。WriteLine関数を使うと1行保存するごとに、改行を自動的に追加してくれる。はじめにタイトルの文字列(titleText.Text)、続けて本文の文字列(contentText.Text)を追加している。

テキスト内容の保存が済んだら、ファイルをクローズするのを忘れないようにしよう。

実行してみる

F5キーを押して実行し、エミュレータでテストしてみよう。一覧画面が表示されたら、「メニュー」の「編集」を選択して入力画面を表示する。

02s.png

DateTimePickerで適当な日付を選択して、タイトルと本文に適当な内容を入力しよう。入力が完了したら左ソフトキーの「保存」メニューを押して日記を保存しよう。数秒たっても反応がなければ保存が完了しているはずだから一度アプリケーションを終了して、もう一度起動してみよう。

今度は保存されたファイルがリストに追加されているはずだ。

03s.png

さて、現在のままだと保存後きちんとファイルが保存されたかどうかわからない。ファイルが保存されればこの画面には用事がないのでこの画面を閉じてしまおう。

    Private Sub saveMenu_Click(ByVal sender As System.Object, …
                :
            sw.Close()
        End Using
        Me.Close()
    End Sub

これで保存完了後、入力画面が閉じる。これは「OK」ボタンを押したのと同じであるため、この後は一覧画面に戻る。

ファイル読み込み機能の追加

さて、DateTimePickerで日付を変更した際に、もしすでに保存してある日記があったらその日記を読み込みたいところだ。ここではそんな機能を追加してみよう。

まず、「editForm」のデザイン画面を表示する。そしてDateTimePickerコントロール(editDate)をダブルクリックする。ここで作成されるイベントはDateTimePickerが変更された場合の処理になる。

日付が変更されたら以下の処理を行っていく。

  • 1.読み込むファイルパスの作成
  • 2.ファイルがあるかどうかのチェック
  • 3.ファイルがあった場合にはファイルから内容を読み込む
  • (ア)1行目を読み込みタイトル欄に記入する
  • (イ)2行目以降を読み込み本文欄に記入する

読み込むファイルパスの作成

まずは読み込むファイルパスを取得するコードを実装しよう。

    Private Sub editDate_ValueChanged(ByVal sender As System.Object, …

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

        'ファイルパスの取得
        Dim filepath As String
        filepath = "\My Documents\MyDiary\"
        filepath = filepath + Me.editDate.Value.ToString("yyyy年MM月dd日")
        filepath = filepath + ".txt"
    End Sub

はじめに内容を書き換える前にテキストボックスのクリア処理をしておく。ファイルがあった場合にはここに追加していき、なかった場合にはクリアのまま入力待ちとなる。

あとは見てのとおり、ファイルを書き込むときのコードと違いはない。同じ処理を2箇所に分けているのもしょうがないので後でまとめることにしよう。

ちなみに「’」で始まっている分は注釈文であり処理とはまったく関係がない。プログラムにコメントをつけるために使うものである。きちんと入れておくと後でプログラムをチェックしやすくなるのでこまめに入れておこう。

ファイルのチェック

続けてファイルチェックのためのプログラムを実装する。

    Private Sub editDate_ValueChanged(ByVal sender As System.Object, …

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

        'ファイルパスの取得
        Dim filepath As String
        filepath = "\My Documents\MyDiary\"
        filepath = filepath + Me.editDate.Value.ToString("yyyy年MM月dd日")
        filepath = filepath + ".txt"

        'ファイルの有無のチェック
        If File.Exists(filepath) Then

        End If
    End Sub

ここも保存処理と同じである。条件文に「=True/False」 がないが、これは「=True」を省略したものである(If文とは本来条件がTrueかどうかをチェックする構文だからである)。

ファイルの読み込み

では肝心のファイルを読み込むコードを実装しよう。

    Private Sub editDate_ValueChanged(ByVal sender As System.Object, …
                :
        'ファイルの有無のチェック
        If File.Exists(filepath) Then
            ' 読み込みのためにファイルを開く
            Using sr As New StreamReader( _
                filepath, _
                System.Text.Encoding.GetEncoding("Shift-JIS") _
                )

                ' テキスト読み込み
                Me.titleText.Text = sr.ReadLine()
                Me.contentText.Text = sr.ReadToEnd()
            End Using
        End If
    End Sub

まず、ファイルを(読み込むために)開くためにStreamReaderオブジェクトを作成する。引数はファイルパスとエンコード形式しかない。ここでエンコード形式を間違えると文字化けを起こしてしまうので注意しよう。

そして、StreamReaderのReadLine関数でファイルから1行読み込む。このあたりもファイルの書き込みと同じような感じである。違いがあるのは本文の読み込みだ。本文は複数行ある可能性がある。そこで、ReadToEnd関数で最終行までまとめて読み込み、TextBoxに格納する。

読み込みテストをしてみよう

それではテストをしてみよう。F5キーを押して実行してみる。「メニュー」から「編集」を選択して入力画面を表示する。
デフォルトでは本日の日付が表示されているはずなので、1日前の日付に変更して、そのまま、適当にタイトルと本文を入力して保存しよう。一覧画面に戻ったらもう一度、「メニュー」から「編集」を選択して入力画面を表示しよう。入力画面が表示されたら、日付を1日前の日付に変更してみよう。保存した文章が読み込まれて表示されるはずだ。

これはDateTimePickerの日付を変更することで、実装したファイルを読み込む機能が実行されていることがわかる。もちろん、日付をテストファイルの2006年1月1日に変更すれば、すでに保存されているテストファイルの内容を表示する。

04s.png

まとめ

保存機能と読み込み機能が追加されてアプリケーションとしてはかなり使いやすくなった。しかし現在のままでは、一覧画面から選んだ日記を表示するといったように、一覧画面と入力画面の連携ができない。

そこで次回は一覧画面で選択した内容を入力画面に引き継ぐ方法について考えてみよう。

<執筆者プロフィール>

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

Track back URL

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

Track backs: