UIの実装(C#)
最後にUIをC#で実装します。C++/CLIアセンブリがデータベースとの仲介を行ってくれるので、用意されたメソッドを適切に呼び出すだけです。
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アプリケーションの体裁を整えられます。ゼヒお試しを。
