◀Unicode版開発トップへ
  • 2364 文字選択範囲を返すマクロ専用関数の返す値がおかしい。
    • 2365 Re:文字選択範囲を返すマクロ専用関数の返す値がおかしい。
      • 2366 Re2:文字選択範囲を返すマクロ専用関数の返す値がおかしい。
  • [2364] 文字選択範囲を返すマクロ専用関数の返す値がおかしい。 mmm 2016年05月15日 10:37

    マクロ専用関数 GetSelectLineTo(), GetSelectColmFrom(), GetSelectColmTo() が正しい値を返しません。

    GetSelectLineTo() は GetSelectLineFrom() と同じ値を返しています。
    GetSelectColmFrom(), GetSelectColmTo() は文字の桁位置ではなく、左端からのピクセル数を
    返しているように思われます。
    なお、GetSelectLineFrom()は正しい値を返しています。

    例:適当なテキストで、1行目2桁目~2行目3桁目を選択して、
    GetSelectLineFrom(), GetSelectColmFrom(), GetSelectLineTo(), GetSelectColmTo()
    の返す値を表示すると、それぞれ1, 2, 2, 4になるはずですが 1, 8, 1, 22 になります。

    Ver 2.1.1.2、Ver 2.3.0.0で確認しました。
    また、Ver 2.0.5.0では正しい値を返していたことも確認しました。
    • [2365] Re:文字選択範囲を返すマクロ専用関数の返す値がおかしい。 もか 2016年05月15日 20:49

      ▼ mmmさん
      > GetSelectLineTo() は GetSelectLineFrom() と同じ値を返しています。
      こちらではちゃんと違う値が取得できているようです。
      >>2282
      2.3.0.0からレイアウト座標が文字幅からピクセル単位に変更になったのです。

      (function(){
      var layoutXFrom = GetSelectColmFrom();
      var layoutYFrom = GetSelectLineFrom();
      var layoutXTo = GetSelectColmTo();
      var layoutYTo = GetSelectLineTo();
      var logicXFrom = LineColumnToIndex(layoutYFrom, layoutXFrom);
      var logicYFrom = LayoutToLogicLineNum(layoutYFrom);
      var logicXTo = LineColumnToIndex(layoutYTo, layoutXTo);
      var logicYTo = LayoutToLogicLineNum(layoutYTo);
      var columnXFrom = Math.floor((layoutXFrom - 1) / GetDefaultCharLength()) + 1;
      var columnXTo = Math.floor((layoutXTo - 1) / GetDefaultCharLength()) + 1;
      InfoMsg(
      "layout (" + layoutYFrom + ", " + layoutXFrom + ") - (" +
      layoutYTo + ", " + layoutXTo + ") \n" +
      "logic(" + logicYFrom + ", " + logicXFrom + ") - (" +
      logicYTo + ", " + logicXTo + ") \n" +
      "column (" + layoutYFrom + ", " + columnXFrom + ") - (" +
      layoutYTo + ", " + columnXTo + ")"
      );
      })();
      columnXFrom,Toが正しく半角文字単位になるには、フォント選択を固定幅フォントを使用していて、
      かつ、選択範囲のFrom,Toの行の文字が固定幅になる文字により構成されている必要があります。
      (固定幅フォントでも0幅文字などが混ざっているとそれらは1pxの文字になるので、幅がずれます)
      選択文字が半角文字かどうかを判定するには、GetLineStrで実際に文字を取得して、GetStrWidthで取得するか、自分で文字種判定する必要があります。
      GetDefaultCharLengthは、2.1.0.0から使用可能です。
      もし古いバージョンでも動作させたければ
      if(0 < CompareVersion(ExpandParameter("$v"),"2.1.0.0"))
      などで条件分けが必要です。
      • [2366] Re2:文字選択範囲を返すマクロ専用関数の返す値がおかしい。 mmm 2016年05月18日 07:35

        ▼ もかさん
        > 2.3.0.0からレイアウト座標が文字幅からピクセル単位に変更になったのです。

        そうだったのですか。
        教えてくださり、ありがとうございます。

        これらの関数を使う自作マクロの挙動がおかしくなっていたので悩んでいました。
        仕様を見直してマクロを変更しようと思います。


        >> GetSelectLineTo() は GetSelectLineFrom() と同じ値を返しています。
        >こちらではちゃんと違う値が取得できているようです。

        これはこちらの勘違いでした。
        すみませんでした。