• 締切済み

フォームが表示されるのが遅い

お世話になっております。 最初にForm1_Loadイベントでiniファイルで初期設定をロードしたり、複数のCSVファイルからデータを読み込んでFor~Nextで配列に入れたりする処理をしているのですが、データ多いためフォームが表示されるまでに2秒ほど待たされてしまいます。 フォームを表示してから行いうにはどうしたらいいでしょうか。Application.DoEvent()をループ内に記述してみたりしましたが、効果は見られませんでした。初期設定をLoadではなく、ほかのイベントに記述するしかないでしょうか? タイマーで時間をずらしたりなどで出来ないことは無いかもしれませんが、無駄も多くなりそうなので一番一般的な方法を知りたいです。 よろしくお願いいたします。

みんなの回答

  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.3

#1です。 >>「別スレッド」などという言葉が出てきて初心者の僕にはちょっと荷が重いです スレッドについては以下のMSDNの解説なんかわかりやすいと思います。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdnbprocs/htm/progCharp15-01.asp >>別なクラスから呼び出すと、勝手に非同期になるのでしょうか。 なりません。 私の言い方がよくなかったのかと思いますが、非同期で動かすには別スレッドで動かす必要があります。 ただ、非同期実行させる際、オブジェクト指向プログラミングでは 別クラス(のオブジェクト)に処理を任せることが多いです。(これを「委譲」といいます。VBなどVisual Stadioではこれを「デリゲート」と呼んでいたりします。) >>それともやはり非同期で実行するようにコーディングしなおす必要があるでしょうか。 おっしゃる通り、マルチスレッドのプログラミングにはそれなりのコーディングは必要です。 しかし、用意されているライブラリを利用するだけなので慣れてしまえば大したことはありません。 よさそうなサイトがあったので、↓に紹介しておきます。 http://codezine.jp/a/article.aspx?aid=135

new_hope
質問者

お礼

お返事おくれてしまいました。 現在教えていただいたページを参考にしつつ、マルチスレッドに挑戦しております。 とりあえず現在は、ロードイベントの一番最初に Me.Show() と記述してそのあとから初期設定をおこなうようにしたところ、 最初にフォームが表示されるようになりました。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

先に表示させても結局待たせることには変わりなく(どこかをクリックされてしまうと困るので制限を加えるのでしょうし)、プログレスバーなどでLoad時の状況を見せつつ、間を持たせたいということなら、スプラッシュ画面を使うのが一般的だと思います。 http://www.atmarkit.co.jp/fdotnet/dotnettips/223splashscrn/splashscrn.html

new_hope
質問者

お礼

アドバイスありがとうございます。 スプラッシュウィンドウは今のところ考えておりません。

全文を見る
すると、全ての回答が全文表示されます。
  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

>>フォームを表示してから行いうにはどうしたらいいでしょうか 方法としては、CSVを読み込むクラス(仮名classA)を作って、 ロード時にclassAを呼び、非同期に実行させます。 classAは読み込みが完了すれば、もとのフォームにその旨を通知すればいいです。 しかし、そもそもフォームを先に表示させてもかまわないということは ロード時にCSVなどに書かれたデータを必要としないということですよね? どのような設計をしているのかは知りませんが、 必要なタイミングでCSVを読み出せばいいかと思うのですが‥。

new_hope
質問者

お礼

