2019年4月11日木曜日

プログラムブログ更新は久しぶり

 毎日プログラムしてるけど、ほぼ更新してない!

HSPもcocos-2dxも全く触れて無いわ!

つか、ほぼ毎日、終電だゴルア!

まあ、楽しいのでいいんですがね。

不具合修正のプログラムが楽しい人ってそうそういないか。

で、不具合について。

Windows.forms.System.SplitContainerを使ってフォームを作る。

これは、左右2つのパネルをSplitterで分割するフォームパーツだ。

このSplitterはアプリ使用者が自由に動かすことができるが、

アプリを再起動すると、デフォルト位置に戻ってしまうので、位置をキープして欲しい、というもの。



実は、保存する際に、値はちゃんとシリアライズされている。

ではなぜ、ずれてしまうのか?

それは、いわゆる仕様バグである。

まず、SplitContainerを、幅200で初期化・作成する。

Splitterの位置は、100(ちょうど中央)とする。

※ちなみにSplitter自体の幅は4

ここまではちゃんと、再起動時にデシリアライズされている。


問題は…。


作成したこのSplitContainerを、Dockに収めていることだ。

その際、300とか400とか大きめのDockにはめ込んでいるため、

幅200で作ったSplitContainerが、引き伸ばされる。

全体が均等に引き伸ばされるため、spliterの位置が、右にずれるのだ。

そしてこれが保存され、次回再度引き伸ばされ…。

デフォルトに戻るどころか、どんどん右にずれていく、というのが現状だったようだ。


解決するのは簡単で、Splitter自体は自由に動かせるが、ウインドウサイズを変えても、

パネルサイズを変更しない、fixedPanelプロパティで、Panel1(左側)を固定にするだけでいい。


…のだが!


実は罠があるらしい。

今開発しているツールは、各種機能が複数のタブによって仕分けされており、

この複数のタブそれぞれに、SplitContainerが使われている。

前半で述べた方法で、これらすべてのSplitterの位置は個別に保存されるようになったのだが、

どうやら、リセットするトリガーがあるらしい。

タブ3にある、Splitterの位置を動かしたら、なぜかタブ1とタブ2の位置がリセットされるのだ。

(現象はランダムで、変わらない場合もある)


現在、このリセットされるトリガーが何か?が調査対象である。