gpt4 book ai didi

delphi - 删除和插入行时如何更新 SynMemo Undo/RedoList

转载 作者:行者123 更新时间:2023-12-03 15:02:44 24 4
gpt4 key购买 nike

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

最佳答案

虽然我没有使用过 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 派生的,因此这应该仍然有效。

关于delphi - 删除和插入行时如何更新 SynMemo Undo/RedoList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8915098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com