【问题标题】:Restore default ribbons with vba (Using a custom UI)使用 vba 恢复默认功能区(使用自定义 UI)
【发布时间】:2021-08-03 00:53:42
【问题描述】:

抱歉,我知道这个案例经常被讨论,但我没有找到完美的解决方案。

在我的访问数据库中,我使用每个 USysRibbons 的自定义 ui,这很好用。默认 UI 不会在用户模式下显示,但应该有一个按钮可以简单地恢复默认 UI。对此有什么最佳解决方案?

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    您可以在启动过程中按住 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 键以作为开发人员进入。

    【讨论】:

      【解决方案2】:

      接受的答案很有见地,我很高兴它对您有用。不幸的是,它实际上并没有回答你的问题。

      默认状态是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
      

      【讨论】:

        猜你喜欢
        • 2013-09-02
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 2018-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多