gpt4 book ai didi

delphi - 如何让SynEdit自动换行与Memo一样?

转载 作者:行者123 更新时间:2023-12-03 15:31:49 26 4
gpt4 key购买 nike

我使用 TSynEdit 作为一个更加用户友好的 TMemo,主要用于高级快捷键、UNDO/REDO 等。

其他一切正常,除了自动换行行为,请检查下面所附的屏幕截图,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;

最佳答案

这不是一个完整的、经过测试的 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);

vRunnervRowEndWrapLines 方法中使用的许多 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) 是否超出用于执行以下操作的缓冲区的有效边界:自动换行。

关于delphi - 如何让SynEdit自动换行与Memo一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54494905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com