片道9時間の長距離飛行中、ReadMeを更新するために艦むすリストメーカーを動かしていたら、バグを5個も見つけてしまった。久しぶりにプログラミングする時間も確保できたので、さくさく修正。そろそろver.2.0を名乗ってもいいかな?
2017/05/07追記:肝心のソフト入手ページを書き忘れていた。
公開ページ:
ソフトへの直接リンク:
プリセット名を変更しても、コンボボックス記載のプリセット名が変わらない
プリセット名を変更しても、コンボボックス記載のプリセット名が変わらないというバグを見つけた。内部データは書き換わってるので、保存処理には問題ないのだが。
上記バグを早速直す。元コードは以下のとおり。
コーディング時はプリセット名を変更するなんて思っていなかったようで、本当に保存処理しかしていなかった。そこで、保存処理の後にコンボボックスを更新する処理を追加する。残念ながらCComboBoxには項目のテキストを変更する機能が無いので、既存項目を削除してから項目を追加し直すような実装とする。項目削除に伴いコンボボックスの選択が解除されてしまうので、再設定も忘れずにした。
余談:コンボボックス?ドロップダウンリスト?
この記事を書く際にちょっと迷ったのが、このコントロールの名前。「コンボボックス」と「ドロップダウンリスト」のどちらが正しいのだろう?
答えは、「コンボボックス」。ドロップダウンリストは、リストから項目を選ぶ機能しかない。一方、コンボボックスはこれにエディットボックスを組み合わせ(コンボ)たものである(参考:MSDN ドロップダウン リストとコンボ ボックス)
プリセットを削除しても、設定ファイルから削除されない
プリセットをプリセット整理ダイアログ上で削除すると、見た目はプリセットが保存されるのだが設定ファイルからは削除されず、次回起動時にはゴミが居るというバグ。前からあったバグで原因が分からず放置していたのだが、案外あっさり原因が分かった。
Win32APIのWriteProfileStringを呼び出すか、CWinApp::WriteProfileStringを呼び出すかの違いであった・・・。CWinApp::WriteProfileStringは、CWinAppを継承したクラスの変数であるm_pszProfileNameの値により、レジスタに書き込んだり特定の.iniファイルに書き込んだりと動作を変えることができるのだが、::WriteProfileStringはWin.iniにしか書き込めない。そして、バグフィックス前はAfxWinApp()->を付け忘れていたために::WriteProfileStringの方が呼び出されていたのであった・・・。超デンジャラスなミス。
プリセットが一つもない状態での保存や整理実行時の処理
これはバグフィックスというよりは動作の定義。もともとのコードでは、見出し記載の状態では何もしないという処理になっていたが、以下のように修正。
- プリセットが一つもない状態での保存
プリセットに名前をつけるダイアログを呼び出し、OKが押された場合はそのまま保存。 - プリセットが一つもない状態、または無くなった状態での整
削除等により、整理完了時にプリセットが一つもない状態ではプリセット名を空欄にするようにした。
その他バグフィックス
他にも、以下の細かいバグを修正。
- 画像クリアをしても、見た目画像がクリアされていない(内部的にはクリアされている)
- タブオーダーがおかしい。コントロール追加してからいじっていなかった。