[不具合]最新ベータ版の不具合

  1. 最新ベータ版(1.0.6.1900)の不具合と思われる事象です。
    JSのSelectionインタフェースStartOfDocumentメソッドの後にも処理がある場合、どうもStartOfDocumentメソッド処理が正常に動作していないようです。

    手順は以下の感じです
     1.1行目が画面外に行くようにする
     2.StartOfDocumentメソッドの後になにか処理があるマクロを実行する

    念のため、前回ベータ版の1.0.6.1882と正式リリース版の1.0.2.1671でも確認してみましたが、こちらではこの事象に遭遇しませんでした。
    ユーザー側の勝手な予測になりますが、今回のベータ版でマクロ中メソッドのカーソル位置についての修正をされているようですので、そこになにかありそうな気がします。

    ご確認をお願いします。

     |  kotona  |  返信
  2. ご報告ありがとうございます。

    確認しました。
    StartOfDocument() のあとに LineDown() あたりを使用する場合に問題があるようです。
    1.0.6.1900 で StartOfDocument() の仕様を変更したための副作用っぽいですね・・・。
    (StartOfDocument() でスクロールバーの位置を追従しないようにしたけど、LineDown() は
    スクロールバーの位置から数えて1行下に移動するため。)

    あっちを立てればこっちが立たず・・・。
    解決策を検討してみます。

     |  Kuro  |  返信
  3. おぉ、早々のご確認ありがとうございます。
    そうですよね、あっちを立てればこっちが立たず、だからといって……
    難しい問題だと思いますが、期待しています!

     |  kotona  |  返信
  4. /* スクロールバー追従テスト
     * カーソルをファイル先頭"付近"においておく。
     * ( 上下左右移動可能な位置で、先頭(1,1)ではない。 )
     * スクロールして、ファイル先頭を表示外にする( 面倒くさいけど )
     * で、以下のマクロを実行する。
     */
    var i = 5;
    var solution = false;
    with( document.selection ){
        if( i == 1 ){
            // 手動操作 CTRL + HOME
            StartOfDocument();
        }else if( i == 2 ){
            // 手動操作 RIGHT →
            CharRight();
        }else if( i == 3 ){
            // 手動操作 HOME
            StartOfLine(mePosView);
        }else if( i == 4 ){
            WordRight();
        }else if( i == 5 ){
            SetActivePoint(mePosView, 1, 1); 
        }
        if( solution ) window.ScrollY = GetActivePointY(mePosView) - 1;
        // 手動操作 DOWN ↓
        LineDown(); 
        // この後、カーソルは、ファイル先頭付近に居なければならない。
    }
    /* 
     * 1.0.6.1900
     * solution==fase
     * i    1   2   3   4   5 
     * 結果 NG  OK  NG  OK  OK
     */

     |  kinzoku  |  返信
  5. /*
     * グループ(A)のメソッドが、スクロールバーを追従させてはいけないテスト
     *
     * カーソルをファイル先頭(1,1) に置く( 移動できない場所 )
     * スクロールして、ファイル先頭を表示外にする( ScrollY=200 とする )
     * 以下のマクロを実行する。
     */
    var i = 1;
    var solution = false;
    with( document.selection ){
        // 以下は、(1, 1) から動けない、動かないメソッド実行
        if( i == 1 ){
            StartOfDocument();
        }else if( i == 2 ){
            CharLeft();
        }else if( i == 3 ){
            StartOfLine(mePosView);
        }else if( i == 4 ){
            WordLeft();
        }else if( i == 5 ){
            SetActivePoint(mePosView, 1, 1); 
        }
        if( solution ) window.ScrollY = GetActivePointY(mePosView) - 1;
        // 手動操作 DOWN ↓
        LineDown(); 
        // この後、カーソルは、ファイル先頭付近に居てはいけない。
    }

    /* 
     * 1.0.6.1900
     *      結果の
     * 番号 ScrollYの値  評価   解説
     * 1    200           OK
     * 2    1            NG     手動では動かないのに、マクロからだと動いてしまう。
     * 3    200          OK
     * 4    0            OK/NG  手動で wordleft は無いから、解釈できない。
     * 5    0            OK/NG  手動で SetActivePointはないから、
     *                             解釈できないけど、これでイイと思う  
     */

     |  kinzoku  |  返信
  6. うぉ、ありがとうございます。すごいですね、むっちゃ助かります!
    なんとか、追従テスト、追従させてはいけないテスト、クリアできました。
    SetActivePoint は 他のメソッドと同様に、位置が変わらない場合は何もしないようにしてみました。

    あと、選択範囲がある場合で、なおかつ Extend が False の場合などの組み合わせで移動したりしなかったりな部分もありましたのでそこら辺も気合でキー操作と同様の動きをするようにあわせてみました。

    ついにできたかも、完璧バージョン!

    とりあえず祝杯に酒でもついできます。そして、アップロードしてみようかな。。。

     |  Kuro  |  返信
  7. >SetActivePoint は 他のメソッドと同様に、位置が変わらない場合は何もしないようにしてみました。
    それでイイですね。シンプルでわかりやすいし。

    >ついにできたかも、完璧バージョン!
    ごくろうさまでした。

     |  kinzoku  |  返信
  8. kuro さんの目指す仕様は、こういうものかな。

    グループ(A)
      CharLeft CharRight, StartOfDocument EndOfDocument
      StartOfLine EndOfLine, WordLeft WordRight
      SetActivePoint

    グループ(B)
      LineDown LineUp, PageDown PageUp

    グループ(B) は、同じ性質が貫かれている。グループ(A) の CharLeft, CharRight と比較してみる

    (1) カーソルをファイル末尾付近において、スクロールしてファイル先頭付近を見る。
    LineUp/PageUp    カーソルがファイル先頭付近に登場する
    LineDown/PageDown  表示画面がファイル末尾へ移動して、カーソルが元の位置から ..Down 動く
    CharLeft/CharRight 表示画面がファイル末尾へ移動して、カーソルが元の位置から左右に動く

    (2) カーソルをファイル先頭付近において、スクロールしてファイル末尾付近を見る。
    LineUp/PageUp    表示画面がファイル先頭へ移動して、カーソルが元の位置から ..Up 動く
    LineDown/PageDown  カーソルがファイル末尾付近に登場する
    CharLeft/CharRight 表示画面がファイル先頭へ移動して、カーソルが元の位置から左右に動く

    これを、画面がどうであろうと、同じ動きに統一する試み。
    グループ(B) のコマンドを実行する前に、これをやっておくとイイみたい。
    window.ScrollY = document.selection.GetActivePointY(mePosView) - 1;

    >1.1行目が画面外に行くようにする

    >(StartOfDocument() でスクロールバーの位置を追従しないようにしたけど、LineDown() は
    >スクロールバーの位置から数えて1行下に移動するため。)

    document.selection.StartOfDocument();
    window.ScrollY = document.selection.GetActivePointY(mePosView)-1;
    document.selection.LineDown();
    これで目的の動作ができます。

     |  kinzoku  |  返信
  9. > kuro さんの目指す仕様は、こういうものかな。

    ご意見ありがとうございます。
    なんとなく見えてきました。(1)(2)ですが、LineDown, LineUp, PageDown, PageUp の仕様は
    キーマクロ記録の関係で譲れない部分です。

    ということで、今回の修正でStartOfDocument,EndOfDocument でスクロールバーが追従しないようにしたのが間違いだったかなと思います。

    > window.ScrollY = document.selection.GetActivePointY(mePosView)-1;

    ↑これが有効ということはつまり、グループ(A)のメソッドはすべてスクロールバーを追従させるようにすればOKということだと思います。LineDown, LineUp との整合性もとれるハズ、、、かな。

    テストに付き合ってくださり、ありがとうございます。たびたびで申し訳ございませんが、もう一発ベータ版を出そうかと思います。

     |  Kuro  |  返信
  10. >なんとなく見えてきました。(1)(2)ですが、LineDown, LineUp, PageDown, PageUp の仕様は
    >キーマクロ記録の関係で譲れない部分です。
    ですね。

    >↑これが有効ということはつまり、グループ(A)のメソッドはすべてスクロールバー
    >を追従させるようにすればOKということだと思います。
    それで解決すると思います。
    しかし、例外があります。
    ※ 以下 ウインドウ表示行数が 200 より少ない場合を想定

    ●現象
    カーソルが、SetActivePoint(mePosView, 1, 1) で、ScrollY=200; のとき、
    キー Ctrl + Home "StartOfDocument" しても、ScrollY は変わらない。
    キー Left "CharLeft" しても、ScrollY は変わらない。
    キー Home "StartOfLine(mePosView)" しても、ScrollY は変わらない。

    ●結論
    グループ(A) のメソッドは、移動できない時には、ScrollY を追従させてはいけない。

    ●波及
    カーソルが、SetActivePoint(mePosView, 1, 1) で、ScrollY=200; のとき、
    キーはないけど、マクロから、WordLeft や SetActivePoint(mePosView, 1, 1) を使っても、
    ScrollY は変わらないし、また変えてはいけない。のかもしれない・・・・
    これは、恣意性のある仕様ですね。

    しかし、SetActivePoint(mePosView, 1, 1) を使ったら、かならず、
    スクロールバーを追従させる方が、イイ結果をもたらすと思う。
    これはキーマクロと関係ないから、Kuro さんの好きな方で。

    ●まとめ、次のベータに望まれること
    グループ(A) のメソッドは、原則、スクロールバーを追従させる。
    ただし、1文字も移動できない場合には、スクロールバーを追従させてはいけない。

     |  kinzoku  |  返信
  11. スゲェ・・・!頭良すぎです。

    > グループ(A) のメソッドは、移動できない時には、ScrollY を追従させてはいけない。

    おっしゃるとおりですね、、、そのケースは想定してませんでした。

    > ●まとめ、次のベータに望まれること
    > グループ(A) のメソッドは、原則、スクロールバーを追従させる。
    > ただし、1文字も移動できない場合には、スクロールバーを追従させてはいけない。

    1文字も移動できない場合(位置が先頭 or 末尾の場合)はそもそもそのメソッド自体が
    意味無いので何もしなければOKですね。

    あと、以前に ScrollY が意味ないじゃん、っていうご指摘があったと思いますが、
    調査してみると、マクロ実行後にかならずカーソル位置にスクロールするような
    ロジックになってました。

    マクロ実行後には何もせず、マクロが終了したままの状態にしておく、という感じにして
    みようかと思います。

    すごい参考になりました。これなら割と簡単に修正できそうです。
    ほんと、ありがとうございますっ!

     |  Kuro  |  返信