如何使SynEdit自动换行一样的备忘录?

问题描述 投票:4回答:1

我使用TSynEdit作为一个更人性化的TMemo,多为高级快捷键,撤销/重做,等等。

其他的事情都OK,除了换行行为,请检查下面随附的屏幕截图,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;
delphi delphi-xe4 synedit
1个回答
1
投票

这不是一个完整的,经过测试答案Q,但可以提供确定的阅读器点跳跃到一个实用的解决方案。

一个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);

vRunnervRowEnd是其中一些在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)不超过有效范围缓冲区被用来做自动换行。

© www.soinside.com 2019 - 2024. All rights reserved.