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 件のコメント:
コメントを投稿