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

Delphi 删除和插入行时,如何更新SynMemo撤消/重做列表,delphi,synedit,Delphi,Synedit,如果删除一行,然后在TSynMemo中插入新行,如何更新撤消列表和重做列表,以便使用SynMemo.Undo撤消更改 SynMemo1.BeginUpdate; iLineIndex := SynMemo1.Lines.IndexOf( SynMemo1.LineText ); SynMemo1.Lines.Delete( iLineIndex ); iStartTag := SourceStyleComboBox1.CurText; iEndTag := SourceStyleComboBox

如果删除一行,然后在TSynMemo中插入新行,如何更新撤消列表和重做列表,以便使用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。

虽然我没有使用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派生而来的,所以它应该仍然可以工作。

查看“Editor.UndoList.AddChange()”@Dorin:我已经尝试了AddChange,但没有成功。看看我的编辑…哎哟,然后我建议看看它在内部处理撤销/重做的方式,我很确定你可以从中有所收获