【发布时间】:2021-06-21 11:30:58
【问题描述】:
这应该很简单但是!
我的打开表单显示一个下拉列表来选择用户名(从选择查询中填写)和一个未绑定的文本框来输入密码。密码与固定字符串进行比较,如果匹配,我需要关闭此表单并打开主菜单。如果您不知道密码,还有一个按钮可以关闭整个系统。 选项卡顺序为下拉菜单、文本框、退出按钮。
在AfterUpdate、BeforeUpdate、lostFocus等多种变种之后,我把这段代码放在了退出按钮的Got Focus事件中,这样退出密码框就会触发它。每个函数都将焦点重新设置为适当的错误条目,但如果一切正确,程序将转到最后两行。
Private Sub btnExitAll_GotFocus()
If PasswordNotOk() Then Exit Sub
If UserNotOK() Then Exit Sub
DoCmd.OpenForm "Main Menu"
DoCmd.Close acForm, "Opening screen", acSaveNo
End sub
“关闭”行失败并显示 2585。我尝试颠倒最后两行的顺序。 我什至将最后两行放在临时按钮的单击事件中,它们完全按预期工作!所以我尝试从这个 sub 调用该按钮的单击事件,但得到了同样的错误。 我试过卸载我,但会引发错误 361 无法加载或卸载此对象,但我无法让此表单自行关闭。 如果有帮助,当我尝试在 UNBOUD 文本框的更新前事件中执行此操作时,我收到错误消息,提示我在保存数据之前无法执行此操作。
请问我做错了什么?
【问题讨论】:
-
为此使用正确的事件:OnClick。
-
尝试在 VBA 中编写身份验证系统是您出错的地方。不要打扰。即使您远离固定字符串方法,也不可能使其安全。如果您需要保护 Access DB,请使用 NTFS 权限,用户要么有权读取\写入后端,要么没有权限。现在您的身份验证是 Windows。
-
感谢你们的 cmets: Gustav:正如我所说,我尝试使用按钮并且它有效,但为简单起见,我只希望我的非技术老年用户在有输入了他们的密码。为什么它在这个事件中不起作用? Hackslash:非常感谢。我已经复制了你的代码,但得到了同样的错误。您的 cmets re 安全已被注意到,我并不是想保证安全。计算机处于离线状态,并且在一个可以安全访问的房间中。所有可以进入房间的人都可以使用计算机,但我有一个用户听说过 GDPR 并想要一个密码。
-
HackSlash。有关表单不脏的信息,我在 IF 循环中放置了一个中断,并且它永远不会到达。这个错误是什么意思,是什么原因造成的?
-
好的,我有一个解决办法。在表单加载中,我将 Timer Interval 设置为最大(大约 24 天)并将 Form Close 代码放在 Sub Form_Timer() 中。在 OnGotFocus 事件中,我检查密码,如果没问题,打开主菜单。然后我将计时器间隔设置为 1(毫秒),计时器事件关闭表单。但为什么它会通过点击或计时器事件以外的任何错误?
标签: vba ms-access-2010