DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Formの切替

環境/言語:[Windows2000]
分類:[.NET]

お世話になります。

今、Form1→Form2→Form3→Form4と画面が遷移するシステムがあり、Form3で検索項目をセットし、Form4でその結果を表示しています。

Form3ではあいまい入力もあり、該当件数が多いと、Form3からForm4へ切り替わる時に、
画面が完全に消える状態が起こります。(Form3でMe.Hideして、Form4をShowdialogして、Form3戻ってきたら、Me.Visible = Trueしています)
検索元のマスターは1000万件を超えます。

検索KEYにヒットする件数があるかどうかForm3で予め調べて、0件ならばForm4へ行かないようにするとか、サーバーのタイムアウトならば Catch ex As SystemException にひっかかったらもっと検索KEYを入れるように促すとかはやっているのですが、該当件数が多いと、どうしても画面が消える時間があるためまずいです。

このような場合は通常、どう対応されているのでしょうか?
Form3を消さずに・・・というのはしたくありません・・・。

よろしくお願い致します。
  • 題名: Re[1]: Formの切替
  • 著者: きいぼー
  • 日時: 2004/08/19 0:19:24
  • ID: 5644
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
きいぼーです。
Shinoさんこんばんわ。

> 該当件数が多いと、どうしても画面が消える時間があるためまずいです。
From4のLoadイベントにて処理にてデータを取得する処理をされているのですね。
その間From3を表示しておいて良いのであれば、
From4のデータ取得処理後に、From4のOwner.Hide()とすることで、
データ取得後にFrom3を非表示にできると思います。
  • 題名: Re[1]: Formの切替
  • 著者: 平ちゃん
  • 日時: 2004/08/19 9:39:14
  • ID: 5645
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No5643に返信(Shinoさんの記事)
> お世話になります。
>
> 今、Form1→Form2→Form3→Form4と画面が遷移するシステムがあり、Form3で検索項目をセットし、Form4でその結果を表示しています。
>
> Form3ではあいまい入力もあり、該当件数が多いと、Form3からForm4へ切り替わる時に、
> 画面が完全に消える状態が起こります。(Form3でMe.Hideして、Form4をShowdialogして、Form3戻ってきたら、Me.Visible = Trueしています)
> 検索元のマスターは1000万件を超えます。
>

初心者の平ちゃんです。今日は

Form4 の Load イベント の適当な場所で
Application.DoEvents()
を実行してみてはどうでしょうか?
■No5645に返信(平ちゃんさんの記事)
>
> 初心者の平ちゃんです。今日は
>
> Form4 の Load イベント の適当な場所で
> Application.DoEvents()
> を実行してみてはどうでしょうか?

メッセージキューに溜まったメッセージを吐くんですか?
私の勘違いでなければ、Shinoさんの仕様では何の効果もないと思うんですけど?
勘違いだったらごめんなさい。

# VB.NETになってからは、DoEvents()を使う機会はあまりないですね。
# VB6の際は、イベントに再入しない時などに多用してましたが。
  • 題名: Re[1]: Formの切替
  • 著者: java.lang.Nullpo
  • 日時: 2004/08/19 10:14:12
  • ID: 5648
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No5643に返信(Shinoさんの記事)
> お世話になります。
>
> 今、Form1→Form2→Form3→Form4と画面が遷移するシステムがあり、Form3で検索項目をセットし、Form4でその結果を表示しています。
>
> Form3ではあいまい入力もあり、該当件数が多いと、Form3からForm4へ切り替わる時に、
> 画面が完全に消える状態が起こります。(Form3でMe.Hideして、Form4をShowdialogして、Form3戻ってきたら、Me.Visible = Trueしています)
> 検索元のマスターは1000万件を超えます。
>
> 検索KEYにヒットする件数があるかどうかForm3で予め調べて、0件ならばForm4へ行かないようにするとか、サーバーのタイムアウトならば Catch ex As SystemException にひっかかったらもっと検索KEYを入れるように促すとかはやっているのですが、該当件数が多いと、どうしても画面が消える時間があるためまずいです。
>
> このような場合は通常、どう対応されているのでしょうか?
> Form3を消さずに・・・というのはしたくありません・・・。
>
> よろしくお願い致します。

検索に時間がかかる場合は、
 ・次に表示すべきFormを先に表示だけしておく(検索結果はまだ表示しない)
 ・プログレスバーなどで体感速度を和らげるなどする。
などしないとユーザさんが、「固まった!!」と勘違いします。

ですので、やってないかもしれませんが、
Form::LoadイベントやForm::Activateイベントで
検索を行う処理は入れない方がいいです。

Form4のコントロールに結果を吐くならば、
Form4のPublicなメソッドでやるのが1番楽でしょう。
そのメソッド内で、プログレスバーを表示する経過ダイアログをモーダル表示すればOKかと。
■No5648に返信(java.lang.Nullpoさんの記事)
> ■No5643に返信(Shinoさんの記事)
>>お世話になります。
>>
>>今、Form1→Form2→Form3→Form4と画面が遷移するシステムがあり、Form3で検索項目をセットし、Form4でその結果を表示しています。
>>
>>Form3ではあいまい入力もあり、該当件数が多いと、Form3からForm4へ切り替わる時に、
>>画面が完全に消える状態が起こります。(Form3でMe.Hideして、Form4をShowdialogして、Form3戻ってきたら、Me.Visible = Trueしています)
>>検索元のマスターは1000万件を超えます。
>>
>>検索KEYにヒットする件数があるかどうかForm3で予め調べて、0件ならばForm4へ行かないようにするとか、サーバーのタイムアウトならば Catch ex As SystemException にひっかかったらもっと検索KEYを入れるように促すとかはやっているのですが、該当件数が多いと、どうしても画面が消える時間があるためまずいです。
>>
>>このような場合は通常、どう対応されているのでしょうか?
>>Form3を消さずに・・・というのはしたくありません・・・。
>>
>>よろしくお願い致します。
>
> 検索に時間がかかる場合は、
>  ・次に表示すべきFormを先に表示だけしておく(検索結果はまだ表示しない)
>  ・プログレスバーなどで体感速度を和らげるなどする。
> などしないとユーザさんが、「固まった!!」と勘違いします。
>
> ですので、やってないかもしれませんが、
> Form::LoadイベントやForm::Activateイベントで
> 検索を行う処理は入れない方がいいです。
>
> Form4のコントロールに結果を吐くならば、
> Form4のPublicなメソッドでやるのが1番楽でしょう。
> そのメソッド内で、プログレスバーを表示する経過ダイアログをモーダル表示すればOKかと。

