1

ユーザーがアプリケーションを終了するときにフォームのコンテンツを破棄するにはどうすればよいですか?ユーザーがボタンを使用してフォームを閉じる場合(たとえば、メインフォームに戻る場合)、これは。を使用して実行できますMe.Undo。しかし、彼がアプリケーション全体を閉じると、現在のコンテンツは意図したとおりではない対応するテーブルに入力されます。また、アプリケーションを閉じているときに両方とも発生しないイベントとイベントを
試しました。on Closeon Unload

編集:on Closeイベントは奇妙な振る舞いを示しています。AMsgBoxは実行されていますが、Me.Undoどういうわけか機能しません。(Xがクリックされてアプリケーションを終了するイベントの前に、フォームのコンテンツがテーブルに入力されている可能性がありますか?)

4

1 に答える 1

1

フォームを閉じると、バインドされたコントロールの値に対する保留中の変更の保存が自動的にトリガーされます。フォームのアンロードイベントまたはクローズイベントからその保存操作をインターセプトすることはできません。そして、それをインターセプトするために私が見つけることができる唯一の方法は、更新および挿入イベントの前のフォームからです。

Dim SaveFlag As Boolean

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me.Dirty = True And SaveFlag = False Then
        Me.Undo
    End If
End Sub

挿入する前に、同様のことを行う必要があります。SaveFlagまた、変更を保存したいときに実際に変更を保存できるように、なんらかの方法で管理する必要があります。

Private Sub cmdSave_Click()
    SaveFlag = True
    Me.Dirty = False
    SaveFlag = False
End Sub

ただし、レコード間を移動するとき、またはメインフォームとサブフォームの間でフォーカスを切り替えるときに変更を自動的に保存するなど、Accessのデフォルトの動作が必要な場合は、このアプローチは適していません。

この機能が十分に必要な場合は、バインドされていないデータコントロールに切り替えて、明示的に実行するように命令した場合にのみ値を保存できます。しかし、それは多くの余分な作業を追加することになり、努力する価値があるかどうかはわかりません。私はこれをユーザー教育の問題として扱いたくなります。「フォームに未保存の変更を加えてアプリケーションを閉じると、変更が保存されることに注意してください。

于 2012-10-15T23:04:25.207 に答える