タイトル : Re^8: 画面遷移 投稿日 : 2015/08/21(Fri) 18:09 投稿者 : 貴将
ありがとうございます。 > > (ShowDialogはBやCのパターン行い、Usingは使用していません) > Using を使うかどうかは任意ですが、その場合は「Dispose」が必要です。 > > > Show の場合、フォームが閉じられたときに、自動的に Dispose されるため不要ですが、 > ShowDialog した場合は、Close してもインスタンスは破棄されません。非表示になるだけです。 > > hhttps://msdn.microsoft.com/ja-jp/library/c7ykbedk.aspx > 》 ダイアログ ボックスとして表示されているフォームは閉じられるのではなく非表示になるため、 > 》 フォームがアプリケーションで不要になった場合は、そのフォームの Dispose メソッドを > 》 呼び出す必要があります。 > > 各フォームの連携部分で、上記の違いは認識されていますでしょうか? > ⇒返答 はい たびたびすみません。 もう少し補足を記載させて頂きます 動的に作成 A画面⇒B画面⇒C1画面⇒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個 ← 今はここだけ デザインで作成 C2画面⇒D7画面 C3画面⇒D8画面⇒E81画面⇒F82画面 C4画面⇒D9画面⇒E91画面 D10画面 問題が発生する前の考え方 画面の遷移について @最前面の画面だけを使用する A画面の表示方式は次画面をShowDialog( 明示的インスタンスを利用 ) F = New ew Form2() F.ShowDialog() F.Dispose 作成方針でした。 デザインだけで作成したソースは、問題なく動きます。 項目数が多くデザインで対応できなかったものを動的に作成しました 画面構成等が同じため⇒上段部分は動的に作成しました。 動的に作成した画面 D6画面とE63画面を呼び出すときに問題が現在でも発生します。 いろいろな組み合わせの結果 ・一番問題がないパターンを使用しました。 ⇒明示的インスタンスを使用して、動かすと頻繁に無限的に画面の切替問題が発生します。 > > > 現在は、現象が少ないAのパターンを採用しています。 > > 過去に Cのパターン、Bのパターン、及びForm2.ShowDialog等を行いました。 > > 暗黙のフォームを使った場合、インスタンスの管理が曖昧になるため、 > 閉じたフォームが再生成されて開かれたのか、 > 非表示だったフォームが再表示されたのか、分かり難くなります。 > > そのためコーディングミスにより、以前とは違うインスタンスを操作することで > 意図せぬ画面遷移が行われてしまっているケースを見かけます。 > > > たとえば、これは極端な例ですが > ・モードレスなサブ画面を表示中は、呼びだし元のメイン画面を消す > ・サブ画面が閉じたら、呼びだし元の画面を再表示する > という処理を実装するにあたり、下記のような処理になっていることがありました。 > > > 'アプリケーション設定:シャットダウンモード=「最後のフォームが閉じるとき」 > Public Class Form1 > Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click > Form2.Show() > Me.Hide() > End Sub > Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click > Form2.Show() > Me.Close() > End Sub > End Class > Public Class Form2 > Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing > Form1.Show() > End Sub > End Class > > > この場合、Button1 と Button2 は明らかに違う意味を持つのですが、 > 各フォームの表示位置やサイズが固定化されていたため(というか最大化)、 > 実行時テストでは、両者のその違いに気付かなかったのだそうです。 > > (上記の場合、Hide と Close の違いが争点ではありますが、それとは別に > Form2 内から、Form1 という暗黙インスタンスを操作していることも問題です) > > > > > ⇒InitialImage ⇒ ローカルリリースを選択してインポートしています(JPG) > Local Release …というのは、 > Local Resource のことでしょうか。 ⇒返答 すみません 記載ミスでした。 > > > > ・500から6000個くらいのラベルを作成します > その数になると、Label で処理するよりも、Paint イベントあたりで > 描画処理として片付けた方が、処理が軽くなるのではないでしょうか。 > まぁ、実装の手間としては Label の方が楽なのかもしれませんけど。 > > > > > D は C の子画面なのでしょうか? > > ⇒回答 > > Form2.Showで開いている画面です。 > > Form2.Show したことと、それが子画面であるかどうかは無関係です。 > > > Public Class Form2 > Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click > Form3.Show() > End Sub > > Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click > Form3.Owner = Me > Form3.Show() > End Sub > > Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click > Form3.Show(Me) > End Sub > End Class > > > Button1 から呼び出した Form3 は、Form2 の子画面ではありませんが、 > Button2 および 3 での Form3 は、Form2 の子画面です。動作の違いを確認してみてください。 > > ・親画面が閉じられると、子画面も一緒に閉じられます。 > ・子画面は、常に親画面よりも手前に表示されます。 > > ※ 身近な「子画面」の例としては、「メモ帳」における「検索」画面などがあります。 > > > ただ、Button3 のパターンは過去に試していて、その場合は > 『頻繁に現象が発生しました。』とのことでしたよね。それは、 > Form2 が、Form3 よりも手前に来てしまう状態であったという意味でしょうか? > ⇒返答 はい、そうです。 Button2 のパターンでも頻繁に現象が発生しました。 > > > >> ・処理に長い時間(たとえば1秒以上)を要するイベントがありませんか? > > ・はい > 長い処理を UIスレッドで行うと、ウィンドウメッセージの流れを阻害してしまいます。 > それらの処理を非同期処理として、ワーカースレッドで処理することを検討してみて下さい。 > ⇒返答 最後の画面描画の部部なので > > >> ・BringToFront/SendToBack/Activate などを意図的に呼び出しているイベントはありませんか? > > ・はい(ShownでActivateを使用しています。) > Activate は、(自アプリ内における)アクティブフォームの切替を行うための物ですよね。 > > 複数の画面が立ち上がっていて、特定のフォームを明示的にアクティブにしたいときに使うことはありますが、 > Shown 時に呼び出すべきようなものではありません。使いどころを見直してみてください。 > > > > > > > ・暗黙のフォームインスタンスを利用していませんか? > > > ⇒回答 > > > ・はい > > > ⇒明示的インスタンスを利用して動かすと頻繁に問題が発生します。 > 同じフォームを複数開くことがないのであれば、暗黙でも明示的でも構いませんが、 > この場合の争点は、フォームの有効期間をきちんと把握しているか否かです。 > > きちんと管理されているなら、暗黙だろうと明示的だろうと、同じ動作になるはずですし、 > 暗黙か明示的かで動作に影響があるのなら、フォームの取り扱い方に問題があることになります。 > > > > > クリックしてから画面が表示される間です > Shown で Activate するなど、あまり一般的では無いフォーカス制御を行っているようですし、 > 話を聞く限りでは、問題を解消しようとするために仕掛けた TopMost や Activate 等が、 > 余計に問題を複雑化させているようにみうけられます。 > 原因を特定しないまま対処療法を続けるのは、あまり得策では無いと思いますよ。 ⇒返答 はい、できればとりたいのですが、 入れても入れなくても問題は発生していますので 以上 |