早速のご回答ありがとうございます。 プログラムの動作に必要なファイルなので最初に読み込む必要があるのですが、せめて必要プログラムを表示し、待たせる場合はプログレスバーなどで対応したいと思っています。やはり実行ファイルをクリックして2秒3秒待たされるのは、使う人は気分が悪いと思うので・・・。 非同期というのはいろいろ便利そうなので検索してみましたが、「別スレッド」などという言葉が出てきて初心者の僕にはちょっと荷が重いです。いずれ勉強してみますが・・・。 別なクラスから呼び出すと、勝手に非同期になるのでしょうか。それともやはり非同期で実行するようにコーディングしなおす必要があるでしょうか。恐れ入りますが、もしよろしければ詳しく教えていただけ無いでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ふと疑問に思ったこと。

    現在VB2008をのんびり勉強中のものです。 ふと疑問に思ったのですが、VB6時代では Load フォーム名 で、対象フォームのLoadイベントのみを発生させることができました。 これだと、見た目上フォームを表示せずにLoadイベントを発生させることができました。 同様のことをVB2008でもやってみようと思ったのですが、 フォーム名 = New Form で初期化。 Loadだけを読み込もう・・・・あれ?フォーム先のイベントを何か発生させないとLoadされないぞ!? っていうことに気付きました。 フォーム名.showだとフォームが表示されてしまうし・・・ とりあえずshowで表示させた後、すぐにhideで隠してしまえばいいのですが、もっとスリムなやり方はありますでしょうか???

  • Accessのフォームを閉じるのではなく、非表示にする

    Accessのフォームにおいて、 ボタンをクリックすると、そのフォームが閉じる、 というイベントをつけております。 そのイベントを、フォームが閉じるのではなく、 フォームを非表示にし、メモリ上では開いたまま というイベントに直したいのですが、 Form_F003.Visible = False というような記述をするという 解釈でよろしいのでしょうか?? その解釈でないとしたら、 フォームのソース上で、 フォームを非表示にし、メモリ上では開いたまま というプロパティを設定できるでしょうか?? どなたか、ご指導くださいませ。

  • フォームロードについて

    VB2008で、Form_Load()に Me.Visible = falseや Me.Close()としてもフォームの非表示やフォームを閉じたりしないのですが、なぜなのでしょうか? 最初に起動した場合に、Form_Loadで初期設定を行った後に、自動的に直ぐにフォームを非表示や閉じることをしたいです。

  • フォームが表示されない

    vb.net使用です。 メニュー画面(メイン) 待ち画面(テキストボックスとボタンがあります。) 実行画面 の3つのフォームがあります。 メイン画面から待ち画面を表示し、待ち画面から実行画面に移ります。 待ち画面でテキストにデータが入るまでループさせていて、 テキストにデータが入ってから実行画面を表示させるプログラムを作っているのですが、 待ち画面のループのプログラムで実行画面を表示させているのですが、(この時は表示している) プログラムが終了すると実行画面が消えてしまいます。 ループのプログラムをやめて、ボタンから行うと実行できます。 INVOKEも使用してみても状況がかわりません。 実行画面が使用できるようにするにはどうしたらよいか教えていただけないでしょうか。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Private Sub 待ち画面_Load(sender As Object, e As System.EventArgs) Handles Me.Load Psmachi End sub Private Sub  Psmachi() Do Until txttxt.text <> “”     実行画面.show Me.hide Loop End sub Private sub bottan_click     実行画面.show Me.hide End sub

  • VB.Netのフォームロードイベントについて

    こんにちわ。 いまVB.Net2005Expressで勉強をしている者です。 あるフォームがロードされるときの処理を書こうとすると, 従来のVB6ではFormオブジェクトにLoadイベントがありましたが, VB.Net2005では,最初の状態ではフォームのイベントには 「New」,「Finalize」,「InitializeComponent」の3つしかありません。 もしVB.Net2005でForm_Loadイベントを書きたいときは, 自分で, 「Private Sub Form1_Load(Byval ~」と書かなくてはいけないのでしょうか? 初歩的な質問になるかもしれませんが,教えてください。 よろしくお願いします。

  • フォームモジュールが作られない

    アクセスです。 新規でフォーム1を作成し、何もしないで(いじらないで)保存し、 VBE画面でフォーム1のForm_Loadイベントにコードを記述しようと思っても、  画像のようにフォームモジュールがありません。 フォームのデザインビューから適当に何かのイベントプロシージャーのボタンを押せば、 フォームモジュールが生成されます。 これは仕様でしょうか? エクセルは最初からシートモジュールやブックのモジュールがありますよね。

  • VBでのフォームのロード

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

  • フォームのイベントを標準モジュールから呼び出す

    フォームのイベントを標準モジュールから呼び出す事は出来ないのでしょうか? ちなみにアクセスです。 例えば、 Private Sub Form_Load() MsgBox "test" End Sub というのはフォームを開いたときにしか発生しないですよね。 でもフォームを開いている状態でForm_Loadと全く同じ事をしてほしい時は どうすればいいですか? 標準モジュールで Sub a() Call Form_フォーム1.Form_Load End Sub としてみましたが、メソッドまたはデータ メンバが見つかりません。 (Error 461)になりました。 MsgBox "test" だけなら、 Sub a() MsgBox "test" End Sub にすりゃいいじゃん!って思われがちですが、 実際はForm_Loadイベントにはたくさんのコードが書かれています。 標準モジュールからイベントの呼び出しを教えてください。

  • フォームロード時にアンロード。

    VBでフォームロード時に、ある条件のときだけ、 自フォームをアンロードするプログラムを作りたいのですが、 form_load プロシージャにunload Me と書くと、 どうしても、一瞬フォームが表示されます。 フォームを表示せずにアンロードする方法は ないのでしょうか? よろしくお願いします。

  • フォームを表示してからメッセージボックスを表示する

    メッセージボックスが表示される前に、フォームを表示させたいです。アクセスです。 ナビゲーションウインドウからフォームをダブルクリックしてフォームを開くのですが、 今のままだとメッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを表示してからメッセージボックスを表示するにはどうすればいいでしょう? Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" End Sub だと、先ほど述べたように、メッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを開いたときのイベントは複数あるようで、 Private Sub Form_Activate() MsgBox "Form_Activate" Debug.Print "Form_Activate" End Sub Private Sub Form_Current() MsgBox "Form_Current" Debug.Print "Form_Current" End Sub Private Sub Form_GotFocus() MsgBox "Form_GotFocus" Debug.Print "Form_GotFocus" End Sub Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" Debug.Print "Form_Open" End Sub Private Sub Form_Load() MsgBox "Form_Load" Debug.Print "Form_Load" End Sub をすると、 ・Form_Load ・Form_Activate ・Form_GotFocus ・Form_Open ・Form_Current の順に開きますが、やはりフォームが最後に表示されてしまいます。 どうにかして先にフォームを表示させる方法はないでしょうか? ご回答よろしくお願いします。