<< [NHK] 土曜ドラマ チャレンジド 第2回 - パートナー | main | wxListCtrlとSQLite3を組み合わせて使ってみた(2) >>

スポンサーサイト

一定期間更新がないため広告を表示しています

スポンサードリンク * - * * - * - * web拍手WEB拍手!

wxListCtrlとSQLite3を組み合わせて使ってみた(1)

wxListCtrlSample…wxListCtrlをなめてました。習得するのに非常に時間がかかった。とは言うものの、検索とかも入れないとプロトタイプとしては、片手落ちだな。もう少し、手を入れるか。それにしても、文字コード…嫌になるなぁ。
wxListCtrl全般
double clickでダイアログを出そうと思って嵌る。OnListItemActived を使うらしい。これで、double click と ENTER が打ち込まれたときのイベントを書ける。
Virtual List
情報源が少なめなので、とっつきにくい。表の外見とデータを分けて管理できる。M-VC的なことができる仕組み。wxLC_VIRTUALを指定すると有効になる。ハマリどころは、wxLC_VIRTUALを使うと使えたり使えなかったりするAPIがあるのだが、それが、API上ではよく分からないのだ。
ざっとポイントをまとめると次のようになる。
  • 参照は、 OnGetItemText を継承して実装するような感じ。
  • 要素を追加し終わったら、 SetItemCount で要素数を教える。
  • 要素の削除も、 SetItemCount で要素数を教える。微妙に DeleteItem でもないのがハマリ所。
  • 要素の更新は、 SetItem で行う。微妙に名前で RefreshItem かと思いきや、これは描画を更新するだけで、 OnGetItemText を呼んでくれない。
  • 作っていると、配列のインデックスと内部データのPrimary Keyとがごっちゃになってくるが、Model部とView-Ctrl層でクラスを分離すれば、それなりに綺麗になる。いや、分かっていてもはまる。
std::vectorで指定したインデックスの要素を削除
意外とこういう情報ってないのね。元ネタは、ここだが、変なダイアログが立ちがあるので、無理に参照することはない。

v.erase(v.begin() + 7);

あと、reverse iteratorで、まとめて複数の要素を削除できるかと思ったが、そうでもないらしい。(参照: reverse_iterator を使ってみた・・・)
今回ためしたアプリケーションだと、インデックスアクセスの性能が超重要だから、listやsetは使うわけにはいかないのね。今のところ、追加、削除は多くないと思うので、vectorでいいやという感じ。真面目にやるなら、GAP BUFFERとかを検討した方がいいな。どちらにしても、必要になるまで最適化なんてするものじゃない。

同時更新はどのように振舞うべき?
今のところ、ダイアログは modal な属性で作っているので、更新しようとする時にオリジナルが変更されている事はない。だけど、複数から更新されること場合の考慮がいるなぁ。次の戦略がある。
  1. 必ず、同時に更新されないことを保障する
  2. 前者だと、行ロックをかけることになると思うが、更新する人間が密接に連絡を取れない状況で、ロックを獲得した人がいつロックを解除するのかが分からない(もしくは、ロックの解除を忘れることもあるかもしれない)。
  3. 更新されたことを編集者に教えてあげる
  4. これ、難しいね。更新が1回だけなら、それほど難易度は高くないが、頻繁に更新されると困る。
  5. 分散リポジトリっぽく扱う?
  6. MercurialやGITなどの分散リポジトリのバージョン管理みたく扱う。つまり、オペレーター毎にデータベースを持つ。それらのローカルな更新は、同時更新されないように運用する。共有資源への更新は、オリジナルから変更されていれば、COMMITに失敗させる…とか。
  7. 異なる文書として扱う
  8. まさに、パラレルワールドやね。結局のところ、更新した文書を参照しようとすると、複数の文書が一覧されてくるわけだ。たいていの人は、一つの解しか必要ないから、最終更新日とか、更新した人とか、何かしらの条件で一意になるように検索するわけだね。場合によっては、分岐した文書は、もうselectの対象としないといったマークが必要となるかもしれない。だとしても、その判断自体が共有できるのかオペレーター毎に持つものなのか?
表と検索
正直どうするか悩む。Mozilla Thunderbird とか Becky! とかのメーラーだと検索するウインドウは、別になっているしね。逆にGoogleとかWEB系のは、検索窓は同じウインドウだよね。うーん。別ウインドウで実装するのが妥当だと思えてきた。文書管理ソフトウェアとかだと、自分の知っている情報が殆どだから、検索より分類やタグ付けが主なタスクだよね。だとすると、やはり・・・そうか。
sqlite3_prepareで何故か文字化けするようになった?
SQL INJECTION 対策とかSQL構文上の文字をエスケープするために、 sqlite3_exec を sqlite3_prepare のロジックに置き換えようとしているのだけれど、嵌るねぇ。また、文字化け。
参考
Kai * ソフトウェア開発関連 * 10:05 * comments(2) * trackbacks(0) * web拍手WEB拍手!

スポンサーサイト

スポンサードリンク * - * 10:05 * - * - * web拍手WEB拍手!

コメント

Virtual Listの実装のヒントをこのページで得ました。ありがとうございます。
Comment by 鉄くず @ 2012/06/18 9:25 PM
誰かのヒントになればと思って投稿した記事なので、役立ったのであれば嬉しいです。

これも随分前の記事だ。ざっとぐぐってみたら、今現在も、日本語のページのVirtual Listの情報源って豊富とはいえない感じですね。
Comment by Kai @ 2012/06/21 11:20 AM
コメントする









トラックバック

このページの先頭へ