Calc(77)コントローラのロックとアクションのロックとリスナー

公開日: 2018年02月13日 更新日: 2019年05月11日

旧ブログ

t f B! P L
Calc(57)lockControllers()やaddActionLock()でのマクロの速度比較ででてきたlockControllers()やaddActionLock()を使ったときのリスナーの発火についてCalc(55)追加できるリスナー一覧: その7ListenersForCalcSourceAttr.odsで調べようと思いましたけど、かなり複雑なので途中でやめました。

前の関連記事:Calc(76)画面の更新をせずにコントローラでシートを操作する


コントローラのロックやアクションのロックをするマクロ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def docLockControllers(): 
    doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
    doc.lockControllers()  # コントローラをロック。
def docUnLockControllers(): 
    doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
    doc.unlockControllers()  # コントローラのロックを解除。
def docAddActionLock(): 
    doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
    doc.addActionLock()  # ドキュメントのアクションをロック。
def docRmoveActionLock(): 
    doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
    doc.removeActionLock()  # ドキュメントのアクションのロックを解除。
def cellAddActionLock(): 
    doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
    controller = doc.getCurrentController()  # コントローラの取得。
    sheet = controller.getActiveSheet()  # アクティブシートを取得。
    sheet["A1"].addActionLock()  # セルのアクションをロック。
def cellRmoveActionLock(): 
    doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
    controller = doc.getCurrentController()  # コントローラの取得。
    sheet = controller.getActiveSheet()  # アクティブシートを取得。
    sheet["A1"].removeActionLock()  # セルのアクションのロックを解除。
def frameAddActionLock(): 
    doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
    controller = doc.getCurrentController()  # コントローラの取得。
    frame = controller.getFrame()  # フレームの取得。
    frame.addActionLock()  # フレームのアクションをロック。
def frameRmoveActionLock(): 
    doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
    controller = doc.getCurrentController()  # コントローラの取得。
    frame = controller.getFrame()  # フレームの取得。
    frame.removeActionLock()  # フレームのアクションのロックを解除。
ListenersForCalcSourceAttr.odsではセルに追加できるリスナーはA1セルに追加しているので、セルへのaddActionLock()メソッドはA1セルに対して実行しています。

A1セルを選択しaを入力してEnterキーを押したときのリスナーの発火をみました、、、

フレーム以外についてはたぶん影響を受けるのはXModifyListenerだけのようです。

コントローラのロックとドキュメントのアクションのロックではドキュメントに追加したmodified()メソッドが発火しなくなり、セルのアクションをロックするとセルに追加したmodified()メソッドが発火しなくなります。

フレームのロックについてはListenersForCalc2-DisabledLine228.odsで確認しましたが、よくわかりませんでした。

とりあえずフレームのアクションをロックするとロックを解除するまでLibreOfficeが終了できなくなることはわかりました。

コントローラのロックやアクションのロックをしたときの実行時間の比較


コントローラのロックやアクションのロックの効果を実行時間で確認しようと思いましたが、結論としてはうまくいきませんでした。

ColorPaletteTime.ods

Calc(75)カラーパレットの色の名前と値の一覧のマクロを実行時間を出力できるようにしました。


埋め込みマクロファイルColorPaletteTimeにはdocAddActionLock、docLockControllers、noLock、wLockの4つのマクロが含まれています。

docAddActionLockはドキュメントのアックションをロックして実行します。

docLockControllersはコントローラをロックして実行します。

noLockはロックなしで実行します。

wLockはアクションとコントローラをロックして実行します。

これらの実行時間を比較しようと思ったのですが、同じ何回か実行していると最適化が進むのか結局はどれも同じような時間周辺に落ち着いてしまってどれが一番速いのかなんともいえませんでした。

Calc(57)lockControllers()やaddActionLock()でのマクロの速度比較のときと違って、マクロセレクターから実行すると画面が逐一更新されないので結局はすべてwLockと同じ効果になるのかもしれません。

次の関連記事:Calc(78)グリッドコントロールの行をマウスでコピペする

ブログ検索 by Blogger

Translate

«
Feb. 2018
»
Sun
Mon
Tue
Wed
Thu
Fri
Sat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Created by Calendar Gadget

QooQ