[不具合] LineDown または再描画

  1. // 投稿制限で途中で切れるかな。
    var n1, n2;
    var i=1;
    document.selection.EndOfDocument(false);
    window.Redraw=true;
    n2 = document.selection.GetActivePointY(mePosLogical);
    alert( "where am i, n2 = " + n2 + ", i = " + i );     // 終端
    i++;
    document.selection.SetActivePoint(mePosLogical, 1, 1, true);
    // ファイル終端から、ファイル先頭へ選択

    window.Redraw=true;
    n2 = document.selection.GetActivePointY(mePosLogical);
    alert( "where am i, n2 = " + n2 + ", i = " + i );     // 1
    i++;
    // Collapse
    n1 = document.selection.GetActivePointX(mePosLogical);
    n2 = document.selection.GetActivePointY(mePosLogical);
    document.selection.Collapse();
    document.selection.SetActivePoint(mePosLogical, n1, n2, false);

    window.Redraw=true;

    n2 = document.selection.GetActivePointY(mePosLogical);
    alert( "where am i, n2 = " + n2 + ", i = " + i );     // 1
    i++;
    // 1 にいるのに

    //[Z] ここから
    //  n1 = document.selection.GetActivePointX(mePosLogical);
    //  n2 = document.selection.GetActivePointY(mePosLogical);
    //  document.selection.Collapse();
    //  document.selection.SetActivePoint(mePosLogical, n1, n2, false);
    // ここまで

    var count;
    count = 10;
    document.selection.LineDown(false, count);
    //document.selection.LineDown(false, 10);
    n2 = document.selection.GetActivePointY(mePosLogical);
    alert( "where am i, n2 = " + n2 + ", i = " + i );
    // 1 + count の行にいるはずが、わけのワカラン行に飛んでいる。

    /*
     *  問題 A
     *  i==2, i==3 の時の、alert() では、ファイル先頭付近が
     *  表示されなければならないのに、ファイル終端付近が表示される。
     *  window.Redraw=true; を alert 直前に置いても同じ。
     *
     *  問題 B
     *  最後の LineDown() 直前には、確かに ファイル先頭にいる。
     *  しかし、LineDown(false, count) の後、カーソルは 1+count 行にない。
     *
     *
     *  count の値を変えてみると判明すること。
     *
     *  表示領域の先頭行 : count : LineDown(false, count)後の行
     *  600              : 10    : 611
     *  600              :  2    : 603
     *  600              : 30    : 631
     *
     *  「表示領域の先頭行」+ 1 + count == 最後に移動する行
     *
     *  備考:私が使ったファイルは、DuplicateLine のテストで使った
     *  途中に折り返しがある、論理行は 633 行 の普通のファイル
     *
     *  問題 C
     *  [Z] の範囲のコードを有効にすると、なぜか、問題 B は消滅する。
     *
     */

     |  kinzoku  |  返信
  2. こんにちは。書き込みありがとうございます。

    問題A
    EndOfDocument() はスクロールバーの位置もカーソルに追従しますが、SetActivePoint() は内部的にカーソル位置を移動するだけなのでスクロールバーは追従しません。なので、ファイルの最後が表示された状態のまま、ということになります。

    問題 B
    Meryの仕様上、LineDown() はキーボードの↓ボタンと同じ動作になっています。たとえば、カーソルが
    ファイルの先頭にあり、スクロールバーをカーソルが見えなくなるまで下にスクロールさせた状態で、
    キーボードの↓を押すとファイルの先頭からではなく、現在のスクロール位置のトップから下にカーソル
    移動することになります。マクロから LineDown() を使用しても動作は同じです。

    けど、実際のところ、スクロール位置に関係なく単純にカーソルを1行下に移動させるだけのほうが
    良いのかもしれませんね。。。マクロ記録との兼ね合いもあって副作用が心配ですが。

    >  *  しかし、LineDown(false, count) の後、カーソルは 1+count 行にない。

    今の仕様ですと、count の値が10 だと、現在のスクロール位置で表示されている行の一番上から
    数えて下に10行移動することになりますね。

     問題 C
    [Z]の範囲のコードの中でも特にCollapse() がポイントになってます。Collapse は選択解除してさらに
    スクロール位置をカーソル位置に追従させてしまうようになってるからだと思います。つまり、Collapse()
    を呼んだ時点で選択範囲が解除され、さらにスクロール位置がファイルの先頭付近に来るため、
    問題Cの現象が発生するのだと思います。

    ちなみに、スクロール位置がカーソル位置に追従されてしまうのは、StartOfLine, StartOfDocument,
    EndOfLine, EndOfDocument, Collapse のメソッドのみです。・・・たぶん。
    (ほんとはスクロール位置はそのままでカーソルだけ移動させたかったのですが、どうもうまく動かなくて
    内部的に再描画を呼び出してるのでその副作用でスクロールバーがカーソルに追従されてしまうためです。)

    ここら辺はスクロール位置に関係なくマクロを組めるように考慮しなきゃいけないですね。
    ちょっと検討してみます。

     |  Kuro  |  返信