Как вы обновляете SynMemo Undo / RedoList при удалении и вставке строки - PullRequest
5 голосов
/ 18 января 2012

Если вы удаляете строку, а затем вставляете новую строку в TSynMemo, как обновлять UndoList и RedoList, чтобы изменение можно было отменить с помощью SynMemo.Undo?

SynMemo1.BeginUpdate;
iLineIndex := SynMemo1.Lines.IndexOf( SynMemo1.LineText );
SynMemo1.Lines.Delete( iLineIndex );
iStartTag := SourceStyleComboBox1.CurText;
iEndTag := SourceStyleComboBox1.CurText;
System.Insert( '/', iEndTag, 2 );
iHTML := iStartTag + iElement + iEndTag;  
SynMemo1.Lines.Insert( iLineIndex, iHTML );
SynMemo1.EndUpdate;

EDIT Я пытался это сделать, но отмена и повтор не работает правильно ... Я имею в виду, что после отмены строка не восстанавливается до того, что было до действий.

StartOfBlock.Line := SynMemo1.CaretY;
StartOfBlock.Char := 0;
EndOfBlock.Line := SynMemo1.CaretY;
EndOfBlock.Char := Length( iHTML );
SynMemo1.UndoList.BeginBlock;
SynMemo1.UndoList.AddChange(crInsert, StartOfBlock, EndOfBlock, iHTML, smNormal);
SynMemo1.UndoList.EndBlock;
SynMemo1.RedoList.BeginBlock;
SynMemo1.RedoList.AddChange(crInsert, StartOfBlock, EndOfBlock, iHTML, smNormal);
SynMemo1.RedoList.EndBlock;

Я не могунайдите любое руководство по настройке параметров StartOfBlock и EdifOfBlock.Два «действия» должны быть объединены таким образом, чтобы для «объединенного» действия было только одно «Отменить и повторить» - «Вставить и удалить» с параметром eoGroupUndo = True.

1 Ответ

0 голосов
/ 14 июня 2012

Хотя я не использовал TSynMemo, я использую TSynEdit, но думаю, что обработка будет аналогичной.

Вот как я делаю обновления BlockUndo:

ActiveEditor.SynEditor.BeginUpdate;
try
  //This tells SynEdit to mark all upcoming changes as a single block
  ActiveEditor.SynEditor.BeginUndoBlock;  
  try

    {Any change made here is recorded for undo purposes}
    {Buffer changes (Adding/Editing/Deletion of lines),  caret pos changes, etc}

  finally
    //This completes the undo block.
    ActiveEditor.SynEditor.EndUndoBlock;
  end;
finally
  ActiveEditor.SynEditor.EndUpdate;
end;

Я полагаю, что функциональность BeginUndoBlock / EndUndoBlock находится в TSynEdit, но поскольку TSynMemo на самом деле происходит от TSynEdit, это все равно должно работать.

...