*コントローラのロック [#q21c2df4] ユーザーとモデルの間にあるコントローラをロックしてアプリケーションの表示の更新を防ぐことでマクロなどの実行速度を上げる。API からドキュメントを変更するときにはコントローラをロックすることで表示がインタラクティブではなくなりますが、実行時間が短くなります (傾向にあります)。最後にコントローラのロックをはずすと表示が一度に更新されます。 OOo 2.3.0 では Calc などでチャートが存在するとチャートの更新でひどくマクロの実行時間が長くなるようです。そのため、マクロの動作中はコントローラをロックしてチャートを更新させないようにすると実行速度が改善します。 #contents モデル - コントローラ - ビューの関係に関しては DevGuide 参照のこと。 **コントローラのロックと解除 [#nd3178e3] コントローラのロックは com.sun.star.document.frame.XModel インターフェースの ''lockControllers'' メソッドで行います。また、解除は同インターフェースの ''unlockControllers'' メソッドで行います。 Sub lockcontrollers_1 oDoc = ThisComponent oDoc.lockControllers() ' .... do something oDoc.unlockControllers() End Sub ロックを解除しないとドキュメントが更新されなくなります。すでにロックされているかどうかは ''hasControllersLocked'' メソッドで調べます。 **埋め込みオブジェクトのコントローラ [#zb52c67f] Calc のチャートは埋め込み型 OLE オブジェクトです。これらは別のドキュメントとして埋め込まれているドキュメントとは別にコントローラがあります。 以下のコードでは Calc ドキュメントの全てのシート上にあるチャートのコントローラをロックします。 Sub lockcontrollers_2 oDoc = ThisComponent oDrawPages = oDoc.getDrawPages() For i = 0 To oDrawPages.getCount() -1 oPage = oDrawPages.getByIndex(i) For j = 0 To oPage.getCount() -1 oDrawing = oPage.getByIndex(j) If oDrawing.ShapeType = _ "com.sun.star.drawing.OLE2Shape" AND oDrawing.CLSID = _ "12DCAE26-281F-416F-a234-c3086127382e" Then oDrawing.Model.lockControllers() 'oDrawing.Model.unlockControllers() End If Next j Next i End Sub シェープ com.sun.star.drawing.OLE2Shape でチャートの CLSID 12DCAE26-281F-416F-a234-c3086127382e のものをロックしています。 |