2011/05/04

access2010 access2007 IRibbonUIオブジェクトの永続化って感じ

RibbonUIのことなら、ここを見るって。
Gunter Aveniusさんのとこか、きぬあささんのところ。

久しぶりにRibbonXmlを書いていたからいろいろ情報をあさっていたのだけど、なるほどなぁという記事があった。

IRibbonUIオブジェクトがNothingになったときの対処法

記事ではExcelについてなのだけど、当然Accessでもつかえるはず。
IRibbonUIオブジェクトをObjPtrを使って補ってやろうということは変わりはないのだが、オブジェクトのポインタをレジストリに書き込むということはAccessではしなくてもよいだろうな。TempVarsコレクションに格納しておけば、Removeメソッドなど実行しない限り消えないのだから。


Option Compare Database
Option Explicit

Private rbn01 As IRibbonUI

#If VBA7 Then
Declare PtrSafe Sub CopyMemory Lib "kernel32" _
                                Alias "RtlMoveMemory" ( _
                                Destination As Any, _
                                Source As Any, _
                                ByVal Length As LongPtr)
#Else
Declare Sub CopyMemory Lib "kernel32.dll" _
                                Alias "RtlMoveMemory" ( _
                                Destination As Any, _
                                Source As Any, _
                                ByVal Length As Long)
#End If

Sub onLoadRbn01(rbn As IRibbonUI)
    Set rbn01 = rbn
    TempVars("Rbn01") = ObjPtr(rbn01)
    TempVars("bln") = True
End Sub

Sub getEnabled(ctr As IRibbonControl, rtnbln)
    rtnbln = TempVars("bln")
    TempVars("bln") = Not TempVars("bln")
End Sub

Sub UpdateRibbon()
    If rbn01 Is Nothing Then
        #If VBA7 Then
            Dim rbnPtr As LongPtr
        #Else
            Dim rbnPtr As Long
        #End If
        Dim tmpRbn As IRibbonUI, erasePtr As Long
        erasePtr = 0
        rbnPtr = TempVars("Rbn01").Value
        CopyMemory tmpRbn, rbnPtr, LenB(rbnPtr)
        Set rbn01 = tmpRbn
        CopyMemory tmpRbn, erasePtr, LenB(erasePtr)
    End If
    rbn01.Invalidate
End Sub


<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="onLoadRbn01">
  <ribbon startFromScratch="true">
    <tabs>
      <tab id="tab01" label="tab01">
        <group id="g01" label="group01">
          <button id="btn01" imageMso="HappyFace" size="large" getEnabled="getEnabled"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
でも、頻繁に実行時エラーがでてると強制終了になってしまうな。横着するのに使うのはよくないってことか。
ちょっと調べ物をして修正。参照カウントってな。

0 件のコメント: