2012-01-18 58 views
5

如果您刪除一行並將新行插入到TSynMemo中,那麼如何更新UndoList和RedoList,以便可以使用SynMemo.Undo撤消更改?如何在刪除和插入行時更新SynMemo撤銷/重做列表

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

看看'Editor.UndoList.AddChange()' – ComputerSaysNo 2012-01-18 21:13:19

+0

@Dorin:我已經嘗試了AddChange而沒有成功。看到我的編輯... – Bill 2012-01-18 21:50:47

+0

ouch,那麼我建議看看它在內部處理撤銷/重做的方式,我敢肯定你可以從那裏得到某處 – ComputerSaysNo 2012-01-19 02:32:43

回答

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下降這應該仍然工作。

+0

不幸的是,這不起作用。 – kol 2015-01-27 10:31:46