ページ 11

テキストエディタのundo redo

Posted: 2014年8月02日(土) 16:00
by やす
自前の計算ソフトの入力に、自前でテキストエディタを実装しています。
VC_Expressにて実装中

コード:

			case  IDM_UNDO: //元に戻る(&Z)
				SendMessage(hEdit,WM_UNDO,0,0);
				break;
			case  IDM_REDO: //やり直し(&Y)
//				SendMessage(hEdit,EM_REDO,0,0);
				break;

とundoをやっていますが、
複数回のundoには対応していません。
対応させたいのですが、ネット上を探索すると
テキストボックス内の文字の全文字を保存し、
undoにて保存文字を現在の文字で置き換える
ような形の様な気がします。

今作っているエディタの使用における文字数は
複数行にわたりますが、大した量ではないと思います(200行もいかないかも)
しかし、世に有名なテキストエディタでは恐ろしい行のデータに対応させるため、
たぶんですが、全文字を保存しているようには思えません。

期待したいご回答ですが、
こういうパターンがあるよ
などのご意見を頂きたい次第です。

Re: テキストエディタのundo redo

Posted: 2014年8月02日(土) 16:22
by h2so5
データが大きい場合は圧縮するとか、差分だけ保存するとかしておけばいいと思います。

Re: テキストエディタのundo redo

Posted: 2014年8月04日(月) 11:35
by hatena
編集履歴を保存しているのだと思います。

選択開始位置 選択文字列 挿入文字列

を配列にでも入れておいて、UnDoするときに逆操作をするようにすればいいでしょう。

挿入
選択開始位置 選択文字列 挿入文字列
1 "" "ABC"

undo は、開始位置から挿入文字列の長さ分削除

削除
選択開始位置 選択文字列 挿入文字列
1 "ABC" ""

undo は、開始位置に選択文字列を挿入


置換
選択開始位置 選択文字列 挿入文字列
1 "ABC" "CDF"

undo は、開始位置から挿入文字列の長さ分削除してから、選択文字列を挿入

Re: テキストエディタのundo redo

Posted: 2014年8月11日(月) 20:24
by やす
レス大変おそくなりました。すみません。

やはり、そのような実装をこらしているのですね。

OSもしくはライブラリにAPIがあって実装を省略しているのかなと思っていました。

レス感謝します。