WindowsXP(SP3)+Excel2003でListViewコントロールの罠にはまってた話

たぶん、罠ってほどのことはない話。
たぶん。


ここ2〜3週間、仕事場でWindowsXP(SP3)+Excel2003の環境でツールつくりをして楽しんでいました。約10年ぶりのVB系環境のような気がしますわ。


で、ここ2〜3日はListViewコントロールの挙動が怪しくて、うんうんうなってました。
UserFormでWizard風の画面を作っているんですが、特定のルートを通ったとき以外、ListViewが表示される画面になると、ListViewの位置が左上隅にとんでっちゃうという現象が起こってました。
どこかでTop/Leftプロパティをいじっているわけではなく、ウォッチ式で見ててもTop/Leftプロパティには変化がない正の数字なのに、なぜかTop/Leftプロパティともに0だとしか思えない位置にいるListView。


なんじゃこりゃーとおもい、いろいろ調べたところ。いや、いろいろどころか、ずーっとステップ実行して追っかけていったところ。
どうも、Frameコントロールとかの上に配置したListViewがそういう現象になっているらしく。
親WindowになっているFrameコントロールのVisibleをFalseにした状態で、ListView.ListItems.Clear メソッドを発行しちゃうと、こういうTop/Leftプロパティ墓割らないのに位置は0地点…という現象になるらしい…ということが判明。


Wizard風に作りこんでいる画面の都合上、戻るボタンでトップの画面に戻ったら、「全画面のコントロールを初期化する」みたいなことをしていたのが悪さこいていたらしい。
ついでに言うと、Wizardで入力した値をセーブしたものをロードする…なんて機能をつけたのもよろしくなかったらしい。


しょうがないので、ListViewがかかわるところだけ、初期化タイミングを親WindowのFrameコントロールがVisibleになるところに変更したところ、期待通り、ListViewコントロールがTop/Leftプロパティと同じ位置に出現してくれましたよ。


あーしんどかった。