CodeZine(コードジン)

特集ページ一覧

SQLiteで“おこづかいちょう”

SQLite、C++/CLI、C#で実用(?)アプリケーションを作る

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/05/14 14:00
目次

UIの実装(C#)

 最後にUIをC#で実装します。C++/CLIアセンブリがデータベースとの仲介を行ってくれるので、用意されたメソッドを適切に呼び出すだけです。

MainForm.cs
using System;
using System.Windows.Forms;

using CashBookModel;

namespace NSCashBook {

  public partial class MainForm : Form {

    private CashBook cb_;
    private int balance_;

    /// <summary>
    /// Recordを列挙する
    /// </summary>
    private void OnRecordEnumeration(object sender, EventArgs e) {
      // 列挙開始: ListViewを空にして、積算値(balance_)をクリア
      if ( e is EnumStart ) {
        lvw_book.Items.Clear();
        btn_remove.Enabled = false;
        balance_ = 0;
        lvw_book.BeginUpdate();
      } else
      // 列挙終了: 最上部の年/月と残額を更新
      if ( e is EnumEnd ) {
        lbl_balance.Text = balance_.ToString() + "円";
        lbl_date.Text = pck_date.Value.ToString("yyyy年 MM月");
        lvw_book.EndUpdate();
      }
      // 列挙: 受け取ったRecordからListViewItemを構築し、ListViewに追加
      else {
        Record rec = e as Record;
        ListViewItem item = new ListViewItem();
        item.Text = rec.date.ToString("yyyy/MM/dd");
        item.Tag  = rec.key; // キーをTagに埋め込む
        item.SubItems.Add(rec.summary);
        balance_ += rec.amount; // 残額を積算
        // 金額の正負に応じてSubItemを組立
        // 正なら"もらった"カラム/負なら"つかった"カラム
        if ( rec.amount > 0 ) { 
          item.SubItems.Add(rec.amount.ToString());
          item.SubItems.Add("");
        } else {
          item.SubItems.Add("");
          item.SubItems.Add((-rec.amount).ToString());
        }
        item.SubItems.Add(balance_.ToString());
        lvw_book.Items.Add(item);
      }
    }

    // コンストラクタ
    public MainForm() {
      InitializeComponent();
      // CashBookを生成し、列挙ハンドラを登録
      cb_ = new CashBook();
      cb_.SetRecordListener(this.OnRecordEnumeration);
    }

    private Record prepareRecord() {
      Record rec = new Record();
      rec.date    = pck_date.Value;
      rec.summary = txt_summary.Text;
      return rec;
    }

    // [つかった]ボタン
    private void btn_outgo_Click(object sender, EventArgs e) {
      Record rec = prepareRecord();
      if ( int.TryParse(txt_amount.Text, out rec.amount) ) {
        rec.amount = -rec.amount; // 金額の符号を反転して
        cb_.AddRecord(rec); // レコード挿入
      }
    }

    // [もらった]ボタン
    private void btn_income_Click(object sender, EventArgs e) {
      Record rec = prepareRecord();
      if ( int.TryParse(txt_amount.Text, out rec.amount) ) {
        cb_.AddRecord(rec); // レコード挿入
      }
    }

    // 起動直後に一度だけ
    private void MainForm_Load(object sender, EventArgs e) {
      // 現在の月/日でレコード列挙
      DateTime dt = DateTime.Now;
      cb_.EnumRecords(dt.Year,dt.Month);
    }

    // DateTimePickerの値更新
    private void pck_date_ValueChanged(object sender, EventArgs e) {
      // DateTimePickerにセットされた月/日でレコード列挙
      DateTime dt = pck_date.Value;
      cb_.EnumRecords(dt.Year,dt.Month);
    }

    // ListViewアイテム選択
    private void lvw_book_SelectedIndexChanged(object sender, 
                                                   EventArgs e) {
      // 選択アイテムがあれば[けす]ボタンを有効に
      btn_remove.Enabled = lvw_book.SelectedIndices.Count != 0;
    }

    // [けす]ボタン: レコード削除
    private void btn_remove_Click(object sender, EventArgs e) {
      // ListViewで選択されたレコードを削除
      foreach ( ListViewItem item in lvw_book.SelectedItems ) {
        cb_.RemoveRecord((int)item.Tag); // 削除キーはTagに
                                         // 埋め込まれている
      }
    }

  }
}

おわりに

 いかがでしょうか、SQLiteをはじめとして、C/C++世界には魅力的なライブラリがたくさん蓄積されています。C++/CLIで包み込むことでUI構築の楽なC#/VBからそれらを利用でき、お手軽にWindowsアプリケーションの体裁を整えられます。ゼヒお試しを。

サンプル・プロジェクト
 添付されたサンプル・プロジェクトには"おこづかいちょう"の全ソースの他、C++/CLIで実装したフォームも用意したのでVisual C++ 2008 Expressでも試せます。おまけにC++およびC++/CLIによるSQLiteサンプルを同梱しました。
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • επιστημη(エピステーメー)

    C++に首まで浸かったプログラマ。 Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"り わんくま同盟でたまにセッションスピーカやったり 中国茶淹れてにわか茶人を気取ってたり、 あと Facebook とか。 著書: - STL標準...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5