我使用TSynEdit作为一个更人性化的TMemo,多为高级快捷键,撤销/重做,等等。
其他的事情都OK,除了换行行为,请检查下面随附的屏幕截图,SynEdit对最左侧显示一个奇怪的空间。
如何避免这一点,使它看起来像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经理在昨天我下载的版本线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)
不超过有效范围缓冲区被用来做自动换行。