1 件の投稿を表示中 (合計 6 個)
  • 作成者
    投稿
  • #22854
    loop bridge
    参加者

    お世話になります。
    以前に

    https://jp.emeditor.com/forums/topic/%e4%bb%bb%e6%84%8f%e3%81%ae%e7%af%84%e5%9b%b2%e3%81%ae%e8%a1%8c%e3%82%92%e5%89%8a%e9%99%a4%e3%81%99%e3%82%8b%e3%83%9e%e3%82%af%e3%83%ad%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e7%9f%a5%e3%82%8a%e3%81%9f/
    でお伺いした、 document.selection.SetActivePoint についてお伺いします。
    最近気がついたのですが、どうも挙動がおかしい気がします。

    下記のコードを実行した際、期待している結果は、 5 行目の 05 から 10 行目の 10 が削除されることなのですが、
    実際には、 5 行目の 05 までから 9 行目の 09 までしか削除されません。
    コメントアウトしてある alert を有効にしてみたところ、 document.selection.Delete(); 直前の選択状態は 5 行目から 9 行目までとなっていました。

    また、 tmpST 、 tmpED の値をともに 1 にし、 1 行目だけが消えることを期待して実行したところ、
    1 行目の 01 が 1 にになったのみでした。( 1 文字目(1行1列目)の 0 が消えた)

    私は何か書き間違い、思い違いをしていますでしょうか。
    v16.0.2/Win7、8.1 ですが、少なくとも16.0からこの挙動になっていますし、16.1.0のbeta5でも同様でした。

    (テストコード)
    tmpST = 5;
    tmpED = 10;

    document.selection.SetActivePoint( eePosLogical, 1, tmpST);
    document.selection.SetActivePoint( eePosLogical, 1, tmpED ,true );
    //alert(tmpST + “–” + tmpED); //デバグ用
    document.selection.Delete();

    (サンプルデータ)※実際のデータにはこのタイトルは含まない
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    #22855
    Yutaka Emura
    キーマスター

    loop bridge 様

    いつもお世話になっております。江村です。

    書いていただいたマクロを試してみましたが、これが正しい動作になります。
    文字単位で選択しているため、選択の一番下の端が 1 桁目の場合、その 1 つ上の行までが選択されるようになります。
    文字単位でなく、行単位の選択にした場合には、期待通りの結果になります。マクロで、

    document.selection.Mode = eeModeLine;

    という行を 2 つの SetActivePoint の後に追加すると、行単位の選択になります。

    よろしくお願い申し上げます。

    #22856
    loop bridge
    参加者

    江村さま

    ご回答有りがとうございます。
    私の理解力が及ばずに申し訳ないのですが、上記リンクの#22396でいただいたものとは違うような気がするのですが、これも私の思い違いでしょうか。(document.selection.Mode = eeModeLine;の部分は前には教えていただけなかった)

    また、今回のアドバイスを元に

    tmpST = 5;
    tmpED = 10;

    document.selection.SetActivePoint( eePosLogical, 1, tmpST);
    document.selection.Mode = eeModeLine;
    document.selection.SetActivePoint( eePosLogical, 1, tmpED ,true );
    document.selection.Mode = eeModeLine;
    //alert(tmpST + “–” + tmpED); //デバグ用
    document.selection.Delete();

    と修正、先のサンプルデータに対して実行を行ったところ、今度は5~11行めが削除されて、
    01
    02
    03
    04
    12
    13
    14
    15
    16
    17
    18
    19
    20
    となりました。
    ふたつ目の document.selection.Mode = eeModeLine を外したところ、5~10行目の削除になりましたが、
    ふたつ目は本当に必要なのでしょうか?

    #22857
    Yutaka Emura
    キーマスター

    loop bridge 様

    いつもお世話になっております。江村です。

    以前は、document.selection.Mode = eeModeLine; が抜けていて申し訳ありませんでした。また、document.selection.Mode = eeModeLine; が無くても、1 つ上の行数を指定すればいいのです。

    また、document.selection.Mode = eeModeLine; は、2番目の SetActivePoint の後に 1 回だけ書きます。

    したがって、次のように書くか、

    tmpST = 5;
    tmpED = 10;
    
    document.selection.SetActivePoint( eePosLogical, 1, tmpST);
    document.selection.SetActivePoint( eePosLogical, 1, tmpED ,true );
    document.selection.Mode = eeModeLine;
    //alert(tmpST + "–" + tmpED); //デバグ用
    document.selection.Delete();
    

    あるいは、次のように書きます。

    tmpST = 5;
    tmpED = 10;
    
    document.selection.SetActivePoint( eePosLogical, 1, tmpST);
    document.selection.SetActivePoint( eePosLogical, 1, tmpED + 1 ,true );
    //alert(tmpST + "–" + tmpED); //デバグ用
    document.selection.Delete();
    

    よろしくお願い申し上げます。

    #22858
    loop bridge
    参加者

    江村さま

    たびたびのご回答ありがとうございます。
    いろいろと混乱をしておりますが、document.selection.Mode = eeModeLine は 後ろ側の一つでよいと解釈し、実行をしたところ意図した結果を得ることができましたが、この認識であっていますでしょうか。

    また、 document.selection.Mode = eeModeLine を使わずに、 +1 で対応するやり方の場合ですが、tmpST=1 、 tmpED=20 と、最初から最後までを指定した場合に動きませんでした。5と10など、間の行を指定する場合には問題ありませんでした。

    原因は私には理解出来ませんが、 document.selection.Mode = eeModeLine を記述する方法で今後は対応したいと思います。

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

    #22861
    Yutaka Emura
    キーマスター

    loop bridge 様

    いつもお世話になっております。江村です。

    文書の最終行の場合は、ご指摘のように、eeModeLine を使うか、桁数に行の長さを指定する必要が出てきます。

    eeModeLine は、後ろ側の1つにするのが正しいです。

    このあたりは説明が難しくて申し訳ありません。

    よろしくお願い申し上げます。

1 件の投稿を表示中 (合計 6 個)
  • このトピックに返信するにはログインしてください。