前の関連記事:Calc(90)ちょっと気になるところの設定の変更方法
変化で発火するリスナーの発火条件
インターフェイス | XChangesListenerのchangesOccurred() | XModifyListenerのmodified() | ||||
変化した情報の取得 | 可 | 不可 | ||||
サブジェクト | ドキュメント | ドキュメント | シート | セル範囲 | (単一)セル | |
GUIで操作 | セルにキーで値を入力 | 発火 | 2回発火 | 発火 | 発火 | 発火 |
セルの値をDeleteキーで削除 | 発火 | 発火 | 発火 | 発火 | 発火 | |
セルの値をカット | 発火なし | 発火 | 発火 | 発火 | 発火(リスナーもペースト先に移動する) | |
シートからの値をペースト | 発火 | 発火 | 発火 | 発火 | 発火 | |
プレインテキストをペースト | 発火なし | 発火 | 発火 | 発火 | 発火 | |
背景色を変更 | 発火 | 発火 | 発火なし | 発火なし | 発火なし | |
書式を変更 | 発火 | 発火 | 発火なし | 発火なし | 発火なし | |
枠線を引く | 発火なし | 発火 | 発火なし | 発火なし | 発火なし | |
(セル範囲内に)セルを挿入 | 発火なし | 発火 | 発火なし | 発火なし | 発火(セルと連動してリスナーも移動) | |
(セル範囲内の)セルを削除 | 発火なし | 発火 | 発火 | 発火 | 発火(リスナーも削除される) | |
(セル範囲内に)行を挿入 | 発火 | 発火 | 発火 | 発火 | 発火(セルと連動してリスナーも移動) | |
(セル範囲内の)行を削除 | 発火 | 発火 | 発火 | 発火 | 発火(リスナーも削除される) | |
Python マクロで操作 | 値を入力 | 発火なし | 発火 | 発火 | 発火 | 発火 |
背景色を変更 | 発火なし | 発火 | 発火なし | 発火なし | 発火なし | |
書式を変更 | 発火なし | 発火 | 発火なし | 発火なし | 発火なし | |
枠線を引く | 発火なし | 発火 | 発火なし | 発火なし | 発火なし |
LibreOffice 5.4.1.2 on linuxBean14.04、で調べたものです。
XChangesListenerはドキュメントに追加するだけでchangesOccurred()メソッドの引数から変化した内容を取得できるので、便利と思ったのですが、プレインテキストをペーストしたときやマクロでの操作には発火しないのでいまいち使いにくいことに気が付きました。
XChangesListenerに対してXModifyListenerはプレインテキストのペーストやマクロの操作にも反応します。
XModifyListenerのmodified()メソッドは変化した内容を取得することはできませんが、ドキュメントだけでなく、シートやセル範囲、セルにも追加できるので、変化を検知する範囲をサブジェクトによって限定することができます。
背景色や、書式、枠線はマクロでの操作ではいずれもそれぞれのプロパティの変更になり、XChangesListenerはいずれにも反応しないのですが、GUIからの操作では背景色の変化や書式の変更ではXChangesListenerが反応しています。
「Sheet1.A1 を監視、その後に Sheet1 を削除すると監視するセルが Sheet2.A1 に変わる。」(OOobbs2/195 - ...?)と書いてあるので、やってみるとその通りでした。
この対策は難しそうです。
マクロでシートを削除するときは、削除前にマクロでリスナーをはずせばよいのですが、GUIでシートが削除されたときは、シートの削除時に発火するリスナーはいくつかあるのですが、「削除」を検知するリスナーをみつけることができませんでした。
GUIでシートを削除するのを抑制する手段しかなさそうです。
逆にシートをコピーしたときはリスナーはくっついてきませんでした。
(2018.11.25追記。Windows版のLibreOffice 6.1.3.2 (x64)では、ModifyListenerのmodified()メソッドからModifyListenerが監視しているセルの値を変更してmodified()メソッドを入れ子で発火させるとクラッシュします。なので、ModifyListenerが監視しているセルの値を変更するときはその前後でModifyListenerを外してまた追加する操作が必要になります。Linux版(x86)ではそのようなことをする必要はありませんでした。おそらくWindows版とLinux版すべてに当てはまると思われます。
同一のModifyListenerだけでなく、値を変更するセル範囲についているModifyListenerすべてを外して付け直さないとクラッシュします。結構面倒ですね。)
参考にしたサイト
OOobbs2/195 - ...?
Calc のセルの値や数式を監視するウォッチウィンドウ。
0 件のコメント:
コメントを投稿