2012-01-18 36 views
5

Nếu bạn xóa một dòng và sau đó chèn một dòng mới vào TSynMemo làm thế nào để bạn cập nhật các UndoList và RedoList để thay đổi có thể được hoàn tác với SynMemo.Undo?Làm thế nào để bạn cập nhật SynMemo Undo/RedoList khi xóa và chèn một dòng

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; 

EDIT tôi đã cố gắng này, nhưng undo và redo không hoạt động một cách chính xác ... những gì tôi có ý nghĩa bởi đây là sau khi hoàn tác các dòng không được khôi phục với những gì nó đã được trước khi hành động.

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; 

Tôi không thể tìm thấy bất kỳ hướng dẫn nào về cách đặt tham số StartOfBlock và EdifOfBlock. Hai "hành động" nên được kết hợp để chỉ có một lần hoàn tác và làm lại cho hành động "kết hợp" - "Chèn và Xóa" với tùy chọn eoGroupUndo = True.

+0

xem 'Editor.UndoList.AddChange()' – ComputerSaysNo

+0

@Dorin: Tôi đã thử AddChange mà không thành công. xem chỉnh sửa của tôi ... – Bill

+0

ouch, sau đó tôi đề nghị xem xét cách nó xử lý các undo/redo nội bộ, tôi khá chắc chắn bạn có thể nhận được một nơi nào đó từ đó – ComputerSaysNo

Trả lời

0

Trong khi tôi chưa sử dụng TSynMemo, tôi sử dụng TSynEdit, tôi nghĩ rằng quá trình xử lý sẽ giống nhau.

Đây là cách tôi làm cập nhật 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; 

Tôi tin rằng các chức năng BeginUndoBlock/EndUndoBlock nằm trên TSynEdit, nhưng vì TSynMemo thực sự xuống từ TSynEdit này vẫn phải làm việc.

+0

Thật không may này không hoạt động. – kol

Các vấn đề liên quan