Form_LoadとForm_Activateの実行タイミングについて

このQ&Aのポイント
  • Form_LoadとForm_Activateは、データ入力アプリの親フォームと子フォームの間を行き来する際に使用されるイベントです。
  • Form_Loadは、子フォームが初めて表示される際に実行されるイベントであり、データの展開などの初期化処理に適しています。
  • Form_Activateは、子フォームがアクティブになるたびに実行されるイベントであり、データの更新や表示の更新処理に適しています。
回答を見る
  • ベストアンサー

Form_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。 親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。 すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。 そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。 Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。 Form_Load と Form_Activate の実行タイミングについて、お教えください。

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

Form_Loadは、フォームがロードされたときです。 ロードされる条件は、 1.フォームがスタートアップに指定されているとき、アプリが実行された直後。 2.Show メソッドが呼ばれたとき 3.Loadメソッドが呼ばれたとき 4.フォームに貼り付けられたコントロールのプロパティが参照されたとき 5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき です。 ただし、一度ロードされると、Unloadされるまで呼ばれません。 Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

lily02
質問者

お礼

ありがとうございます。お礼が遅くなりました。 taka_tetsu さんのご回答を、見逃していて今日拝見しました。 でも、ご説明が明快で、はっきり分かりました。 いろいろやってみて、なんとなくしか分かりませんでしたので。 これで、すっきりプログラミングができます。

その他の回答 (1)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

Debug.Printを埋め込んで実行してみましょう Private Sub Form_Load() Debug.Print Time, Me.Name, "Form_Load" End Sub Private Sub Form_Activate() Debug.Print Time, Me.Name, "Form_Activate" End Sub

lily02
質問者

補足

早速お答えいただき、ありがとうございます。 Debug を使いながら、大体の動きのタイミングは分かっています。 しかし、Form_Load と Form_Activate の定義として、どういう動きをするように設計されているのか知りたいと思うのですが。

