6

行を削除して 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 パラメーターの設定に関するガイダンスが見つかりません。2 つの「アクション」を結合して、「結合」アクションの元に戻すとやり直しが 1 つだけになるようにする必要があります。オプション eoGroupUndo = True を使用した「挿入と削除」です。

4

1 に答える 1

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/機能は TSynEdit にあると思いEndUndoBlockますが、TSynMemo は実際には TSynEdit から派生しているため、これはまだ機能するはずです。

于 2012-06-14T16:04:32.413 に答える