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

时间:2019-02-02 16:15:09

标签: delphi delphi-xe4 synedit

我将TSynEdit用作更加用户友好的TMemo,主要用于高级快捷方式,UNDO / REDO等。

其他情况都可以,除了自动换行行为,请检查下面的屏幕截图,SynEdit的最左侧显示一个奇怪的空格。

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

enter image description here

在TSynEdit的密钥属性设置:

<div style="position: relative; width:600px;">
    <p>Content of unknown length, but quite quite quite quite quite quite quite quite quite quite quite quite quite quite quite quite long</p>
    <div style="padding-bottom: 100px;">Content of unknown height</div>
    <div class="btn" style="position: absolute; right: 0; bottom: 0; width: 200px; height: 100px;background-color: red;"></div>
</div>

1 个答案:

答案 0 :(得分:1)

这不是对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);

vRunnervRowEnd属于WrapLines方法中使用的许多PWideChar变量。

观看此代码在while循环内的行为(它正在寻找一个自动换行的地方),它可以运行 因此,当Editor.IsWordBreakChar(vRunner^)返回true时,vRunner指针 已经向后移过单词break char,这就是它(空格)结束的原因 下一行,导致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)是否不超过用于自动换行的缓冲区的有效范围。