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