Microsoft Access 掲示板

フォームを閉じる際のDirty処理につきまして / 6

9 コメント
views
4 フォロー
6
ゲッキョク駐車場 2020/12/25 (金) 16:07:41 修正 cb55f@f6500

毎度、手取り足取り本当にありがたいです。

Dirtyは、開いてないと使えないヨ、くらいしか知識が無かったので
Syscmdも有効活用していきたいと思います!
ありがとうございます…!
まだまだイベントのタイミングがうまくつかめていないので、
その部分についてももう一度勉強しなおしてみようと思います。

また、部品フォームのDirty部分なんですが、以下のような形にしました。

Private Sub 部品F閉ボタン_click()

  If Me.Dirty Then
    If MsgBox("データが変更されています。保存して終了しますか?", vbYesNo) = vbNo Then
      Exit Sub

    Else
      Me.BeforeUpdate = ""  'キャンセル無効
      DoCmd.RunCommand acCmdSaveRecord
      'DoCmd.RunCommand acCmdRefresh
      Me.BeforeUpdate = "[イベント プロシージャ]"  'キャンセル有効

      Call UserLog("MNFCT", "Update")
    End If
  End If

  DoCmd.Close
End Sub

メインフォームの方はこのように

Private Sub 終了ボタン_Click()
  On Error GoTo ErrHandler

  If SysCmd(acSysCmdGetObjectState, acForm, "F_部品") <> 0 Then
    Forms!F_部品.終了ボタン_Click
  End If

  If SysCmd(acSysCmdGetObjectState, acForm, "F_製品") <> 0 Then
    Forms!F_製品.終了ボタン_Click
  End If

  DoCmd.Quit acQuitPrompt
ErrHandler:
End Sub

SysCmdを用いた、hirotonさんの方法でなく、上記のようなものでも
今回の件については問題なく動きますでしょうか?

通報 ...
  • 7
    hiroton 2020/12/25 (金) 16:48:44 ca77e@f966d >> 6

    理想の運用ならそれでいいと思いますが、フォームって予期せぬ閉じ方をされるんですよね
    フォーム右上の×をクリックされたり(非表示にできるので何とかなる)、ACCESS本体の右上の×をクリックされたり(本体の表示をしない方法があるので何とかなる)、タスクバーから終了されたり、タスクマネージャーから強制終了されたり・・・

    なので、実際にデータが決定されるタイミング(BeforeUpdate)で内容を決めましょう。という話です

    Private Sub Form_BeforeUpdate(Cancel As Integer)
      If (保存しない条件) Then Cancel = True
    End Sub
    

    こうしておけば、どのような形でフォームが閉じられてもBeforeUpdateイベントを通るので保存内容の確認ができます