删除和插入行时如何更新SynMemo撤消/重做列表

时间:2012-01-18 18:08:11

标签: delphi synedit

如果删除一行然后在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;

修改 我试过这个但撤消和重做不能正常工作......我的意思是在撤消之后,线路没有恢复到行动之前的状态。

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 :(得分:0)

虽然我没有使用过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,因此它仍然有效。