タイトル : Re^5: 画面遷移 投稿日 : 2015/08/19(Wed) 10:42 投稿者 : 魔界の仮面弁士
> 同じ画面を開いても、現象が100%出るのではなく、出るときは、連続して発生します これは、GUIのテスト自動化ライブラリ(Codeer.Friendly とか)を利用した上での検証結果でしょうか。 それとも、利用者による体験あるいは手動テストによるものでしょうか。 (再現したときの手順が、前回と同様の操作であったことを保証できれば良いのですが) > ・A画面⇒B画面⇒C画面 > ここまでは、表示で逆転現象は、100%発生していません。 ここは問題無さそうなのですね。 [A.EXE]から[B.EXE]への起動は、Process.Start メソッドでしょうか。 > 画面を開いていき、C画面からD画面を開いたとき、 フォームの表示方法は、どのようにしていますか? A: Form2.Show() '暗黙のインスタンスを利用 B: Form2.Show(Me) '暗黙のインスタンスを利用し、親フォームを明示 C: F = New Form2() F.Show() '明示的インスタンスを利用 C: F = New Form2() F.Show(Me) '明示的インスタンスを利用し、親フォームを明示 D: Using F As New Form2() F.ShowDialog() End Using '明示的インスタンスを利用したモーダル表示 E: Using F As New Form2() F.ShowDialog(Me) End Using '明示的インスタンスを利用し、親フォームを明示してモーダル表示 F: 上記以外 > D画面を動的に作成し、 D画面をデザイン時に用意しておくのではなく、コード上で動的に作成するということでしょうか? Dim f As New Form() f.Text = "動的生成" Dim flow As New FlowLayoutPanel() With {.Dock = DockStyle.Fill, .AutoScroll = True} flow.Controls.AddRange(Enumerable.Range(100, 200).Select( Function(i) New TextBox() With {.Text = CStr(i)}).ToArray()) f.Controls.Add(flow) AddHandler f.FormClosing, Sub(o, p) MsgBox("合計値:" & flow.Controls.OfType(Of TextBox)().Sum(Function(t) Val(t.Text))) f.Show(Me) > 表示中(Shownあたり)で、 Shown は表示中ではなく、表示直後ですね。 > D画面の上にC画面が上に表示されてしまう D は C の子画面なのでしょうか? オーナー指定があるのに、親子関係が変わってしまうのだとしたら問題ですが、 オーナー指定が無いのなら、どちらが手前にもなりえるはずです。 (表示されるタイミングが適切かどうかは別ですが) > 出やすいところは、画面項目数が多いとき、発生しやすいです ・処理に長い時間(たとえば1秒以上)を要するイベントがありませんか? ・DoEvents を呼び出している箇所はありませんか? ・BringToFront/SendToBack/Activate などを意図的に呼び出しているイベントはありませんか? ・暗黙のフォームインスタンスを利用していませんか? > 画面の切替が勝手に行われてしまう(画面は作成途中) ユーザーが何も操作していないのに、一定時間あるいは不定期に 前面表示の切り替わりが起こってしまう、ということでしょうか? それとも、特定の操作をしたときに、意図しない画面の切替が 発生しはじめるということでしょうか。 Activated や Deactivate で他のフォームを制御していたり、 意図的に TopMost の On/Off 切替を行っているようなコードが どこかに紛れているような気もしますが…そういうわけでは無いのでしょうし。 「現象を再現可能なテストアプリ」を作ることが難しいなら、 既存のコードを削っていき、どの処理を通過したときに 現象が発生しているのかの特定が必要になりそうですが、 こればっかりは、ソースコードを持っている当人でなければ 判断できないですしね…。 |