【发布时间】:2021-08-03 00:53:42
【问题描述】:
抱歉,我知道这个案例经常被讨论,但我没有找到完美的解决方案。
在我的访问数据库中,我使用每个 USysRibbons 的自定义 ui,这很好用。默认 UI 不会在用户模式下显示,但应该有一个按钮可以简单地恢复默认 UI。对此有什么最佳解决方案?
【问题讨论】:
抱歉,我知道这个案例经常被讨论,但我没有找到完美的解决方案。
在我的访问数据库中,我使用每个 USysRibbons 的自定义 ui,这很好用。默认 UI 不会在用户模式下显示,但应该有一个按钮可以简单地恢复默认 UI。对此有什么最佳解决方案?
【问题讨论】:
您可以在启动过程中按住 shift 键 - 您的自定义指定功能区因此不会显示。
当然,在开发和设计过程中,您将按住 shift 键,这样您的启动设置就不会运行。然后开发一段时间,然后在“用户”模式下进行测试,退出,然后在不绕过 shift 键的情况下重新进入应用程序。当您以用户模式运行/测试时,您可能会整天都在做这种舞蹈,然后再切换回开发者模式。
当您使用启动设置和自定义功能区集运行应用程序时,您无法真正开发或修改内容。而且你需要的设置太多了,尝试编写所有这些设置真的是在浪费时间。因此,当你想工作时,只需使用 shift-by-pass 即可。
一个非常酷的技巧是在 QAT 上放置一个紧凑型 + 修复按钮。因此,在工作时,只需单击一次鼠标,您只需不按住 shift 键 – 无需退出 + 重新输入,您现在处于“用户”模式,所有启动设置现在都处于“活动”状态并为您服务在“用户模式”下测试您的应用程序。这包括您的自定义色带。
另一个 c+r 并按住 shift 键将使您返回开发者模式。这假设您的 QAT 拥有 c+r inn,并且您的启动设置可能会隐藏它。因此,在这种情况下,要“翻转”回开发人员模式,我只需按 alt-f4 即可退出整个应用程序。此时,windows explore 中的 accDB 文件仍然会突出显示,所以我现在点击 enter 键。
因此,在“用户”和“开发者”模式“跳舞”之间的退出和切换将整天发生。
当你终于把事情做好了?然后您将 accDB 编译为 accDE 以锁定您的代码和表单设计。您还可以并且应该禁用 shift 键旁路并将此编译的应用程序分发给您的用户。编译后的应用程序不仅会锁定您的表单和代码免受任何更改的影响,而且此类代码运行起来更加可靠,因为未处理的错误不会重置全局或本地变量——您可以放心,在用户使用的整个时间内所有变量都保持不变运行您的应用程序。
以上确实是在 Access 中开发的唯一实用方法。
更好的是,这种方法还消除了在 Access 中尝试隐藏或显示开发人员界面的各种代码的需要 - 事实上,您发现许多设置都相当难以捉摸或难以在代码中设置,例如 AutoExec 宏,甚至是应用程序范围的自定义功能区。更糟糕的是,此类设置通常需要重新启动 Access。 (一旦开始访问,那么修改设置就太晚了,如果这样做,则需要退出 + 重新进入)。
所有这些大量的代码和麻烦都可以通过按住一个小小的 Shift 键以作为开发人员进入。
【讨论】:
接受的答案很有见地,我很高兴它对您有用。不幸的是,它实际上并没有回答你的问题。
默认状态是CustomRibbonID 属性根本不存在。因此,要返回默认状态,我们需要删除该属性。
Public Sub DeleteCurrentDBProperty(ByVal propertyName As String)
With CurrentDb.Properties
On Error Resume Next
.Delete propertyName
On Error GoTo 0
End With
End Sub
Public Sub RestoreDefaultRibbon()
DeleteCurrentDBProperty "CustomRibbonID"
End Sub
现在我们需要一种以编程方式重新添加属性的方法。这需要一种更稳健的方法。
Public Sub SetCurrentDBProperty(ByVal propertyName As String, ByVal newValue As Variant, Optional ByVal prpType As Long = dbText)
Dim thisDBs As Database
Set thisDBs = CurrentDb
Dim wasFound As Boolean
' Look for property in collection
Dim thisProperty As Object ' DAO.Property
For Each thisProperty In thisDBs.Properties
If thisProperty.Name = propertyName Then
' Check for matching type
If thisProperty.Type <> prpType Then
' Remove so we can add it back in with the correct type.
thisDBs.Properties.Delete propertyName
Exit For
End If
wasFound = True
' Skip when no change is required
If thisProperty.Value = newValue Then
Exit For
Else
' Update value
thisProperty.Value = newValue
End If
End If
Next thisProperty
If Not wasFound Then
' Add new property
Set thisProperty = thisDBs.CreateProperty(propertyName, prpType, newValue)
thisDBs.Properties.Append thisProperty
End If
End Sub
然后给定一个示例功能区名称Runtime,您可以像这样调用属性设置器:
Public Sub SetRuntimeRibbon()
SetCurrentDBProperty "CustomRibbonID", "Runtime"
End Sub
【讨论】: