罠にはまる

昔ながらのVB6を取り扱っていて、C#でも存在するForm Activeメソッドに嵌められた。

不具合としては、入力したデータが印刷する直前で消えてしまうと言う連絡が入った。

実は、Windows11では発生しない不具合でWindows10、8のPCで発生していた。

原因は、このForm Activeメソッド内で再度Form Loadメソッドを呼び出していて印刷ボタンにフォーカスが行った後、内部でプリンターを検索する関数をコールしてResultを受け取った時にWindows11の場合はそのまま単に関数のResultを受け取って処理が進むのでForm Activeイベントが発生しなかったので上手く動いていたのだが、Windows10以前のPCの場合、関数のResultを受け取った後、再度フォーカスが戻った様でActiveイベントが発火してForm Loadに記述している画面のリセットが発火した為、印刷前に入力したデータが消えてしまうと言う現象が発生していた。

当初、データを入力しているテキストボックスをキーに色々検索したのだが該当の部分も見つからず、ブレークポイントでもひっかからずステップ実行でも判明しなかった。

そこで、全体を上から順に眺めていたらFormActiveイベントにFormLOADの記述を発見して原因をつかむ事ができた。

このActiveイベントは発生タイミングが随時なので余り使わない、個人的には絶対使わないイベントでこんなところにプログラムを書くと随時発生する、若しくは発生しない場合など挙動が理解出来ないので余程わかりきったロジックしか書かないし、ややこしくなるので俺はあえて使わない。

ところが、今面ナンスしているVB6のシステムにはイベントの挙動を把握してないプログラマーが組んだ様でい至る所に変な記述があって厄介な罠にはまってしまう。

一番の問題は、まだ表示してないフォームのコントロールにデータを送信しているのが問題で、VB6だとその状態でFormLOADが発生してしまう。

恐らく、そういう記述をしていてフォームを開いた時にFormLOADイベントが発生しないので再度ActiveにFormLOADイベントを書いたんだと思う。

馬鹿丸だしのイベントの挙動を全く把握しないプログラマーがいるんだと思ったがそいつは居ないので文句を言う先が無いのでここに書いてみた。

まだ見えないフォームのコントロールに値を渡したいのは解るが、ちゃんと引数として渡してやらないとこう言う痛い問題に直面する。

VB6ならグローバル変数が使えるのでもっとスマートなやり方があるし、C#でもClass変数とか上手いこと使うとイベントにひっかからずに引数を渡す事が出来るわけで、ちゃんと画面間のデータの受渡は考える必要がある。

VB6が余りにも自由すぎたと言うのもあるが、C#も似たような物なので注意が必要だな。

まぁ少なくともグローバル変数が使えないC#の場合はちゃんと引数の受渡メソッドを実装するだろうから問題は無いと思うが、フォーム間のやりとりはちゃんと設計しておかないとなぁと再考した。

コメント