disabledraw時に挙動が異なる?No.01756
大関一徳 さん 01/02/05 19:13
 
おおぜきと申します。

あるルールに従ってテキストを整形するようなタイプのマクロを作成中なのですが、
処理の最初にdisabledrawすると挙動が期待通りにならずに困っています。結果も必
ずしも一定ではありません。

disabledrawを外したり、ループ中にmessage命令を入れてステップ実行したりすると、
期待通りに動きます。

ルールに従って「移動して選択後クリップボートにコピーし、別の場所に移動して
ペースト」を繰り返すようなマクロです。
移動にはmovetolinenoを使っています。

どなたか、心当たりのある方はいませんか。

本当は問題のマクロを投稿すべきなのでしょうが、そのままだとちょっと問題がある
ので、現在、投稿できる形に改変中です。


[ ]
RE:01756 disabledraw時に挙動が異なる?No.01757
大関一徳 さん 01/02/06 14:09
 
おおぜきと申します。

>本当は問題のマクロを投稿すべきなのでしょうが、そのままだとちょっと問題があ
>るので、現在、投稿できる形に改変中です。

ということで、マクロと、処理するデータです。

---------------マクロここから
disabledraw;

gofiletop;
while (linecount2 != lineno){
movetolineno 1, lineno;
if (code == '+'){
// 前の行にまとめる
call copyitem 10, 30;

// この行は消す
deleteline
} else {
// 次の行に
movetolineno 1, lineno+1;
}
}

enabledraw;
message "終了しました。";
endmacro;


copyitem:
// 追加分をコピー
movetolineno ##1, lineno;
beginsel;
movetolineno ##2, lineno;
copy;

// ペースト
movetolineno 1, lineno-1;
movetolineno ##2, lineno;
paste;
movetolineno 1, lineno+1;

return;
---------------マクロここまで

---------------データここから
[Header1][      DATA 1      ][Footer1]
+Header2][      DATA 2      ][Footer2]
...以下上記2行ごとのくりかえし
---------------データここまで

私の意図としては、これを実行すると、以下の行の繰り返しになってほしいのです。
[Header1][      DATA 1      ][      DATA 2      ][Footer1]

しかし、
[Header1][      DATA 1      ][Footer1]
となってしまう行があります。
何度もためしましたが、どの行がおかしくなるかは不定で、再現性がありません。

サブルーチンのcopyitem内がおかしいようなのですが、どこがおかしいのか良くわか
りません。


[ ]
RE:01757 disabledraw時に挙動が異なる?No.01758
きいろいまふらあ さん 01/02/06 14:36
 
おおぜきさんこんにちは。
秀丸のバージョンとか、動作環境とか書きましょう。

> [Header1][      DATA 1      ][Footer1]
> +Header2][      DATA 2      ][Footer2]

これを25回繰り返した50行のデータに対し、
掲載されたマクロを実行してみました。
結果は、

> [Header1][      DATA 1      ][      DATA 2      ][Footer1]

これが25行繰り返されたものになりました。

win98se + 秀丸3.05 でテストしました。

> 何度もためしましたが、どの行がおかしくなるかは不定で、再現性がありません。

ちなみに続けて3回テストしました。
3.07だとだめなのかな?

[ ]
RE:01758 disabledraw時に挙動が異なる?No.01759
大関一徳 さん 01/02/06 15:37
 
こんにちは。おおぜきです。

>秀丸のバージョンとか、動作環境とか書きましょう。

秀丸3.05
WindowsNT4.0 SP4
Pentium III 450MHz
です。

>これを25回繰り返した50行のデータに対し、
>掲載されたマクロを実行してみました。

同じことをやってみましたが、4個所から8個所程度の不具合が出ます。
不具合個所は不定です。

[ ]
RE:01759 disabledraw時に挙動が異なる?No.01760
大関一徳 さん 01/02/06 15:56
 
その後、Windows95環境およびWindows2000環境で試したところ、正常に動作しました。

とりあえず、私のNT環境だけで問題が起こっているようですね。

どなたか、不具合が再現した方はおられないでしょうか...


[ ]
RE:01759 disabledraw時に挙動が異なる?No.01761
番頭++ さん 01/02/06 15:58
 
