''[[C++/Tk/バグ対応]]''
* C++/Tkで-scrollregionコマンドが正常に通らない [#r18ee1c5]
[[C++/Tk:http://cpptk.sourceforge.net/]]で公開されているcpptk-1.0.2を利用していて、うまく動かないと思うことが多い。~
今回は以下のように-scrollregion()オプションを使用した時のバグに対応したい。
canvas( ".scaleC" ) -background( "white" ) -width( 486 ) -height( 32 )
-scrollregion( 5, 2, 5475, 32 ) -xscrollcommand( ".xsbar set" );
コンパイルは通るが正常に動作しない。~
原因は二つあり、一つは最終的に実行されるTclコマンドの文法ミス、~
もう一つはboost::lexical_cast()で付加されるカンマだ。~
まずは文法ミスの原因となっているcpptk.hの該当箇所について、以下のように書き換える。~
** 制約事項 [#w186a2c5]
cpptk-1.0.2およびboost_1_34を使用。~
~
~
ファイル名:cpptk.h L:1303~
/* This is OK for me ******************************************//* -scrollregionバグ対応 */
template <typename T1, typename T2, typename T3, typename T4>
details::Expr scrollregion(T1 const &x1, T2 const &y1,
T3 const &x2, T4 const y2)
{
std::string str(" -scrollregion ");
str += "{"; // 追加箇所その1 //
str += details::toString(x1); str += " ";
str += details::toString(y1); str += " ";
str += details::toString(x2); str += " ";
str += details::toString(y2);
str += "}"; // 追加箇所その2 //
return details::Expr(str, false);
}
//*This is OK for me ******************************************//* -scrollregionバグ対応 */
残る問題はロケールの設定で対応する。~
プログラムの冒頭で以下のようにして打開。~
// locale::global( locale("japanese") ); // ロケールを設定 *これだと失敗* //
locale loc( std::locale( "japanese" ), // 数値 → 文字列時にカンマが入らないように //
&use_facet< std::numpunct< char > >( std::locale::classic() ) ); // //
locale::global( loc ); // ロケールを設定 //
*** 修正履歴 [#a59f35b9]
~
*** 課題 [#i9435c45]
~
-備考~
cpptk.hとかcpptkbase.hって誰か手入れたりしてるのかな?~
*** 参考ページ [#p52862c0]
[[C++/Tk:http://cpptk.sourceforge.net/]]~
[[strstreamやboost::lexical_castをしたときに数値にカンマが入る:http://d.hatena.ne.jp/Nilfs/20080529/1212063249]]~