我已经开始将Access Ribbon用于数据库中的菜单,但现在恐怕陷入僵局。
我想将自己的图像用于功能区中的图标,但在完成此任务时遇到了很多困难。
代码在下面,但是我不断收到的错误消息是Access无法运行宏或回调函数'getImages'。
丝带xml代码:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon startFromScratch="true">
<tabs>
<tab id="tMainMenu" label="Main Menu">
<group id="Developer">
<button id="DevTools1"/>
</group>
<group id="MainMenuSpacer1">
</group>
<group id="gSupport">
<button id="Support1" label="Custom Image" getImage="getImages"/>
</group>
<group id="MainMenuSpacer2">
</group>
<group id="gShutdown">
<button id="Shutdown"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
VBA程序代码:
Public Sub getImages(control As IRibbonControl, ByRef image)
If irc.ID = "Support1" Then
MyPath = "J:\Images\OperatorAssistantButton1.png"
Set image = LoadPicture(MyPath)
End If
End Sub
我的公司没有12.0参考。我们正在使用15.0
答案 0 :(得分:0)
请记住,有两种类型的图像加载。
一次性图像加载用于“最多”图像加载。当您需要自定义图标但在加载后不打算更改图像时使用它。因此,这种方法可用于功能区的“大多数”自定义图像加载。
当您希望不仅可以加载图像,而且还希望更改图像时使用此选项-例如,将天气显示为晴天的图像,然后将其更改为多云的云。
因此非常重要的是要区分您的目标和需要和想要的图像加载类型。
对于功能区中的“常规”图像加载和设置,您只需一次指定将要使用的例程(在功能区xml的开头)。然后,该例程将用于所有图像设置,并且您无需为每个控件指定回调例程。
因此,您可以为每个控件使用“图像”属性设置,但只能一次指定回调例程。
功能区代码将如下所示:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
loadImage="CallBackLoadImage"
onLoad="MyRibbonLoadA">
<group id="group1" label="Basic Button Attributes Examples">
<button id="button1" label="Button1"
size="large"
getEnabled="MyEnable"
getVisible="MyVisible"
image="CokeClassic.png"
onAction="=Bt1()"
supertip= "example load a image without ability to change"
/>
<button id="button2" label="button2"
size="large"
getEnabled="MyEnable"
image="CokeZero.png"
onAction="=Bt2()"
/>
请注意上面的“如何为第一个按钮设置图像”。
image="CokeClassic.png"
对于第二个按钮,我们使用:
image="CokeZero.png"
因此,实际上,我们硬编码并在功能区的XML中指定图像。在上面的开头,我们设置了GLOBAL图像加载例程,该例程将用于功能区中指定的所有图像。
因此,我们将在所有这些图像中使用/调用的例程是在开始时指定的:
loadImage="CallBackLoadImage"
请注意,此操作仅一次完成,并且在功能区XML的开头–您没有为每个按钮指定此回调。
必须将VBA例程(在我们的示例中为CallBAckLoadImage)放置在标准VBA代码模块中(而不是类,而不是表单代码模块中)。因此,我们的功能区加载代码是这样的:
Sub CallbackLoadImage(strImage As String, _
ByRef image)
Dim strImagePath As String
' Callback loadImage
strImagePath = CurrentProject.Path & "\ribbon\" & strImage
Set image = LoadPicture(strImagePath)
End Sub
在上面,请注意我们的代码如何“假设”一个名为Ribbon的文件夹将被放置在运行前端(accDB / accDE)的SAME文件夹中。因此,我们不对任何路径名进行硬编码,并假定功能区“ icon”文件夹将始终与运行应用程序所在的文件夹位于同一文件夹中。因此,我们可以复制,重命名文件夹或将其移动到任何地方,我们的图像加载代码仍将运行。
因此请紧记,您不要仅指定一次EACH按钮的回叫。注意,图像名称是如何自动传递给我们调用的例程的。因此,“图像=一些图像”非常好,因为我们不需要特殊的代码即可提取或找出所需的图像。
我们想在运行时更改图标。如前所述,对于大多数图像,我们使用方法1,但在某些情况下,我们需要动态例程。但是,在功能区启动时,这意味着代码将必须提供某些默认类型的图像,因此,在本示例中,我使用“标签”设置来设置默认功能区。
所以我们的按钮代码现在看起来像:
<button id="Weather" label = "The Weather button"
size="large"
getImage="MyImage" tag="sunny.png"
onAction= "=BtWeather()"
/>
因此在上面,我们确实为每个按钮等设置了回叫。
回叫代码如下:
Public Sub MyImage(control As IRibbonControl, ByRef image)
Dim strImagePath As String
Dim strImage As String
' for the 1st call when ribbon loads there no images set. So we
' use the tag as kludge workaround to set the starting image
If strGlobalImage = "" then
strImage = control.Tag
End If
If strImage <> "" Then
If Left(strImage, 4) = "mso." Then
image = Mid(strImage, 5)
Else
strImagePath = CurrentProject.Path & "\ribbon\" & strImage
Set image = LoadPicture(strImagePath)
End If
End If
End Sub
在上面的说明中,我也有使用内置图像的规定-因为有很多有用的图像,所以我采用了可以将文本“ iso.ImageName”放置到内置图标中的标准。因此,如果您使用“ iso.BuiltInImageName”,则上面的方法将起作用。
我也在上面的过程1中执行此操作,因此我有:
Sub CallbackLoadImage(strImage As String, _
ByRef image)
Dim strImagePath As String
' Callback loadImage
If Left(strImage, 4) = "mso." Then
strImage = Mid(strImage, 5)
image = strImage
Else
strImagePath = CurrentProject.Path & "\ribbon\" & strImage
Set image = LoadPicture(strImagePath)
End If
End Sub
因此,上面允许我使用Office内置的任何“许多”图标-很多有用的图标。
因此,请在两种图像加载之间保持“强”区别:
1)您想要按钮等的图像。
2)您想要在加载到其他类型的图像以进行状态等更改后更改图像。
最后但并非最不重要的: 对于任何按钮,必须声明一组保存单个按钮状态的变量确实很痛苦。 你有: 可见, 已启用 标签文字 图片
因此,对于每个按钮,通常必须声明一个变量以保存所有状态。对于仅2-3个按钮,您需要12个全局变量来保存按钮的这些状态。因此,我建立了一个自动创建并为您完成所有肮脏工作的类。
您可以在上面的示例代码中找到上述相同的代码,以及更多信息:
http://www.kallal.ca/Ribbon/ribbon.htm
上面的主要优点是您不必为要动态更改图像或标签文本的每个新按钮等声明新变量。