見た目に、一行に収まるデータでしたら、
 lineno を y + 1 に置き換えてテストしてみるのも案です。

# うまくいけば、理由を書きます。
# うまく行かないときのために、あらかじめ、、、はずれかもーーー

[ ]
RE:01761 disabledraw時に挙動が異なる?No.01762
大関一徳 さん 01/02/06 16:29
 
おおぜきです。こんにちは。

>見た目に、一行に収まるデータでしたら、
> lineno を y + 1 に置き換えてテストしてみるのも案です。

試してみましたが、駄目でした。

[ ]
RE:01759 disabledraw時に挙動が異なる?No.01763
大関一徳 さん 01/02/06 16:35
 
おおぜきです。

不具合が起こるNT環境にてさらに調査しました。

マクロ中のpasteしている部分を、pasteを2度呼び出すように変えてみると、以下の
ような結果になりました。

[Header1][      DATA 1      ][      DATA 2      ][      DATA 2      ][Footer1]
[Header1][      DATA 1      ][      DATA 2      ][Footer1]
[Header1][      DATA 1      ][Footer1]

pasteが2度実行されている(正常)ときと、1回のとき、0回のときがあるようです。

[ ]
RE:01763 disabledraw時に挙動が異なる?No.01764
番頭++ さん 01/02/06 17:46
 
カーソル移動のバグではない....
いくつか案が、あるのですが。回避策です。
まず、ウイルス関連とか、クリップボード関連とか、常駐ソフトをとめる。

paset; escape; // にする。案1.
escape ; beginsel;
copy; escape;

// movetolineno ##1, lineno; // では無くて
##i = lineno;
movetolineno ##1, ##i; // にする。案2.
// movetolineno のオペランドを簡単にしてみる。

あとは、copy; paste をやめて、変数に入れる。gettext // 案3.

[ ]
RE:01764 disabledraw時に挙動が異なる?No.01765
大関一徳 さん 01/02/06 18:51
 
たびたびすみません。おおぜきです。

>カーソル移動のバグではない....
>いくつか案が、あるのですが。回避策です。
>まず、ウイルス関連とか、クリップボード関連とか、常駐ソフトをとめる。

今まで書いていませんでしたが、私もこれを疑って調べていました。
ただ、少なくともスタートアップで立ち上がるものを全て止めても状況は代わらない
ようです...


>paset; escape; // にする。案1.
>escape ; beginsel;
>copy; escape;

これも駄目でした。
# ちなみに、escapeについてヘルプから見つけられなかったのですが、どんな機能の
マクロなのでしょうか?

>// movetolineno ##1, lineno; // では無くて
>##i = lineno;
>movetolineno ##1, ##i; // にする。案2.
>// movetolineno のオペランドを簡単にしてみる。

これも駄目でした。


>あとは、copy; paste をやめて、変数に入れる。gettext // 案3.

この方法ではOKでした。ただし、まだ数回しか試していませんが...


結局、私の環境ではcopy, pasteがおかしいようです。
元記事にはありますように、disabledrawを止めたり、ループ中にmessageで一時停止
するようにすればOKということから、タイミングも関係しそうな感じです。



[ ]
RE:01756 disabledraw時に挙動が異なる?No.01766
スカ さん 01/02/06 22:22
 
私も似たような状況になったことがあります。
同じくコピーペーストを繰り返していると希に取りこぼしが起きるというものです。
タイミングの問題とすれば怪しそうなのはクリップボードあたりですかね。私は dis
abledraw をはずして対処しましたがそれ以降問題は起こってないです。

って、何の解決にもなってないな、こりゃ(^^;

[ ]
RE:01756 disabledraw時に挙動が異なる?No.01767
大関一徳 さん 01/02/07 18:29
 
おおぜきです。

1765にも番頭++さんより教えていただいた方法でマクロを改変して解決した旨を報告
しましたが、他の方法でも回避できました。

秀丸の「クリップボート履歴を取る」機能をOFFにすると、不具合が発生しなくなり
ました。

ただし、他の今まで正常に動作していた環境にてこれをONにしても不具合が再現する
わけではないので、これだけが原因ではないようです。


[ ]