う〜〜〜ん、時間が無いので、回答は他の方に任せて・・・
私のサイトの…シツコイか(-_-;)住所検索が
>プログレスバーを表示する経過ダイアログを…
や該当件数取得ロジックがありますので、参考になるかな?
画面遷移についてヒント
モーダレスダイアログの事がわかるとウマくいくかも・・・
・.ShowDialog(Me)は、呼び出されたフォームがcloseするまで、そこで待ちます。
・.ShowDialog()は、親フォームとは関係なく動作します。
これで、少しは役に立つかな?
■No5647に返信(java.lang.Nullpoさんの記事)
>
> メッセージキューに溜まったメッセージを吐くんですか?
> 私の勘違いでなければ、Shinoさんの仕様では何の効果もないと思うんですけど?
> 勘違いだったらごめんなさい。
>
> # VB.NETになってからは、DoEvents()を使う機会はあまりないですね。
> # VB6の際は、イベントに再入しない時などに多用してましたが。


java.lang.Nullpoさん 始めまして
私の場合、とりあえずフォーム画面の乱れを修正するために
Application.DoEvents()を実行し、その後時間のかかる処理をして見た目の違和感を
なくしています。結構役に立ちますよ。

# 余談ですが時間のかかる処理ってむつかしいですねぇ
# フォーム画面が乱れる。
 マウスを砂時計表示にしてもクリックを受け付けるのでしつこくクリックすると
 「応答なし」とタスクバーに表示され、処理が終わっても「応答なし」が残り初心者には消す事ができない。

# 私も参考にさせて頂きますので Shino さんの質問に良い回答をお願いします。
  • 題名: Re[4]: Formの切替
  • 著者: 平ちゃん
  • 日時: 2004/08/19 11:54:11
  • ID: 5660
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No5657に返信(平ちゃんさんの記事)
> ■No5647に返信(java.lang.Nullpoさんの記事)
>
> # フォーム画面が乱れる。
>  マウスを砂時計表示にしてもクリックを受け付けるのでしつこくクリックすると
>  「応答なし」とタスクバーに表示され、処理が終わっても「応答なし」が残り初心者には消す事ができない。
>


自己レスです。
マウスの件は

>そのメソッド内で、プログレスバーを表示する経過ダイアログをモーダル表示すればOKかと。

で解決するのですね。失礼しました。
  • 題名: Re[4]: Formの切替
  • 著者: java.lang.Nullpo
  • 日時: 2004/08/19 12:23:59
  • ID: 5663
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2004/08/19(Thu) 12:28:15 編集(投稿者)

■No5657に返信(平ちゃんさんの記事)
> ■No5647に返信(java.lang.Nullpoさんの記事)
> java.lang.Nullpoさん 始めまして
> 私の場合、とりあえずフォーム画面の乱れを修正するために
> Application.DoEvents()を実行し、その後時間のかかる処理をして見た目の違和感を
> なくしています。結構役に立ちますよ。

ですから、それはSystem.Windows.Forms.Form::Refresh()でやるべきじゃないんですか?
今回は、ピンポイントのFormの描画の話でしょう?

# 確かに「効果がない」と言ったことは御幣ですけどね。:-)

DoEvents()は画面を再描画するが、実際にはメッセージキューを吐き出しているのですよ?
余計なことをわざわざやって、予期せぬ事態を招いても(略
WindowsSDKのWndProc()を勉(略


> 結構役に立ちますよ。

ですので、私はVB.NETで1度も使ったことがないのですが。


> # 余談ですが時間のかかる処理ってむつかしいですねぇ
> # フォーム画面が乱れる。
>  マウスを砂時計表示にしてもクリックを受け付けるのでしつこくクリックすると
>  「応答なし」とタスクバーに表示され、処理が終わっても「応答なし」が残り初心者には消す事ができない。

自己レスどおり、プログレスバーで解決させれますね。
  • 題名: Re[3]: Formの切替
  • 著者: Shino
  • 日時: 2004/08/19 13:45:27
  • ID: 5666
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
みなさん、ありがとうございます。
いろいろ試してみました。

で、今の状態としては、
Form3検索項目入力チエック後、

Dim f4 As New Form4
f4.ShowDialog(Me)
Me.Visible = True


Form4のLoadイベントで、Form3から渡ってきた検索項目からSQL発行して、
Form4上のListviewに結果表示後に、

Owner.Hide()

しています。

(Me)を入れただけで、ほんの一瞬の違いなのですが、
画面が完全に消えることはなくなりました。
Owner.Hideは、タスクバーにForm3の名前が残るので入れました。

とりあえず、私としてはこれで満足しています。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板