タイトル : Re^6: 画面遷移 投稿日 : 2015/08/20(Thu) 23:20 投稿者 : 貴将
ありがとうございます。 遅くなりすみません。 > > 同じ画面を開いても、現象が100%出るのではなく、出るときは、連続して発生します > これは、GUIのテスト自動化ライブラリ(Codeer.Friendly とか)を利用した上での検証結果でしょうか。 > それとも、利用者による体験あるいは手動テストによるものでしょうか。 > > (再現したときの手順が、前回と同様の操作であったことを保証できれば良いのですが) > ⇒ 回答 手動テストによるものです。 ⇒C画面からD画面を表示するときは、C画面上のラベルをクリック(動的ラベル) ⇒D画面からE画面を表示するときは、D画面上のボタンをクリック(動的ボタン) > > > ・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: 上記以外 > ⇒ 回答 現在は、現象が少ないAのパターンを採用しています。 過去に Cのパターン、Bのパターン、及びForm2.ShowDialog等を行いました。 (ShowDialogはBやCのパターン行い、Usingは使用していません) ⇒ 頻繁に現象が発生しました。 > > > > > D画面を動的に作成し、 > D画面をデザイン時に用意しておくのではなく、コード上で動的に作成するということでしょうか? > ⇒回答 すみません。説明不足で補足します。 C画面 デザイン時 @フォーム上に、ピクチャーボックスを作成 ⇒ピクチャーボックスには、JPGのイメージを設定 ⇒InitialImage ⇒ ローカルリリースを選択してインポートしています(JPG) Aフォーム上に、ボタンを作成(印刷・終了) 動的 @ピクチャーボックスのイメージ上(下絵)に、ラベルを動的に作成します。 ⇒・動的にラベルを作成します ・ラベルのバックカラーを条件によって変えます ・ラベルの大きさを条件によって変えます ・ラベルにクリックイベントを追加します D画面 デザイン時 @フォームをsplitcontainerで上下に分割 A上の段にピクチャーボックスを作成、 B下の段にボタンを作成(印刷・終了) 動的 @ピクチャーボックスに動的にボタンを追加します。 2から20個までパターンがあります Aラベルを作成します ・100から1500個くらいのラベルを作成します ・ラベルのバックカラーを条件によって変えます E画面 デザイン時 @フォームをsplitcontainerで上下に分割 A上の段にピクチャーボックスを作成、 B下の段にボタンを作成(印刷・終了) 動的 @ラベルを作成します ・500から6000個くらいのラベルを作成します ・ラベルのバックカラーを条件によって変えます C画面からD画面を表示するときは、動的に作成したラベルをクリックします。 D画面からE画面を表示するときは、動的に作成したボタンをクリックします。 動的の作成数 D画面 E画面 A画面⇒B画面⇒C画面⇒D1画面⇒E11画面 300個 400個 ⇒E12画面 300個 400個 D2画面⇒E21画面 300個 400個 D3画面⇒E31画面 800個 1200個 ⇒E32画面 300個 1500個 D4画面⇒E41画面 800個 2400個 D5画面⇒E52画面 1000個 4000個 D6画面⇒E63画面 1500個 6000個 > > 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) > > > > > > D画面の上にC画面が表示されてしまう > D は C の子画面なのでしょうか? ⇒回答 Form2.Showで開いている画面です。 > > オーナー指定があるのに、親子関係が変わってしまうのだとしたら問題ですが、 > オーナー指定が無いのなら、どちらが手前にもなりえるはずです。 > (表示されるタイミングが適切かどうかは別ですが) > > > 出やすいところは、画面項目数が多いとき、発生しやすいです > ・処理に長い時間(たとえば1秒以上)を要するイベントがありませんか? ⇒回答 ・はい 表示するのに一つ一つ出ているイメージです > ・DoEvents を呼び出している箇所はありませんか? ⇒回答 ・使用していません。 > ・BringToFront/SendToBack/Activate などを意図的に呼び出しているイベントはありませんか? ⇒回答 ・はい(ShownでActivateを使用しています。) > ・暗黙のフォームインスタンスを利用していませんか? ⇒回答 ・はい ⇒明示的インスタンスを利用して動かすと頻繁に問題が発生します。 > > > > > 画面の切替が勝手に行われてしまう(画面は作成途中) > ユーザーが何も操作していないのに、一定時間あるいは不定期に > 前面表示の切り替わりが起こってしまう、ということでしょうか? > > それとも、特定の操作をしたときに、意図しない画面の切替が > 発生しはじめるということでしょうか。 > ⇒回答 クリックしてから画面が表示される間です C画面からD画面を表示するときは、動的に作成したラベルをクリックしたあと D画面からE画面を表示するときは、動的に作成したボタンをクリックしたあと > > Activated や Deactivate で他のフォームを制御していたり、 > 意図的に TopMost の On/Off 切替を行っているようなコードが > どこかに紛れているような気もしますが…そういうわけでは無いのでしょうし。 ⇒回答 ・はい(ShownでActivate及びTopMostを使用しています。) |