エディターを作製していて、それにUndo機能を付けたいのです。
50個くらいを記憶したいのですが、
実際に作って見ると、処理速度がかなり遅いです TT
Undoの基本的なアルゴリズムなどを知っていたら教えてください。
よろしくお願いします。
標準のMemoなどにつけるとなると、かなりきついかもしれません。
たとえば、TUndoListという、双方向リストを作ります。
その中に、Undoに最低限必要な情報を登録します。
たとえば次のようなもの
・1文字入力
・1文字削除
・N文字入力(貼り付け)
・N文字削除
・キャレット移動
双方向にしておいて、操作情報が入ったら、データを格納、その後ろを削除します。
Undoされたら、1つ前の処理段階に戻し、リストポジションも1つ戻します。
# この段階では現在のポジションより後ろを削除しません
Redoされたら、1つ先の処理段階に進み、リストポジションも1つ先に進めます。
大体の流れは分かりました。
ちょっと質問なのですが、
>・N文字入力(貼り付け)
>・N文字削除
という部分は、やはり前のと文の比較を行って、
その差分を記憶/削除すると言うほうがいいのでしょうか?
だいたいですが、
・動作(貼り付け)
・貼り付け開始位置
・貼り付け対象文字列&長さ
・動作後位置
・動作(削除)
・動作前位置
・削除対象文字列&長さ
・動作後位置
がわかれば問題ないと思います。
Undoするときは、
貼り付けの場合
・貼り付け開始位置から、貼り付け対象文字列の長さ分削除
・貼り付け開始位置に移動
削除の場合
・動作後位置に、削除対象文字列を挿入
・動作前位置に移動
というようにします。
ありがとうございます
大変参考になりました。
何とかなりそうなのでやってみますね。
また次もよろしくお願いします ^^
ツイート | ![]() |