Entry search

第14回 日記アプリケーションを作る ―その10 アプリケーションとして整える

ようやく日記アプリケーションがほぼできあがった。今回は少し残っている問題の修正と、プログラムとしてのまとめをして、胸を張って人に使ってもらえるアプリケーションに仕上げることにする。

【問題修正】日記を追加した後、リストに表示されない問題

実は現在のアプリケーションでは日記の追加をした後、一覧画面に戻っても追加された日記がリストに追加されていない。なぜだろうか?

それは日記一覧を取得する処理がアプリケーションの起動時 (listForm_Load)にしか行われていないからだ。これを解決するには「入力画面」を表示して、入力処理が終わったあとに「日記一覧を取得する処理」を起動すればいい。

では、まずこの「日記一覧を取得する処理」を作成しよう。と言ってもlistForm_Loadで行っている処理を関数としてまとめるだけである。

listForm.vb

    Private Sub listForm_Load(ByVal sender As Object, …
        Dim filepath As String = "\My Documents\MyDiary\"
        If Not Directory.Exists(filepath) Then
            Directory.CreateDirectory(filepath)
        End If

        Me.diaryArrayList = New System.Collections.ArrayList()

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

        Me.diaryList.DataSource = Me.diaryArrayList

        Me.loaddiary()

    End Sub

    Private Sub loaddiary()
        Dim filepath As String = "\My Documents\MyDiary\"
        If Not Directory.Exists(filepath) Then
            Directory.CreateDirectory(filepath)
        End If

        Me.diaryArrayList = New System.Collections.ArrayList()

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

        Me.diaryList.DataSource = Me.diaryArrayList

    End Sub

※変更履歴(2006年12月8日)
以下のように修正しました。

●2行目の空行の欄
追加:Dim filepath As String = "\My Documents\MyDiary\"
※文字赤字、取消線あり

●3行目
誤:If Not Directory.Exists(folderpath) Then
正:If Not Directory.Exists(filepath) Then

●4行目
誤:Directory.CreateDirectory(folderpath)
正:Directory.CreateDirectory(filepath)

●10行目
誤:Directory.GetFiles(folderpath, "*年*月*日.txt")
正:Directory.GetFiles(filepath, "*年*月*日.txt")

●23行目の空行の欄
追加:Dim filepath As String = "\My Documents\MyDiary\"

●24行目
誤:If Not Directory.Exists(folderpath) Then
正:If Not Directory.Exists(filepath) Then

●25行目
誤:Directory.CreateDirectory(folderpath)
正:Directory.CreateDirectory(filepath)

●31行目
誤:Directory.GetFiles(folderpath, "*年*月*日.txt")
正:Directory.GetFiles(filepath, "*年*月*日.txt")

続けて、入力画面を表示した後にこの処理を呼ぶようにコードを追加しよう。

listForm.vb

    Private Sub editdiary(ByVal editdate As String)
        Dim myeditForm As New editForm
        myeditForm.opendateString = editdate
        myeditForm.ShowDialog()
        loaddiary()
    End Sub

    Private Sub editMenu_Click(ByVal sender As System.Object, …
        Dim myeditForm As New editForm
        If Me.diaryList.SelectedIndex >= 0 Then
            myeditForm.opendateString = Me.diaryList.SelectedItem.ToString()
            editdiary(Me.diaryList.SelectedItem.ToString())
        End If
        myeditForm.ShowDialog()
    End Sub

listForm.vb

    Private Sub newMenu_Click(ByVal sender As System.Object, …
        Dim myeditForm As New editForm
        myeditForm.opendateString = Today.ToString("yyyy年MM月dd日")
        myeditForm.ShowDialog()
        editdiary(Today.ToString("yyyy年MM月dd日"))
    End Sub

ここでも、2箇所入力画面を呼び出している箇所があるので、まとめて1箇所にした。これで、日記を追加したあとにきちんとリストが更新できるようになった。

【機能追加】Action ボタンで日記を表示したい

日記を見るのにソフトキーを押すのもいいが、カーソルで選択してActionボタンを押したら日記を表示できたら非常に使いやすくなる。

これを実装するには2つの更新を行えばいい。

まず、日記を表示する処理を作成する。これは既にできているものを関数化してまとめればいい。

listForm.vb

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

    Private Sub viewdiary()
        If Me.diaryList.SelectedIndex < 0 Then
            Return
        End If
        Dim myviewForm As New viewForm
        myviewForm.diarylist = Me.diaryArrayList
        myviewForm.index = Me.diaryList.SelectedIndex
        myviewForm.ShowDialog()
    End Sub

そして、Actionボタンを押された時のイベント処理でこの処理を呼べばいい。実はActionボタンとはEnterキーを押したことと同じなのだ。だからEnterキーを押したときの処理を行えばいい。

コード画面の左上にあるプルダウンリストから「diaryList」を選び、右のリストからは「KeyDown」を選択する。これでリストボックスの上でキーを押されたときの処理を実装できる。

listForm.vb

    Private Sub diaryList_KeyDown(ByVal sender As Object, ByVal e As …
        If e.KeyCode = Windows.Forms.Keys.Enter Then
            viewdiary()
        End If
    End Sub

この処理が呼ばれると、引数の「e」に押されたキーが格納されてくる。そこで、そのキーコードを調べて、Enterキー(Windows.Forms.Keys.Enter)かどうか調べてやればいい。もちろんこの処理を応用すれば、他のキーに対する処理を個別に実装することができる。

【問題修正】大きな画像を読み込むとエラーが発生する

現在のコードでは大きな画像ファイルを読み込むとメモリエラーが発生する。アプリケーションが落ちてしまってはよろしくない。こういった場合はきちんとエラーをチェックし、エラーが発生したら、きちんと処理をして、アプリケーションが落ちないようにする必要がある。

ではファイルの読み込み処理にエラー対応の処理を追加しよう。

editForm.vb

    Private Sub pictureMenu_Click(ByVal sender As System.Object, …
               :
        If ret = Windows.Forms.DialogResult.OK Then
            Try
                Me.loadpicture(OpenFileDialog1.FileName)
            Catch ex As Exception
                Windows.Forms.MessageBox.Show( _
                    "ファイルが読み込めませんでした")
            End Try
        End If
    End Sub

エラーが発生する、loadpicture関数を周りをTry~Catch構文で囲っている。こうすると、もしloadPicture関数でエラーが出ると、そのままCatchの下の処理(メッセージの表示)を行う。問題がなければCatch下の処理は無視してEnd Try以降の処理を続けるようになる。

01s.png

アイコンを作る

さて、このままでは、殺風景なアイコンしかW-ZERO3の画面上で作られない。ここはかわいいアイコンを作ってアプリケーションを絞めることにしよう。

「プロジェクト」メニューから「新しい項目の追加」を指定して「アイコンファイル」をMyDiary.icoで作成する。

02s.png

後はここにアイコンを作っていこう。現状では16色の16x16ドットのアイコンと32x32ドットのアイコンが用意されている。もし256色のアイコンが作りたいなら、「イメージ」メニューから「新しいイメージタイプ」を選択して、「16×16、256色」や「32×32、256色」を選んで追加しよう。

03.png

後は画面にアイコンを描いていく。

04.png

作成が終わったら「ファイル」メニューから「MyDiary.icoの保存」で保存する。
最後に、「プロジェクト」メニューの「プロパティ」を選択して設定しよう。「アプリケーション」タブの「アイコン」欄のドロップダウンから「MyDiary.ico」を選択する。

05s.png

これでアプリケーションのアイコンを変更することができた。

06s.png

リリースコンパイル

実は今までは、「Debugモード」でコンパイルを行ってきた。このDubugモードの場合、プログラムを停止させて内部の変数等を確認できる代わりに、そのための余分なコードが埋め込まれている。実際にリリーする場合は余分なコードなので、最後に配布するためには 「Release モード」でコンパイルをしておこう。

モードの変更は「構成マネージャ」から行うことができる。初めに「ビルト」メニューから「構成マネージャー」を選択する。「構成マネージャ」ダイアログが表示されたら「アクティブ ソリューション構成」のドロップダウンを「Release」に変更すればいい。最後に「閉じる」ボタンを押して設定を終了しよう。

7as.png

また、下図のようなツールバーが表示されていたら、ドロップダウンを「Debug」から「Release」に変更するだけでもいい。後は、同じようにコンパイルする。

07s.png

アプリケーションが完成したら必ずReleaseモードでコンパイルしておこう。

なお、作成されたファイルは、プロジェクトフォルダの下の「bin」フォルダの下の「Debug」もしくは「Release」フォルダに配置されている。実行ファイルを取り出したかったらこのフォルダから探すといい。同じフォルダにある 「MyDiary.pdb」は実行時には不要である。

08s.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/26 12:23

Track back URL

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

Track backs: