disabledraw/enabledrawの挙動について。No.06553
ohtorii さん 11/03/12 13:24
 
disabledraw/enabledrawの挙動について2点ほど気になる点があります、


【その1】
execmacro関数で外部マクロを呼び出したときに、disabledrawしてい
るにも関わらず描画されているようです。(文字を書いているのが見えます)
下記マクロのenabledrawを全てコメントアウトすると再描画が行なわ
れずに高速動作するようになります。(期待通りの動作)


【その2】
ウインドウを上下2分割しているかどうかで挙動が変わりました。

(分割なし)
上記<その1>の動作をします、大きな問題はありません。

(分割あり)
カーソルの縦棒(|)の移動だけが描画されて文字は再描画
されません。自分の環境だと「分割なし」に比べて5秒ほど処理が遅く
なります。
処理が全て終わると処理結果は正しく反映されています。


■今回検証に使用したマクロ
---- debug_main.mac ここから ----
//メインの処理
disabledraw;
#i=0;
while(#i<100){
 execmacro "debug_sub.mac";
 #i=#i+1;
}
enabledraw;
---- debug_main.mac ここまで ----


---- debug_sub.mac ここから ----
//サブモジュール(呼び出される側)
disabledraw;
insert("foo");
insert("bar");
insert("hoge");
enabledraw;
---- debug_sub.mac ここまで ----

【環境】
windows vista 32bit
秀丸 ver8.03 32bit

[ ]
RE:06553 disabledraw/enabledrawの挙動にNo.06554
h-tom さん 11/03/12 14:19
 

h-tom です。

>【その1】
>execmacro関数で外部マクロを呼び出したときに、disabledrawしてい
>るにも関わらず描画されているようです。(文字を書いているのが見えます)
>下記マクロのenabledrawを全てコメントアウトすると再描画が行なわ
>れずに高速動作するようになります。(期待通りの動作)

マクロヘルプより、
>enabledrawを実行するときに画面をすべて書き直すことになるので、
とあるので、呼び出している"debug_sub.mac"の回数だけ、再描画する為、
正しい動作だと思いますよ。

>---- debug_sub.mac ここから ----
>//サブモジュール(呼び出される側)
>disabledraw;
>insert("foo");
>insert("bar");
>insert("hoge");
>enabledraw;
>---- debug_sub.mac ここまで ----

[ ]
RE:06554 disabledraw/enabledrawの挙動にNo.06555
ohtorii さん 11/03/12 16:20
 
なるほど・・・

今やろうとしていることは、選択の有無や前後の単語に応じて、他の方
が書かれたマクロを呼び出すようなマクロを書いています、

他の方が書かれたマクロの中にenabledraw/disabledraw;があると何度も
再描画して画面がちらつきます。
(disabledrawをコメントアウトすることで回避しています)

自分の都合だけでいいますと、参照カウンタのように
  enabledraw で +1
  disabledraw で -1
カウンタが0になると再描画が望ましいです。

(マクロの下位互換性を考慮すると動作変更は難しいと思いますし、
下位互換性は保持して欲しいです。)

【その1】については、こちらで回避してみます。

[ ]
RE:06555 disabledraw/enabledrawの挙動にNo.06561
h-tom さん 11/03/13 23:38
 

h-tom です。
>自分の都合だけでいいますと、参照カウンタのように
>  enabledraw で +1
>  disabledraw で -1
>カウンタが0になると再描画が望ましいです。
>
>(マクロの下位互換性を考慮すると動作変更は難しいと思いますし、
>下位互換性は保持して欲しいです。)
参照カウンタまでは必要ないかもしれませんが、現状の設定状態を取得
(disabledrawなのかどうか)できれば、それなりに制御できそうなんです
が、現状では無理ですね。
#n = disabledrawかどうか;
if(!#n) disabledraw;

if(!#n) enabledraw;

[ ]
RE:06561 disabledraw/enabledrawの挙動にNo.06562
秀丸担当 さん 11/03/14 12:27
 

>【その2】
>ウインドウを上下2分割しているかどうかで挙動が変わりました。

その1、その2ともマクロの通りにして確認することができました。
h-tomさんの言われる通り、enabledrawの動作として現状ではそのようになって
しまうと思います。
また互換性の面から挙動を変える仕様変更も難しいかもしれません。

分割時は、内部的に分割側をビットマップとして保持していますが、再描画の際
に再構成するため通常より遅いかもしれないです。
その1はマクロ修正で回避されるということで、修正可能であればその2の件も回
避できるのではないかと思います。
呼び出されるマクロ(debug_sub.mac)のほうで、disabledrawではなく
enabledrawをコメントアウトするといいと思います。


enabledrawをコメントアウトするだけでもいいと思いますが、
現状で参照カウンタのような仕組みをマクロ上でやるとしたら、以下のように
disabledraw/enabledrawをサブルーチンに置き換えるといいかもしれません。


call DisabledrawNest;

(マクロ本体)

call EnabledrawNest;
endmacro;


DisabledrawNest:
##c=val(getstaticvariable("disabledrawCount",0));
if(##c==0)disabledraw;
##c=##c+1;
setstaticvariable "disabledrawCount",str(##c), 0;
return;

EnabledrawNest:
##c=val(getstaticvariable("disabledrawCount",0));
##c=##c-1;
if(##c==0)enabledraw;
setstaticvariable "disabledrawCount",str(##c), 0;
return;

[ ]
RE:06562 disabledraw/enabledrawの挙動にNo.06563
ohtorii さん 11/03/14 18:08
 
こんにちわ。

なるほど、getstaticvariableにはそんな使い道もあるんですね。
教えて頂いた方法で何とかしてみます。

ありがとうございました。

[ ]