関連するQ&A

  • VBA★ブックがactivateできません

    簡単なVBAで躓いています。 新しいエクセルファイルを追加して、アクティブにしたいです。 エクセルファイルの名をフォームで入力させ、mybookという変数にしました。 ---------------- Private Sub CommandButton1_Click() mybook = UserForm1.TextBox1.Text Unload Me End Sub ---------------- そして、mybookという名前のファイルを追加しました。 ここまではうまく行きます。 ただ、その後の Workbooks(mybook).Activate で 「実行時エラー”9” インデックスが有効範囲にありません」 が表示されてしまいます。 ---------------- Public mybook As String ---------------- Sub ファイル名変数() UserForm1.Show MsgBox "ファイル名は" & mybook & "です" Workbooks.Add ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & mybook Workbooks(mybook).Activate End Sub ---------------- 一連の処理の中でactivateしたいな、という箇所が何回か出てくるのですが、 Workbooks(mybook).Activate でエラーが出てしまい困っています。 識者の方、何卒アドバイスをお願いいたします。

  • Accessで入力用全画面Formと検索用子Formを表示させたい。

    こんにちは。 Accessで入力用Formと検索用の小さなFormを表示させたいと思っています。 具体的な動作は下記です。 入力用Form(親)からコマンドボタンを押して、マスタ一覧の別のForm(子)が起動します。 子Form一覧からレコードを選択すると、子フォーム終了と同時に親フォームへ値を設定します。 動作自体は問題ありませんが、 やりたいのは親ホームは全画面として、子フォームをその上に大きさを指定した 小さなウィンドウとして表示させたいと考えています。 親フォームを全画面で、子フォームを起動すると子フォームでサイズ指定(DoCmd.MoveSize)しても 全画面として起動されます。 親フォームを元のサイズとして、子フォームを起動するとサイズ指定が有効になり 画面の大きさは一応指定されます。 しかし、運用のディスプレイサイズがまちまちなので、親画面は全画面(DoCmd.Maximize)として起動し、 その上に小さなフォーム画面を乗せたいです。 色々と試しましたが、上手く行きません。 もし良い方法をご存知の方ご教授頂きたく宜しくお願い致します。

  • VB6で2つのFormを使ってプログラムについて

    環境:WindowsXp VB6(SP?) 操作:2つのフォーム(1と2)1からエクセルのデータを呼び込み⇒表示⇒さらにデーター追加⇒     コマンドボタンを押して2を表示⇒一部1のデータをラベルに表示してさらにデータ追加⇒     コマンド」ボタンを押して1と2のデータをエクセルの帳票に登録・保存     以上のことを繰り返す。     この間2フォームの登録・保存で2のフォームはアンロードする。 質問:1順目はうまくいくのですが、2順目になると、パブリック変数を使用して、テキストやラベルに表    示された、ものはうまくデーターが反映されるが、それ以外は、フォーム上では表示されていて     もdebug.printすると、データーが空欄になっているため、登録・保存できない。     例:'****Form1***** Public ex As String Form2.Show End Sub '******Form2******** Private Sub Form_Load() Label1 = Form1.ex End Sub このとき、2順目のForm1.exは””でもForm2のLabel1にはデーターが表示されている。             なにがいけないのかが、いろいろネットで調べてもよくわからないので、どなたか教えてくだ      さい。(initilizeとかをせっていすべきなのか?)      ただ、まだVB6をはじめて半年ほどですので、よろしくおねがいいたします。

  • 日付期間の比較

    フォームから入力されたForm_timeに格納されている"900"という時間を表す値が、 DBデータの"900"という値と、"1000"という値の範囲に入るがどうかを判定して、 範囲内であればCheck_Flgという変数に1を格納、 範囲外であれば0を格納するよう処理を分岐したいのですが、肝心のIf条件内容を上手く書けないんです。 If (Cint(Form_time) = (Between rs("DB_STARTTIME") And rs("DB_ENDTIME"))) Then Check_Flg = 1 Else Check_Flg = 0 End If 「')' がありません。」と、コンパイルエラーが出てしまうんです... どうしたら、上手く判定出来るんでしょうか???

  • StrutsのFormについて

    現在Struts(1.2)にてプログラムしているのですが、 分からない点があります。 とりあえず入力画面と入力画面表示時に必要なデータを取得してくる Actionクラスを作りました。 必要なデータとは、セレクトボックスの値でDBから取得しております。 で、取得したデータをActionクラスのexcute()が呼ばれたタイミングで、ActionFormの生成を(new)してそれにDBから取得した値をいれて 最後にrequest.setAttribute()で設定しています。 これは間違いでしょうか? というのも、Actionクラスのexcute()のところで、 request.getAttribute("XXXform",xxForm)としてやると、 Formが取得できます。本来はこのFormに設定するべきなのでしょうか? request.setAttribute()をしていないのにFormがあることに混乱しております。 単にstruts-config.xmlでFormの定義をしたら勝手に作成される ものなのでしょうか? なんだか言ってることが分からなくなってきた、、 言いたいことをまとめると、、 今は入力画面初期表示のために自分でActionFormをexecute()の はじめでNEWしてそれにデータをいれてrquestに設定しているが、 本来は既にrquestにあるFormをgetしてそれにデータをいれて再度、 rquestに設定するのが正しいのかどうかです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • trim()のタイミング

    Web-DBといえば、PHPが一番と思っているのでこのジャンルで質問させていただきます。 DBのChar型データと入出力を行う時、trim()を用いますが、どのタイミングで使うと良いのでしょうか? プログラムとSQL上で以下4個所が考えらます。 ・フォーム送信された変数 ・SQLのINSERTする項目 ・SQLのSELECTした項目 ・SQLのWHERE条件

    • 締切済み
    • PHP
  • rails の form_forについて

    ruby on rails において、form_forヘルパーを用いてデータを取得したいのですが、ユーザー入力だけでなく、システムから計算したデータも入力したいのですが、やりかたがわかりません。 具体的に、blogモデルにpram1,pram2,pram3とあった場合、pram1はユーザーが入力し、pram2には、システムで計算した一週間後の日付を入れて置きたい場合、 controllerで、 @blog = Blog.new blog.save viewで <%= form_for(@blog) do |f|%> ~省略~ <%= submit %> などと、書くと思いますが、どのタイミングで、代入すればよいのですか? できれば、サンプルコードで教えてください。

    • ベストアンサー
    • Ruby
  • 数字データ『0』の処理について

    宜しくお願い致します。 MySQLのDBに、smallint unsigned not null設定のカラムに格納してある『0』の数字データをPHPから読み出す際に、『0』として認識してしまいます。『0』として認識してしまうので、2点の問題が発生しています。 1、一度登録した後のデータをPHPの入力フォームから呼び出し、変数に格納すると、『0』がフォーム内に入ってしまう点 2、入力フォームとDBのデータを比較して、修正の有無をチェックする際にも、『0』として認識するので、修正せずに入力フォームを空の状態で送信すると、修正が有ると認識してしまう DBの『0』を空のカラムとして認識できればこの2点の問題は解決できそうなのですが、回避する方法はありませんか?

    • ベストアンサー
    • PHP
  • formでファイルアップロードとテキストデータを送信したい

    JSPとServletでプログラムを作っております。 フォームで次のことをしたいと思っております。 1、DBにファイルをアップロードする。 2、DBにテキストデータを登録する。 この場合、 <form enctype = "multipart/form-data"> <form enctype = "text/plain"> を別個に指定できるのでしょうか? 出来ないとしたらどういう解決方法があるのでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • HTML
  • フォームを表示してからメッセージボックスを表示する

    メッセージボックスが表示される前に、フォームを表示させたいです。アクセスです。 ナビゲーションウインドウからフォームをダブルクリックしてフォームを開くのですが、 今のままだとメッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを表示してからメッセージボックスを表示するにはどうすればいいでしょう? 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 の順に開きますが、やはりフォームが最後に表示されてしまいます。 どうにかして先にフォームを表示させる方法はないでしょうか? ご回答よろしくお願いします。

専門家に質問してみよう