从表中将图片加载到Microsoft Access 2010功能区

时间:2014-11-07 15:19:35

标签: image bitmap ms-access-2010 ribbon

我正在使用Access 2010的新功能区功能,我试图找出从表格中将图像加载到功能区的最简单方法。我知道我可以通过使用GDI API函数来实现这一点,但从我所看到的代码看起来很复杂并且似乎利用额外的dll,如果我不需要,我也会避免调用。我也知道我可以在窗体上创建一个控件,将图像加载到窗体,然后将图像从窗体加载到功能区图像变量。虽然使用表格是可行的,但它看起来很草率。最后,如果必须的话,我将使用上述两种方法中的一种,但似乎应该有一些简单的方法将表中的图像直接加载到功能区的图像变量中。

有一点需要注意的是,我愿意使用最简单的图像格式。这些图标文件非常小,所以我不关心文件大小,我也不关心它们是否具有透明度。因此,如果有一种方法只适用于我可以使用的位图文件类型。

以下是功能区XML中按钮的代码:

<button id="CCTrans" label="Credit Card Trans." getImage="GetMnuIcn" onAction="=OpenCCTrans()" />

以下是检索图像的代码:

Sub GetMnuIcn(control As IRibbonControl, ByRef Image)
    Set Image = DLookup("Img", "LtblImg", "Lbl=""" & control.ID & """")
End Sub

我尝试将图像存储为OLE对象和附件。无论哪种方式,当我尝试检索它时,它会给我错误&#34; Type Mismatch&#34;。为简单起见,我将其存储为位图,但我在第一次尝试时也尝试过.gif和.png。

注意:显然,功能区图标是IPictureDisp对象。如果我能弄清楚如何将表中的图像加载到其中一种对象类型中,我应该可以将它用于功能区。

此外,在微软的网站上有很多很好的信息,但我还没能把它拼凑成一个解决方案。这是一个链接:http://msdn.microsoft.com/en-us/library/bb187398.aspx

1 个答案:

答案 0 :(得分:0)

在尝试寻找更好的解决方案的繁琐日子之后,我被迫在我认为各种平庸的方法之间进行选择。我真的想直接将它加载到变量中,但是这样做的唯一方法是需要引用一堆dll并且代码非常复杂。为了避免任何额外的依赖关系并保持我的代码更简单,我决定采用将包含附加图像的表分配给表单的路线,以隐藏模式打开该表单,然后从表单中分配图片变量。

由于某种原因,我在其他地方看到的通过此方法按需加载图片的代码导致程序崩溃,因此我必须在程序打开时将图片加载到变量中,然后让菜单栏设置图标来自选择菜单时的那些变量。

我的代码如下:

Dim Icn(15) As IPictureDisp, IcnLbl(15) As String   

Function SetMnuIcn()
    Dim Img As Recordset, i As Byte
    DoCmd.OpenForm "frmImg", acNormal, , , acFormReadOnly, acHidden  
    Set Img = Forms!frmImg.Recordset
    While Not Img.EOF
        i = i + 1
        Set Icn(i) = Forms!frmImg!Img.PictureDisp
        IcnLbl(i) = Img!Lbl
        Img.MoveNext
    Wend
    DoCmd.Close acForm, "frmImg", acSaveNo
End Function

Sub GetMnuIcn(control As IRibbonControl, ByRef Image)
    Set Image = Icn(GetAryLoc(IcnLbl, control.ID, 15))
End Sub

Function GetAryLoc(varValues As Variant, varMatch As Variant, NumOfValues As Integer) As Integer
    Dim i As Integer
    For i = 1 To NumOfValues
        If varValues(i) = varMatch Then GetAryLoc = i
    Next
End Function

注意:为确保图标在需要之前已加载,我指定SetMnuIcn在功能区加载时运行:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="=SetMnuIcn()">