6

如果删除一行,然后在 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 的“插入和删除”。

4

1 回答 1

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 的后代,所以这应该仍然有效。

于 2012-06-14T16:04:32.413 回答