◀一般トップへ
  • 4591 折り返し変更時、強制終了する。
    • 4595 Re: 折り返し変更時、強制終了する。
      • 4596 Re2: 折り返し変更時、強制終了する。
        • 4598 Re3: 折り返し変更時、強制終了する。
      • 4597 Re2: 折り返し変更時、強制終了する。
    • 4601 お試し版 (RE: 折り返し変更時、強制終了する。)
      • 4604 Re:お試し版 (RE: 折り返し変更時、強制終了する。)
        • 4606 Re2:お試し版 (RE: 折り返し変更時、強制終了する。)
          • 4608 dev:4001動作が変です
            • 4613 RE: dev:4001動作が変です
              • 4614 Re2: dev:4001動作が変です
                • 4615 Re3: dev:4001動作が変です
                  • 4617 Re4: dev:4001動作が変です
            • 4618 RE: dev:4001動作が変です
              • 4619 Re2: dev:4001動作が変です
      • 4620 Re:お試し版 (RE: 折り返し変更時、強制終了する。)
  • [4591] 折り返し変更時、強制終了する。 せくぱぱ 2005年08月08日 18:28

    これが無ければ何もできない!!程、
    毎日重宝し使わせて頂いております。

    さて、サクラエディタ1.5.4.1にて、普段"折り返し"を有効
    常態(桁数指定orウィンドウ幅指定どちでも再現)にして編集
    しているのですが、例えば途中改行挿まず連続する文字
    (ex.1234567890…)を半角70文字続けたとし、自動折り返し
    の桁設定を半角30文字としてした場合、結果表示上3行に
    折り返されて表示されると思います。

     例)                ↓自動折り返し地点
      +―――――――――――――――
      1|123456789012345678901234567890
      2|123456789012345678901234567890
      3|1234567890

    この状態で1文字目から70文字目までを選択し、メニュー
    から[設定(O)]→[折り返さない(W)]を実行すると、「問題が
    発生したため、sakura.exe を終了します。 ご不便をおかけ
    して申し訳ありません。」のウィンドウが出て、サクラ
    エディタが強制終了されてしまいます。

    使用環境のOSは WinXP SP2 です。
    連続する文字数に大小は関係ないようです。
    連続25文字、折り返し桁10文字で3行表示の場合、
    連続150文字、折り返し桁70文字で3行表示の場合、
    これ以外でも再現可能です。ポイントは、途中改行なく
    折り返し機能で3行以上表示される場合で、複数行選択
    された状態から、[折り返さない(W)]を選択した場合です。

    ご確認頂ければ幸いです。
    よろしくお願い致します。
    • [4595] Re: 折り返し変更時、強制終了する。 もか 2005年08月08日 21:19

      報告ありがとうございます。
      私の所でも、確認できました。

      選択範囲のバイト数表示で強制終了するらしく、ステータスバーを非表示にすると回避できるようです。
      あと、バイト数表示で、EOFのみの行にカーソルがあると情報が表示されないです。
      • [4596] Re2: 折り返し変更時、強制終了する。 げんた 2005年08月09日 01:33

        どうも折り返し幅の変更時に選択範囲を正しく調整できていないようですね.
        例えば右側で折り返された1行目の全体を選択した後で折り返さないようにすると,何故か1行目全体が選択範囲になります.
        本来であれば元々選択されていた文字の位置までが選択範囲となるべきでしょう.

        今回の文字のカウントでは最初に行数を調べて,最終行以外にはデータが存在すると仮定して処理していたので,選択範囲はそのままで2行目が消えて無くなるとNullポインタアクセスで落ちてしまうようです.
        • [4598] Re3: 折り返し変更時、強制終了する。 せくぱぱ 2005年08月09日 10:34

          ▼ げんたさん
          > 例えば右側で折り返された1行目の全体を選択した後で
          > 折り返さないようにすると,何故か1行目全体が選択範囲
          > になります.
           逆に折り返さない状態で1行目の全体を選択した後、
           (選択開始位置は1文字目から文末までで)(行の途中で
           折り返されるように)折り返しを有効にすると、
           折り返された2行目が選択されていない状態になります。

           例)折り返ししていない状態で
             1行目を文頭から文末まで選択し
            +――――――――――――――――――――
            1|123456789012345678901234567890
            2|

                       ↓この位置で折り返し有効にすると
            +――――――――――――――――――――
            1|12345678901234567890 ←1行目だけが選択された状態
            2|1234567890       になる。


           またこの状態でカーソル位置は2行目の文末にありますが、
           カーソルを左に1文字動かすと(この場合"0"から"9"へ)、
           1行目文頭からカーソル位置まで選択し直されるようです。
      • [4597] Re2: 折り返し変更時、強制終了する。 せくぱぱ 2005年08月09日 09:32

        ▼ もかさん
        > ステータスバーを非表示にすると回避できるようです。
         回避策ご教授ありがとうございます!
         ステータスバー表示環境に慣れてしまっているので
         ちょっと違和感がありますが、打ち込んだソースや
         文章を失うことを考えると仕方ないですね(汗
         ステータスバーうを非表示にしても、メニューバー右端
         に同様の内容(行:桁/文字コード)が表示されるので、
         代替できそうです。 ありがとうございました。
    • [4601] お試し版 (RE: 折り返し変更時、強制終了する。) げんた 2005年08月14日 16:12

      折り返し位置を変更した場合に選択範囲を調整するように修正したお試し版を作成しました.

      http://members.at.infoseek.co.jp/sakura_editor/snapshot/sakura_2005-08-14.zip
      ソース
      http://members.at.infoseek.co.jp/sakura_editor/snapshot/ssrc_2005-08-14.tar.bz2

      現在のウィンドウ幅に合わせる機能はタイプ別設定に反映してしまうために,別のウィンドウも同じ折り返し幅となります.これは変な気がしたので折り返し幅をウィンドウ毎に独立に持つようにして,ウィンドウ幅に合わせてもタイプ別設定の値は変更されないようにしました.

      それ以外の修正点も入ってます.
      2005.08.05 >>dev:4001 マクロ関数の追加(maruさん,(全略)さん)
      2005.08.03 >>dev:4000「開こうとしたファイルが存在しないとき警告する」オプションの設定が保存/復元されない (ryojiさん)
      2005.08.11 >>dev:4009 TAB表示時の「重ねて表示」でZ-orderが期待通りにならない (ryojiさん)
      2005.08.14 >>data:4591 選択した状態で折り返し幅を変更するとアプリケーションエラーになることがある.
      • [4604] Re:お試し版 (RE: 折り返し変更時、強制終了する。) maru 2005年08月15日 17:34

        > 折り返し位置を変更した場合に選択範囲を調整するように

        矩形選択状態で[折り返し]-[解除]を行う場合は
        選択範囲の現状維持は出来ないと思いますので
        矩形選択範囲があれば選択解除?でしょうか。

        矩形選択については今回の修正の対象外でしょうが
        念のため報告いたします。


        > それ以外の修正点も入ってます.
        > 2005.08.05 >>dev:4001 マクロ関数の追加(maruさん,(全略)さん)

        対応頂き、ありがとうございました。
        • [4606] Re2:お試し版 (RE: 折り返し変更時、強制終了する。) げんた 2005年08月15日 20:40

          >矩形選択状態で[折り返し]-[解除]を行う場合は
          >選択範囲の現状維持は出来ないと思いますので
          >矩形選択範囲があれば選択解除?でしょうか。
          確かに矩形の場合は始点・終点を維持しても中身が変わってしまいますから解除の方がいいですね.
          • [4608] dev:4001動作が変です maru 2005年08月16日 00:35

            ▼ げんたさん
            すいませんが、>>dev:4001の動きが変です。

            WSHマクロでは気がつきませんでしたが
            PPAマクロで期待の動作をしません。
            //------------------------------------------------
            MessageBox(IntToStr(S_GetCharCode()), 'title', 0);
            MessageBox(IntToStr(S_GetCharCode() + 1), 'title', 0);
            //EOF
            のような内容で、1行目と2行目ののMessageBoxで
            同じ値が表示されます。
            私が追加したすべてのマクロで同じ現象が発生します。

            //CMacro.cpp内のcase F_GETCHARCODE:
            Wrap( &Result )->Receive(View->m_pcEditDoc->m_nCharCode);
            使い方間違っていますか?

            素人で本当にすいません。取り急ぎご連絡まで。
            • [4613] RE: dev:4001動作が変です げんた 2005年08月16日 23:24

              >のような内容で、1行目と2行目ののMessageBoxで
              >同じ値が表示されます。
              View->m_pcEditDoc->m_nCharCode
              は現在挿入される改行コードの種別を保持しているので,同じ値が返るのは別におかしくないです.

              CharCodeという名前からして紛らわしいとは思っていたのですが...
              ひょっとしてカーソル位置の文字コードを取得しようとしてました?
              • [4614] Re2: dev:4001動作が変です もか 2005年08月17日 00:23

                現象、私のほうでも確認できました。
                IntToStr・MessageBox・演算子などは、PPA.dll内蔵部分なので良く分からないのですが、
                MessageBox(IntToStr(S_GetCharCode()), 'title', 0);
                MessageBox(IntToStr(1 + S_GetCharCode()), 'title', 0);
                と、「1」と「S_GetCharCode()」の順番を入れ替えたら正常に表示されました。
                PPA側の問題だと思います。

                ついでに別件。。
                CPPA::stdStrFuncの最後。
                > *ResultValue = "";
                ローカルの文字列定数を返しているので、ポインタの値が不定になる可能性があります。
                • [4615] Re3: dev:4001動作が変です maru 2005年08月17日 00:41

                  返信ありがとうございます。

                  ▼げんたさん
                  > CharCodeという名前からして紛らわし
                  良い名前が思い浮かびませんでした…。

                  ▼もかさん
                  > 「1」と「S_GetCharCode()」の順番を入れ替えたら
                  ご指摘のとおりでした。ただ、ちょっと問題が。
                  例1のような分岐をしたいのですが例2のように
                  記述する必要があるようです。

                  例1)
                  if S_GetCharCode(0) = 0 then
                  MessageBox('SJIS', 'title', 0);

                  例2)
                  if 1 + S_GetCharCode(0) = 1 then
                  MessageBox('SJIS', 'title', 0);

                  S_LineCountではこの現象が発生しません。
                  • [4617] Re4: dev:4001動作が変です げんた 2005年08月17日 00:46

                    すいません.思い切り外してました.
                    +1って一文字先じゃないですよね...orz
            • [4618] RE: dev:4001動作が変です げんた 2005年08月17日 01:04

              外したまま引き下がるのも何なので...

              取り込み前に全ての追加関数についてPPAで動作確認はしました.ただ,いずれも戻り値を一旦変数に格納する形で使っていたので問題が発生しなかったのかもしれません.

              var
              message : string;
              sx, sy, ex, ey : Integer;
              linecode : Integer;
              begin
              message := '';
              if S_IsTextSelected then
              begin
              sx := S_GetSelectColmFrom;
              sy := S_GetSelectLineFrom;
              ex := S_GetSelectColmTo;
              ey := S_GetSelectLineTo;
              message := message + '選択範囲(' + IntToStr(sx) + ',' + IntToStr(sy) + ')-(' + IntToStr(ex) + ',' + IntToStr(ey) + ')' + #13 + #10;
              end;

              if S_IsInsMode then
              begin
              message := message + '挿入';
              end
              else begin
              message := message + '上書';
              end;

              message := message + 'モード' + #13 + #10;

              linecode := S_Getlinecode;
              case linecode of
              0: message := message + '改行: CRLF';
              1: message := message + '改行: CR';
              2: message := message + '改行: LF';
              end;

              message := message + #13 + #10 + 'Undo :';

              if S_IsPossibleUndo then
              message := message + '可能'
              else
              message := message + '不可';

              message := message + #13 + #10 + 'Redo :';
              if S_IsPossibleRedo then
              message := message + '可能'
              else
              message := message + '不可';

              message := message + #13 + #10 + '文字コード種別: ' + IntToStr( S_GetCharCode );
              S_GoFileEnd;
              S_InsText(message);

              end;

              引数のない関数呼び出しで()をつけていないという違いもありますが,関係あるかな?
              • [4619] Re2: dev:4001動作が変です maru 2005年08月17日 02:26

                ▼げんたさん
                > 引数のない関数呼び出しで()をつけていない
                > という違いもありますが,関係あるかな?
                これが正解のようです。

                確認したところ、下の結果になりました。
                誤動作:if S_GetCharCode(0) = 0 then
                誤動作:if S_GetCharCode() = 0 then
                OK :if S_GetCharCode = 0 then

                試しに、CSMacroMgr.cppのmaru追加分について
                - {F_*****,"*****",{VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY}, VT_I4, NULL },
                + {F_*****,"*****",{VT_I4, VT_EMPTY, VT_EMPTY, VT_EMPTY}, VT_I4, NULL },
                のようにすべて書き換えたところ、

                OK   :if S_GetCharCode(0) = 0 then
                文法エラー:if S_GetCharCode() = 0 then
                文法エラー:if S_GetCharCode = 0 then
                となりました。

                現行バージョンでは、エラーが出ないので
                誤った記述でもマクロが動いてしまうため
                引数を強制したほうが無難に思います。
      • [4620] Re:お試し版 (RE: 折り返し変更時、強制終了する。) せくぱぱ 2005年08月17日 09:12

        ▼ げんたさん
        > 折り返し位置を変更した場合に選択範囲を調整するように修正したお試し版を作成しました.
        > 2005.08.14 >>data:4591 選択した状態で折り返し幅を変更するとアプリケーションエラーになることがある.
         修正版頂きましたっ
         早速試した所、App.Errorが発生しなくなったことを確認できました!!
         ご対応ありがとうございました。
         あと>>data:4599で選択範囲の残骸報告がありましたが、
         本修正版で試した所、改善されていること確認できました。