如果删除一行然后在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;
Run Code Online (Sandbox Code Playgroud)
编辑 我试过这个,但撤消和重做不能正常工作......我的意思是这是在撤消后,线路没有恢复到行动之前的状态.
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;
Run Code Online (Sandbox Code Playgroud)
我找不到有关设置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;
Run Code Online (Sandbox Code Playgroud)
我相信BeginUndoBlock/EndUndoBlock功能驻留在 TSynEdit 上,但因为 TSynMemo 实际上是从 TSynEdit 派生的,所以它应该仍然有效。