Delphi 删除和插入行时,如何更新SynMemo撤消/重做列表
如果删除一行,然后在TSynMemo中插入新行,如何更新撤消列表和重做列表,以便使用SynMemo.Undo撤消更改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
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,但没有成功。看看我的编辑…哎哟,然后我建议看看它在内部处理撤销/重做的方式,我很确定你可以从中有所收获