Giraffe+ 0.5.18.319

Downloadページへ

前リリースからの変化

  • システムエラー時のエラーメッセージを普通のエラー時と同じような感じにした
  • ShowMenu2で大文字を打つとメニュー内をインクリメンタルサーチするようにしてみた
  • スクリプトの文字列のパース時、\の後の改行を無視するようにした
  • 文字列化された数値に勝手にコンマが挿入されるようになっていたのを修正
  • オートコンプリート後に未選択になるはずのリストボックスが、その前の選択位置のままになることがあったのを修正
  • Object.@を含むメソッドを文字列化できなくなってたのを修正
  • instanceがNULLなPointerオブジェクトのto_Stringがエラーになっていたの修正

システムエラー時のエラーメッセージを普通のエラー時と同じような感じにした

他のエラー時と同じようにgsのコールスタックを見られるように、システムエラーをstd::runtime_errorに変換するようにしました。

ShowMenu2で大文字を打つとメニュー内をインクリメンタルサーチするようにしてみた

ちょっと実験的にやってみたかっただけなので、実用性はありません。入力文字列を表示する機構が無いためです(気が向いたら実装します)。
大文字を打つと、その後にバックスペースが打たれるまで、打たれる文字はインクリメンタルサーチ用の文字と扱われます。F3キーで次を検索、Shift+F3で前を検索となります。
空白区切りのAND検索になるようにするつもりでしたが、面倒だったので空白をワイルドカード扱いした検索にしています。単語の順番が考慮されるということです。

スクリプトの文字列のパース時、\の後の改行を無視するようにした

ヒアドキュメントの実装が面倒だったので、そのまま普通の文字列リテラルをそういうふうに使えるようにしておきました。
文字列リテラル内の改行はそのまま改行として扱われますので、問題は「改行として扱われたくないが改行したいとき」だったわけです。これで一行目だけ開始位置がずれるというのを避けられます。

old: "1st line
2nd line
3rd line"

new: "\
1st line
2nd line
3rd line"

文字列化された数値に勝手にコンマが挿入されるようになっていたのを修正

C++ロケールを日本語にしていたためにそうなっていましたので、C++の数値ロケールのみ旧来のロケールに戻しました。ついでに、日本語を直接指定せず、システムのロケールになるようにしておきました。
日本語を含む文字列をファイルからC++のIostreamで読み取るには、C++ロケールを設定する必要があり、そうしていたのですが、数値を文字列に変換するのにIostreamを使っているboost::formatにも影響が出ていることに気付いてませんでした。
実装はこうです。

std::locale::global(std::locale(std::locale(""), std::locale::classic(), std::locale::numeric));
setlocale(LC_ALL, "");

std::locale::globalはsetlocaleを内部的に呼びますので、setlocaleをその後に呼ばないとCのロケールが、この例では、classic("C")になってしまいます。

オートコンプリート後に未選択になるはずのリストボックスが、その前の選択位置のままになることがあったのを修正

オートコンプリート後のリストアイテムの数に変化が無く、なおかつ、選択されるべきアイテムが無い場合に、選択が解除されるべきでありながら、同じインデックスを選択したままになる、というバグです。
問題は、オートコンプリート成功時は常に選択が解除されているという仕様がいつの間にか変化していたことでした。この原因を、オートコンプリートから呼ばれるGiraffe.ListBox.ResetCountがリストアイテム数に変化がある場合にのみ選択を解除し、そうでないときはしないという一貫性に欠ける仕様のためと判断し、これを常に解除されるものとしておきました。

Object.@を含むメソッドを文字列化できなくなってたのを修正

Object.@に対する無駄な小細工をやめました。引数展開だとかの仕事は引数を受ける側が全て受け持つ仕様なので、Object.@は特別扱いして呼び出さないようにしてましたが、単純化のために、Object.@を単なるselfを返すメソッドとしました。

instanceがNULLなPointerオブジェクトのto_Stringがエラーになっていたの修正

to_Stringはエラー時に呼び出されるので、エラーになると、無限ループとなりスタックオーバーフローで終了します。NULLポインタの場合と同じく、Nilを返すようにしておきました。