◀ANSI版開発トップへ
  • 3958 最終行の色分けがおかしくなります。
    • 3959 Re: 最終行の色分けがおかしくなります。
      • 3960 Re2: 最終行の色分けがおかしくなります。
      • 3962 Re2: 最終行の色分けがおかしくなります。
        • 3964 Re3: 最終行の色分けがおかしくなります。
          • 3966 Re4: 最終行の色分けがおかしくなります。
  • [3958] 最終行の色分けがおかしくなります。 ootomo 2005年06月22日 14:17

    ootomoです。
    サクラエディタのソースをカスタマイズして使用させて
    頂いております。

    こんな現象を発見しました。
    ①無題を開きます。
    ②タイプ別設定をC言語にします。
    ③以下のような状態にします。
     aaaaaaaaaaa
     "bbbb[EOF]
    ④2行目の最後尾からバックスペースで先頭まで削除します。
     aaaaaaaaaaa
     [EOF]
    ⑤2行目に入力します。
     aaaaaaaaaaa
     ccccc
    ⑥2行目は文字列ではないのに、文字列の色になります。

    CLayoutMgr::DoLayout_Range()メソッドの最後のほうに
     // EOFだけの行の直前の行の色分けが・・・
     if( nCurLine == m_pcDocLineMgr->GetLineCount() ){
      m_nLineTypeBot = nCOMMENTMODE_Prev;
     }
    という処理がありますが、これが原因らしいです。
    ここをコメントアウトしても問題ないでしょうか?
    • [3959] Re: 最終行の色分けがおかしくなります。 もか 2005年06月22日 20:35

      いつも報告・検証ありがとうございます。
      現象、確認できました。いままでまったく気が付きませんでした。

       トレースすると、(4)の"を削除するときに
      CLayoutMgr::DoLayout_Range()の引数がnLineNum = 0となります。
      このとき、何もしないために、m_nLineTypeBotが更新されずに不正になるようです。

      ▼CLayoutMgr::DoLayout_Rangeの先頭付近
      if( 0 == nLineNum ){
      return 0;
      }
      を削除してください。

      >CLayoutMgr::DoLayout_Range()メソッドの最後のほうに
      > // EOFだけの行の直前の行の色分けが・・・
      > if( nCurLine == m_pcDocLineMgr->GetLineCount() ){
      >  m_nLineTypeBot = nCOMMENTMODE_Prev;
      > }
      >という処理がありますが、これが原因らしいです。
      >ここをコメントアウトしても問題ないでしょうか?
      この部分をコメントアウトすると、m_nLineTypeBotが「"モード」に更新されなくなって
      たとえば、以下のように1文字つづ入力すると
      xxx"aaaa
      bb[EOF]
      のbbの色が、通常テキストになってしまいますので、消さないでください。
      本来なら、0 == nLineNumのときも、この処理が行われて正常に色が変わる仕組みでした。
      • [3960] Re2: 最終行の色分けがおかしくなります。 ootomo 2005年06月23日 14:58

        教えて頂いた通りに修正したところ、うまく色分けされる
        ようになりました。

        ありがとうございました。
        m(_ _)m
      • [3962] Re2: 最終行の色分けがおかしくなります。 げんた 2005年06月27日 01:05

        > トレースすると、(4)の"を削除するときに
        >CLayoutMgr::DoLayout_Range()の引数がnLineNum = 0となります。
        本質的にはnLineNumに0を入れて呼びだす方に問題があるような印象を受けるんですが,
        やっぱり最後の[EOF]のみの半人前の行を考慮しないといけなくなってややこしくなるんでしょうか.
        • [3964] Re3: 最終行の色分けがおかしくなります。 もか 2005年06月29日 00:37

          >本質的にはnLineNumに0を入れて呼びだす方に問題があるような印象を受けるんですが,
          >やっぱり最後の[EOF]のみの半人前の行を考慮しないといけなくなってややこしくなるんでしょうか.
          そういうことですね。
          ここでも、EOF行はCLayoutが存在しないために処理がややこしいわけです。

          なお、この削除部分は 2004.03.28 の修正のときに、追加した行だったと記憶しています(CVS未確認)。
          元からの動作では、nLineNum=0でも色情報を更新する仕様になっていたと考えられます。
          また、DoLayout/DoLayout_Range以外で、CLayoutMgr::m_nLineTypeBotを更新するのも変です。
          ですから呼び出し側に問題は(一応)無いと思います。
          • [3966] Re4: 最終行の色分けがおかしくなります。 げんた 2005年07月02日 15:37

            >なお、この削除部分は 2004.03.28 の修正のときに、追加した行だったと記憶しています(CVS未確認)。
            CVSで確認したところ,当初からこのようになっていたようです.
            1.1 (genta 07-Nov-00): if( 0 == nLineNum ){
            1.1 (genta 07-Nov-00): return 0;
            1.1 (genta 07-Nov-00): }