"アンドゥを何回かするには、変数に格納する…"
なんだかどこかで聞いたような気がするんですけど、
何を変数に格納するんでしょう?
アンドゥ前とアンドゥ後でのテキストの変更開始位置と終了位置、
後は変更内容を保持しておけばOKでしょう。
無限アンドゥの場合はファイルに落とさないと
メモリ食いつぶしてえらことになりますが・・・。
要はアンドゥを複数回やるのは自力の実装になる(はず)なので
記憶さする内容も、設計次第でしょうか。
余談ですが、メモリ消費を減らすには
保持する内容に簡単な圧縮をすると良いみたいですね。
どこかのページでそういう記事をみたような気がします。
ランレングスとか、その辺の簡単な奴でいいんで、
ちょっとやってみるだけでも、
結構メモり消費は変わってくるんでしょうね。
ランレングス?
それ自体よくわからないんですけど…。
でも、8回くらいで済ますつもりだからいいかな?
(MDIのだったら、それだけでそれ以上のメモリを消費するんじゃないかな?…なんて)
んー、SelStartとSellengthと、その間にある文章を、Changeイベントごとに変数に保存しておけばいいということでしょうか?
それで、1回ごとにずらしていくと…。
(
Type アンドゥバッファ
St As Long ’開始いち
Ed As Long ’終了いち
tx As String '文章
END Type
Dim Buff As アンドゥバッファ
Sub Undo()
アンドゥの命令=Buff(1)
Buff(2)=Buff(1)
Buff(3)=Buff(2)
Buff(4)=Buff(3)
Buff(5)=Buff(4)
END Sub
Sub UndoSet()
Buff(5)=Buff(6)
Buff(5)=Buff(4)
Buff(4)=Buff(3)
Buff(3)=Buff(2)
Buff(2)=Buff(1)
Buff(1)=Buff(0)
END Sub
’Buff(6)にはすべて0か""Buff(0)には今のChangeの情報
こんなかんじですかねぇ?
)
でも、これをどうやって使うんですか?
消した文字の復帰はいいとしても、その逆は?
Sendmessageにパラメータとしていれるとか…。
そんなことないですよねぇ?
第一、わくがひとつ足りないし…。
Changeイベントでは変更されているので、遅い気がしますが・・・。
追加したものを復帰させるのは
開始位置と終了位置さえわかればできますよね。
削除したものを復帰させるには、
削除された位置とその削除内容が必要ですね。
現在のテキスト先頭からテキスト削除開始位置までのテキストと
削除されたテキストと
現在のテキスト末尾から削除終了位置までのテキストを
結合すれば、削除が復元できますよね。
一番大変なのは、テキストの変更内容を取得することだと思います。
案として、現在のキャレット位置と総文字列長を常に保持。
Changeイベントで文字数を比較しすれば追加、削除、置換の
いずれの処理であるかが判別できますよね。
追加なら、キャレット位置の保持だけでいいし、削除なら
変更前のセル位置と現在のセル位置から変更領域を算出し
その上で、変更前のテキストから
変更された文字列を取得すれば良いでしょう。
まったく同じ文字数分置換された時のことも考えて
やはり、直前のセル範囲を保持しておく必要もあるのでしょうか。
Changeイベントでは選択範囲は消えるので
保持するタイミングとしては遅いですが・・・。
ちなみに、ランレングスとは、圧縮方法の1つで
同じ並びのデータをまとめる方法です。
0101010101 →0105(01が5個ある)
うまくやれば、それなりの圧縮率はあるのかな、と。
復元も簡単だし。
んー、分かったような、分からないような…
まあ、だいたいどうすればいいかは分かったので、
やってみます。
> ちなみに、ランレングスとは、圧縮方法の1つで
> 同じ並びのデータをまとめる方法です。
> 0101010101 →0105(01が5個ある)
あー、lzhの圧縮法ですねっ?
どこかで聞いたことあります。うまくすればできそうですね。
LZHってランレングスなんですか?
う〜ん、それは知らなかったです。
こころはビットマップのrle圧縮でランレングスを知りました。
ビットマップフォーマットがRLE圧縮をサポートしてるってのは・・・
結構、誰も知られていないかも。
ちなみに、8Bitと4Bitの画像しかできないんですが。
ツイート |