- ベストアンサー
フォームが開いただけでCurrentイベントが発生してしまう
フォームが開いただけでCurrentイベント(レコード移動時)が発生してしまうのですが これを回避する方法はありますか? IF文などを設けるしかないのでしょうか? そもそもフォームを開いただけでカレントレコードが移動してるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> そもそもフォームを開いただけでカレントレコードが移動してるのでしょうか? 「フォームを開くことで初めて最初のレコードが表示が表示される」という意味では、 「無→先頭」ということで移動しています、という説明はできるのですが・・・ 実際には、Accessでは(・・・で、いいんですよね?(汗))、レコードソースが設定されていない 「非連結フォーム」でもCurrentイベントが発生してしまいますので、 「フォームの展開時に発生する」のは「仕様」として捉えた方がいいのかもしれません(汗) (もしかしたら「テーブルやフィールドが何も定義されていないレコードセットが開かれている」 という解釈なのかも・・・?) > IF文などを設けるしかないのでしょうか? そういうことになるかと思います。 データベースウィンドウ(テーブルやフォームの一覧が表示される画面)や、別フォームから DoCmd.OpenFormなどで開くのみなら(注:下記「※」参照)、「Me.Visible」で判定 できます。 Private Sub Form_Current() 'フォーム展開時はCurrentイベントの処理を実行しない If Me.Visible = False Then Exit Sub 'レコード移動時の処理(ここではMsgBoxで代用) MsgBox "Currentイベントの処理を実行します。" End Sub ※フォームのデザインビューからフォームビューに切り替えた場合は、Visible=Trueとなる ため、Currentイベントの処理が実行されてしまいます。
その他の回答 (1)
- DexMachina
- ベストアンサー率73% (1287/1744)
No.1です。 改めて考えてみたのですが・・・「レコード移動時」という言葉にとらわれすぎていた かもしれません(汗) 英語、或いはVBAでは「Current」(プロパティ名としてはOnCurrent)となって いますので、直訳すれば「現在」、意訳で「現状」程度になるかと思います。 つまり、フォームを開くとき、及びレコード移動の際には、表示データの「現状確認」 (→連結コントロールならレコードのデータの確認、非連結コントロールなら初期値 (DefaultValueプロパティの値を含めて))が行われます。 この、「フォーム単位での表示内容の確認・更新」が行われるときに発生するのが 「Current」イベントだと考えれば、フォームの展開時とレコードの移動時でそれぞれ このイベントが発生するのも妥当ということになるのではないでしょうか。 ※元々が「Current」プロパティと「CurrentRecord」という紛らわしく思える名前が 使われているところに、「レコード移動時」の和名(?)で、私も完全にレコード関連 のものと誤解していましたが(汗)、「現状確認時」といった名前の方がふさわしかった のかもしれません。
お礼
確かに「レコード移動時」という和訳が混乱の元ですね。 詳しい説明ありがとうございます。参考になりました。
お礼
説明不足ですいません。アクセス2003です。 なるほど。「無→先頭」へ移動ということですか。 仕様ということで割り切ります。 どうもありがとうございました。