Как сделать Wordwrap в TSynEdit таким же, как в TMemo? - PullRequest
0 голосов
/ 02 февраля 2019

Я использую 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;

1 Ответ

0 голосов
/ 03 февраля 2019

Это не полный, проверенный ответ на вопрос q, но он может дать определенному читателю возможность перейти к функциональному решению.

Поведение TSynEdit для переноса слов определяется его текущимTSynWordWrapPlugin.Плагин по умолчанию определен в SynEditWordWrap.Pas и содержит метод процедуры TSynWordWrapPlugin.WrapLines, начиная со строки 512 в версии, которую я скачал вчера с помощью диспетчера GetIt D10.2.3.

Начиная со строки 560, есть блоккода, который, насколько я могу судить, учитывает пространство в начале каждой завернутой строки, как показано в q:

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

vRunner и vRowEnd среди числа PWideCharпеременные, используемые в методе WrapLines.

Наблюдая за поведением этого кода, который находится внутри цикла 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 двигаться вперед за символом переноса слов, чтобы пробел был включен в конце строки, а не в sПоговорим о следующем, поэтому SynEdit затем отображает его обернутый текст, как стандартный TMemo.

Лично я бы не стал использовать это изменение, но вместо этого посмотрел бы, смогу ли я убедить разработчиков SynEdit предоставить официальное решение,если бы я действительно использовал изменение, показанное выше, я бы, конечно, не сделал бы это, изменив источник SynEditWordWrap.Pas, я бы сделал это, написав замену для TSynWordWrapPlugin, и я бы включил проверку, чтоinc(vRunner) не превышает допустимых границ буфера, используемого для переноса слов.

...