● バグは友達(14)2003年05月17日

  このコラムは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

〜 あきらめが悪いのがプログラマー 〜

今回取り上げたEditUnicodeTextコントロールにおける不可解な現象ですが、最後の頼みの綱であったDTSからも「バグです、解決方法はありません!」と、あっけなく引導を渡されてしまいました(涙)。まあ、とりあえずインライン対応のEdit Textコントロールの方を採用しておけば、しばらくの間は致命的な支障はないわけです(問題点はありますが)。しかし、今回のケースでは代用の回避方法が存在していたので助かりましたが、もしそうではない状況であったとしたら(よくあるのだが...)非常に困った事態に遭遇することになります。

製品の納期が近づき仕事が忙しくなると、こうしたバグを解析して解決方法を探っている余裕がなくなります。さっさと代用案を採用して次の行程に進むのが得策であり、そうしないと仕事に支障をきたします。今回の件も、筆者がそういう状況になったことから、しばらく手付かずの状態で記憶の片隅に追いやられていました。しかし、仕事が一段落してみると、未解決のまま残っている不可思議な現象(Appleはバグと言っているけれど)があるというのは気持ちの悪いものです。加えて、プログラマーの本質とも言うべき「あきらめの悪い」血が騒ぎ出します(笑)。

そこでもう一度、現象が発生する手順を詳しく確認してみました。EditUnicodeTextコントロールの文字サイズがかってに変わってしまう現象は、SetControlData() APIを使いコントロールのテキストをクリアすることが発端です。一旦こうなると、SetControlData()でテキストのフォントサイズを変更しようとしても、まったく反応しなくなります。つまり、この時点でコントロール(もしくはMLTE)が内部管理しているモードやフラグといった状態変数が、変更されたまま切り換わらなくなったと予想されます。この状態変数を一度リセットしてやれば、正常に戻る可能性は高いでしょう。

ToolBoxには、パラメータにゼロ、もしくはポインターにNULLを代入することで、内部環境変数をリセットする仕組みを採用しているAPIが有ります。また経験上、プログラマーはそういう仕組みを(内緒で)ルーチンに隠しておいたりするものです。そこで物は試し、SetControlData()によるフォントサイズの変更で、フォントサイズにゼロを代入してみました。そしてその後、再度適切なサイズを渡してやると、何とフォントサイズがちゃんと変更されるではありませんか!

通常、EditUnicodeTextコントロールにおけるフォントサイズ変更は以下のようなルーチンで実行します。



これを以下のように変更してやれば、テキストクリアにより変更が利かなくなったコントロールの文字サイズを変更できるようになるわけです。



やれ嬉し、これで解決!というわけで、さっそくこの新しいルーチンを自作アプリケーションに組み込んでみると、「世の中はそんなに甘くないゾ」という現実が待ちかまえていました(笑)。

つづく

copyright 2003 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact Us: koike@ottimo.co.jp