代码之家  ›  专栏  ›  技术社区  ›  Edwin Yip

如何使TSynEdit的Wordwrap与TMemo的相同?

  •  4
  • Edwin Yip  · 技术社区  · 6 年前

    我使用TSynEdit作为一个更友好的TMemo,主要用于高级快捷方式、撤消/重做等。

    其他事情都可以,除了文字包装行为,请检查下面附加的截图,SynEdit有一个奇怪的空间显示在最左边。

    如何避免它,使它看起来像TMemo?

    enter image description here

    TSynEdit的密钥属性设置:

        synEdit1.UseCodeFolding := False;
        synEdit1.Options := [eoAutoIndent, eoDragDropEditing, eoEnhanceEndKey, 
    eoGroupUndo, eoScrollPastEol, eoSmartTabDelete, 
    eoSmartTabs, eoTabsToSpaces];
          synEdit1.ScrollBars := ssVertical;
          synEdit1.TabWidth := 4;
          synEdit1.WantTabs := True;
          synEdit1.WordWrap := True;
          synEdit1.FontSmoothing := fsmNone;
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   MartynA    6 年前

    这不是一个完整的、经过测试的问题答案,但可以提供 读者跳到一个功能性的解决方案。

    TSynEdit的换行行为由其当前 TSynWordWrapPlugin . 默认插件在SynEditWordWrap.Pas中定义 包含程序 TSynWordWrapPlugin.WrapLines 方法,从 昨天我使用D10.2.3 GetIt管理器下载的版本中的第512行。

    从第560行开始,有一段代码,据我所知, 按q:

          if Editor.IsWordBreakChar(vRunner^) then
          begin
            vRowEnd := vRunner;
            break;
          end;
          Dec(vRunner);
    

    vRunner vRowEnd 是在 WrapLines 方法。

    监视此代码的行为,该代码位于 while 循环(它正在寻找一个地方来做一个单词包装),它运行 所以当 Editor.IsWordBreakChar(vRunner^) 返回true,vRunner指针 已经向后移过break char,这就是为什么它(空格)结束的原因 在下面的行上,引起操作人员注意到的问题。

    将代码更改为

          if Editor.IsWordBreakChar(vRunner^) then
          begin
            {ma} Inc(vRunner);  //  WARNING: not fully tested
            vRowEnd := vRunner;
            break;
          end;
          Dec(vRunner);
    

    强制vRunner指针向前越过分词符,使空格包含在行的末尾而不是下一行的开头,因此SynEdit 然后像标准TMemo一样显示其换行文本。

    就我个人而言,我不会使用这种改变,而是看看我是否能说服 SynEdit开发人员提供了一个正式的解决方案。如果我 用零钱 如上所示,我当然不会更改SynEditWordWrap.Pas的源代码, 我会写一个替代的 TSynWordWrapPlugin语言 我会给你一张支票 inc(vRunner) 不超过用于进行换行的缓冲区的有效边界。

    推荐文章