关闭 Access 时防止打开表单的“保存设计更改”

Posted

技术标签:

【中文标题】关闭 Access 时防止打开表单的“保存设计更改”【英文标题】:Prevent 'save design changes' for an open form when closing Access 【发布时间】:2016-10-06 21:25:33 【问题描述】:

我在 Access 2010 应用程序中有一个拆分表单作为我的主界面。像往常一样,用户可以调整数据表部分的大小、重新排序列等。

但是,我不希望他们在离开表单时保存此类更改。每次打开表单时都应加载默认格式。

除了一种关闭方法外,我已经解决了所有问题。为了避免使用默认关闭按钮关闭它们,我设置了边框样式 = 无。相反,我有一个使用 DoCmd.CLOSE acForm, "Main_form", acSaveNo

的关闭表单按钮

但是,如果用户单击 Access 应用程序的关闭按钮,它会像往常一样弹出“是否要保存对表单设计的更改”对话框。

我考虑禁用应用程序的“关闭”按钮,但弄乱 Windows API 超出了我的技能(应该有一种方法可以在不采取极端措施的情况下完成此操作)。

【问题讨论】:

【参考方案1】:

我找到了一种方法来做到这一点。数据库选项、表单格式选项和vba的组合可以做到。

    转至 Access 主界面中的“当前数据库”选项屏幕 选项并取消选中“在数据表视图中启用设计更改”。这将阻止数据库中的所有数据表视图设计更改,因此您必须进入设计模式以进行任何表更改。用户仍然可以对表单中的列重新排序和调整大小,但 Access 不再认为是有效的设计更改,并且无论您如何关闭表单都不会提示保存它

    设置表单格式属性“保存分隔栏位置”= 否。现在,当表单关闭时,表单将清除对栏位置的任何更改。然而,Access 让我对这个设置感到非常奇怪。一旦我曾经将该选项设置为否,我就不能再使用设计视图或布局视图来设置新的默认栏位置;它总是恢复到我第一次尝试此设置时的位置。即使将选项重置为是、保存设计更改并完全退出数据库也无法解决此问题。

    所以我添加了一个 On Load 事件以在表单打开时重置拆分表单大小:Me.SplitFormSize = 9000。涉及的数字高得惊人。在表单属性列表中,这是以英寸为单位设置的。我的是 6.5",显然是 9000。

通过这三项更改(以及我在问题中详述的步骤),即使用户完全关闭 Access 应用程序,当表单关闭时,Access 也不再提示保存设计更改。表单还会将拆分表单栏捕捉回它应该加载的位置。

【讨论】:

VBA 中的大小以缇为单位给出。 “Twip”是一种计量单位,等于打印机点的 1/20。一英寸等于 1440 缇,一厘米等于 567 缇。 Source @Andre 很高兴知道。你知道一个用例,比如 5 twips 的差异会做任何事情吗?有用吗? 几乎没有。 :) 我使用公制,所以我的代码中总是有一个常数Const TPC = 567(缇/厘米),并用它进行所有计算,例如Me.someControl.Top = 0.5 * TPC. 您也可以在 VBA 中使用 CurrentDb.Properties("AllowDatasheetSchema") = False 关闭“启用数据表视图中的设计更改”,here 描述了更多信息。【参考方案2】:

由于 API 也超出了我的技能范围,因此这里有一个左字段解决方法。

复制Main_Form 并将其重命名为“Main_Form_Template”。创建一个 Autoexec 模块或编辑一个现有的并添加:

DoCmd.DeleteObject acForm, "Main_Form"
DoCmd.CopyObject , "Main_Form", acForm, "Main_Form_Template"

这应该在用户每次打开数据库时恢复标准模板,即使他们要在关闭 Access 时保存表单。

【讨论】:

我不认为这对我有用;如果数据库中的另一个用户在使用该表单时自动执行删除该表单会很麻烦。 @Christopher D. 我喜欢这样。有时必须使用它。 Rominus,你在处理数据库的共享副本吗? 我知道你说运行时已经过时了,那么拆分数据库呢?将本地前端 accdbs 分发给用户将允许您删除对象,而不必担心其他人打开该对象。我同意这不适用于共享文件。 或者您可以测试一下表单是否在 Autoexec 中打开,如果是则取消。最终有人会第一个打开那个数据库,然后模板会被恢复。它可能会让更改浮动一段时间,但最终它会在没有手动设计更改的情况下恢复。 即使您最终没有使用此解决方案,我也建议您分发本地前端,而不是与多个用户共享同一个前端文件。我不认为共享有很大的缺点,但如果每个用户都有自己的本地副本,它会使开发、部署和版本控制更加直接。很高兴你能够让它工作!【参考方案3】:

关闭表单上的关闭按钮。

在表单的属性表的格式选项卡上,大约向下 2/3。设置关闭按钮 = 否

这会强制用户通过您创建的按钮将其关闭。

【讨论】:

哦,好吧。我现在看到了。嗯,如果用户倾向于更改表单,也许是时候开始分发您的数据库的 MDE/ACCDE 版本了。 是的,我很想这样做,但公司 IT 不喜欢可执行运行时 也许有一个隐藏的表单会触发另一个表单关闭?即使用 FormX 的“OnClose”属性执行带有 acSaveNo 参数的关闭。 但是这需要触发 FormX 首先关闭,以便关闭所有其他。 (抱歉,这里只是集思广益) 知道了!如果您有兴趣,我已经发布了我的答案。

以上是关于关闭 Access 时防止打开表单的“保存设计更改”的主要内容,如果未能解决你的问题,请参考以下文章

访问 VBA 防止在关闭时输入表单记录

Access 2010 VBA:为啥这个表单打开和关闭序列不起作用?

在 MS Access 中禁用 F11 键以防止打开导航窗格

MsgBox 确认退出 Access 中的表单

Access 2003 FORMS:当我在运行时使用 VBA 设置时,即使我关闭然后打开,ListBox 的“RowSource”仍然存在

防止 Access 表单中的整个字段被突出显示