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

我正在使用TSynEdit作为更加用户友好的TMemo,主要用于高级快捷方式,UNDO / REDO等.

其他的东西都没问题,除了wordwrap行为,请查看下面附带的截图,SynEdit在最左侧显示一个奇怪的空间.

如何避免这种情况并让它看起来像TMemo?

《delphi – 如何使TSynEdit的Wordwrap与TMemo相同?》

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;

最佳答案 这不是q的完整,经过测试的答案,但可能提供确定的

读者是一个功能性解决方案的跳跃点.

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

从第560行开始,有一段代码,据我所知,
如q中所示,占每条包裹线开头的空间:

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

vRunner和vRowEnd是WrapLines方法中使用的许多PWideChar变量之一.

观察这段代码的行为,它在while循环中(寻找一个自动换行的地方),它运行
这样当Editor.IsWordBreakChar(vRunner ^)返回true时,vRunner指针
已经向后移动了字断点字符,这就是它(空间)结束的原因
在以下行上,导致OP注意到的问题.

将代码更改为

      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)不超过用于执行自动换行的缓冲区的有效边界.

点赞