Menu

Undo

develop (84)
novice123

内部構造>Undoの仕組み

Undoの仕組み

2006.04.11

文字列バッファの文字を追加・削除する場合やキャレット位置を変更する場合にはその履歴を記録することでUndoが行えるようになっている.

クラス

COpe

操作種別,キャレットの物理位置,操作に関連したデータブロックを保持するクラス.このオブジェクト1つで1種類の操作1つを格納する.

COpeBlk

COpeを複数束ねるクラス.内容としてはCOpe*の可変長配列にすぎない.1コマンドの文書操作が複数の操作に該当するため,1回のUndoで元に戻す単位に束ねている.

COpeBuf

Undo/Redoバッファ.COpeBlk*をリスト管理する.現在のUndo/redo位置も管理する.CEditDocのメンバである.

操作の記録

1つのコマンドの実行毎CEditView::HandleCommand()にてCEditView::m_pcOpeBlkCOpeBlkオブジェクトが作成され,コマンド完了時点でCOpeBufへ新たな操作として登録される.

m_pcOpeBlkの操作は基本的にCEditViewのみで行われる.CEditViewにはバッファ操作とUndo登録を対にして行うためのメソッド群(DeleteData, DeleteData2, InsertData_CEditView, ReplaceData_CEditView)が用意されている.

操作の再生

CEditView::Command_UNDO(), CEditView::Command_REDO()でUndo/Redoを行う.COpeBuf::m_cOpeBufからUndo/Redo対象となるCOpeBufを取り出してそれを再生する.再生にもCEditViewのバッファ操作関数を用いるが,それらはCEditView::m_bDoing_UndoRedo がTRUEの場合にはUndoバッファに操作を記録しない.


Related

Wiki: Design

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.