如果删除一行然后在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。
答案 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,因此它仍然有效。