• ベストアンサー

VBでのフォームのロード

こんにちは。 フォームを表示する際に、Form_Loadイベント内で色々処理をさせています。 私としては、その処理が終了した時点で画面が表示される、と思っていたのですが、画面が表示される際に、枠だけの半透明?のような感じのウィンドウが数秒表示されてから、通常の画面が表示されます。 Form_Load内の処理自体が重いのだと思い、以前別の質問をさせて頂いた際に教えていただいたDoEventsを、重そうな部分に挿入して試しているのですが直りません。 またInitializeイベント内で処理をしても同じようになります・・・ 何か対処法はありますでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#4564
noname#4564
回答No.2

> フォームを表示する際に、Form_Loadイベント内で色々処理をさせています。 > 私としては、その処理が終了した時点で画面が表示される、と思っていたのですが、画面が表示される際に、枠だけの半透明?のような感じのウィンドウが数秒表示されてから、通常の画面が表示されます。 その処理は、問題のフォームクラスに従属する処理内容なのでしょうか? フォームの表示と無関係な処理ならば、Form_Loadイベントに記述しないで、分離した方がよいと思いますが? > DoEventsを、重そうな部分に挿入して試しているのですが直りません。 DoEventsはCPUの制御を解放して他の処理の「割り込み」を許す処理です。 必要なときに使用するは結構ですが、明確な必然性がないのに、「何となく」使うのは、性能が悪化する原因となりますし、危険でもあります。 > 何か対処法はありますでしょうか? 問題の「重い処理」の前に、 Me.Hide として非表示にし、「重い処理」の完了後に、 Me.Show とする、とか。 待ち時間に別ウィンドウで「しばらくお待ちください」と表示する、とか。  

noname#4100
質問者

お礼

> フォームの表示と無関係な処理ならば、Form_Loadイベントに記述しないで、 > 分離した方がよいと思いますが? #1の方のお礼にも書かせて頂いたのですが、こういう場合は、やはり違うところで処理させるべきものだったのでしょうか・・・ それとも「分離する」という意味は、別のプロシージャーにして、それをForm_Loadイベント内で呼び出す、という形でも良いのでしょうか?(でも、それだと多分同じですよね・・・^^;) > 待ち時間に別ウィンドウで「しばらくお待ちください」と表示する、とか。 実はそれも表示させているのですが、そのウィンドウのバックに、半透明なウィンドウが数秒表示されてしまっています。何度も見直しているので、ShowとUnloadのタイミングは間違っていないはずです・・・ > DoEventsはCPUの制御を解放して他の処理の「割り込み」を許す処理です。 > 「何となく」使うのは、性能が悪化する原因となりますし、危険でもあります。 そうだったのですか・・・重い処理の際に、一旦制御を解放してやることによって、次の(前の?)VBの処理も固まらないのかと漠然と思っていました。 (以前は、都度処理内容を表示させているラベルが真っ白になって、またきちんと表示される、という状況に対処する方法を伺っていました・・・それも結局DoEventsで対処したのですが、そちらも見直した方が良いですね) >問題の「重い処理」の前に、 > Me.Hide > として非表示にし、「重い処理」の完了後に、 > Me.Show > とする 長くなってしまいましたが、これで半透明なウィンドウ(画面)は表示されずに、一気に?表示させたい画面に移りました。 ありがとうございました(^^)

その他の回答 (3)

noname#11856
noname#11856
回答No.4

#3さんのご意見に賛成です。 初期表示時に多量なデータを読み込むのは、あまり現実的ではないように思います。 とは言え、ユーザ側から遅く(重く)なってもいいから表示してくれ、と言われることは時々あります。 ユーザ側からそのように言われているのであれば、多少遅くてもOKでしょう。 表示の問題はHideで解決したようですし。

noname#4100
質問者

お礼

そうですね・・・時間がかかるのが「本当にかかるもの」なのか、コードが悪いためにかかるのか・・・(^^; 自分ではあまりよく分かっていない状態自体も問題だと感じています! もっと勉強しなきゃいけないって思います。 再度のお返事ありがとうございました!

noname#4564
noname#4564
回答No.3

> 別のPCにあるデータをSQLでとってきて、その内容をフォームに表示させています・・・ > そのデータ量は結構あります・・・ SQLに絞込みを入れ、上位N件(数100件程度?)だけを表示するのが一般的です。 仮に50万件のレコードが格納されているとして、現実的に、お前らそれをホンマに全部見るんかい?、ちゅう話です。 何でもかんでも全部出せばよいというものではなく、そのとき必要なものだけを表示する、という考え方ですね。 > 都度処理内容を表示させているラベルが真っ白になって、またきちんと表示される 処理中に画面を再描画するだけなら、 Label.Refresh で問題ないと思いますが?

noname#4100
質問者

お礼

> SQLに絞込みを入れ、上位N件(数100件程度?)だけを > 表示するのが一般的です。 「データ量は結構あります」と書いておきながら、抽出しているのは数百件程度です、すみません! (それでも多いと思っていました^^;) ただそのデータをどこ(○行目の○列目のセル)に配置するかがデータ内容によって細かい条件があるので、そこのループ部分で重たくなっていると思うのです。 (これはもう少しうまく書けば、スピードも変わるかも知れません・・・) > Label.Refresh できました! Refreshというメソッド自体を知りませんでした。 再度のお返事を頂きまして、ありがとうございました。 しかも前回分の質問も別の方法で解決できました。 本当にありがとうございます。

noname#11856
noname#11856
回答No.1

フォームの表示に数秒もかかると言うのは、遅すぎるかと。 本当に必要な処理だけをしてますか? Form_Load、およびForm_Initializeの処理内容自体を見直す方がいいように思いますが。

noname#4100
質問者

お礼

> 本当に必要な処理だけをしてますか? 別のPCにあるデータをSQLでとってきて、その内容をフォームに表示させています・・・ そのデータ量は結構あります・・・ 初期画面で表示させたい内容が決まっているため、Loadイベント内で処理させているのですが、一旦画面を表示させてからボタンなどで取得した方が良かったのでしょうか・・・ 早速お返事頂いて、ありがとうございました。