アンドゥを何回かするには?


たかみちえ  URL  2001-06-08 09:33:17  No: 74481  IP: [192.*.*.*]

"アンドゥを何回かするには、変数に格納する…"
なんだかどこかで聞いたような気がするんですけど、
何を変数に格納するんでしょう?

編集    削除
こころ  URL  2001-06-08 16:04:39  No: 74482  IP: [192.*.*.*]

アンドゥ前とアンドゥ後でのテキストの変更開始位置と終了位置、
後は変更内容を保持しておけばOKでしょう。
無限アンドゥの場合はファイルに落とさないと
メモリ食いつぶしてえらことになりますが・・・。

要はアンドゥを複数回やるのは自力の実装になる(はず)なので
記憶さする内容も、設計次第でしょうか。

編集    削除
こころ  URL  2001-06-08 16:07:31  No: 74483  IP: [192.*.*.*]

余談ですが、メモリ消費を減らすには
保持する内容に簡単な圧縮をすると良いみたいですね。
どこかのページでそういう記事をみたような気がします。

ランレングスとか、その辺の簡単な奴でいいんで、
ちょっとやってみるだけでも、
結構メモり消費は変わってくるんでしょうね。

編集    削除
たかみちえ  URL  2001-06-09 22:38:28  No: 74484  IP: [192.*.*.*]

ランレングス?
  それ自体よくわからないんですけど…。
でも、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の情報
こんなかんじですかねぇ?
)
でも、これをどうやって使うんですか?
消した文字の復帰はいいとしても、その逆は?

編集    削除
たかみちえ  2001-06-09 22:40:22  No: 74485  IP: [192.*.*.*]

Sendmessageにパラメータとしていれるとか…。
そんなことないですよねぇ?
第一、わくがひとつ足りないし…。

編集    削除
こころ  URL  2001-06-10 04:04:07  No: 74486  IP: [192.*.*.*]

Changeイベントでは変更されているので、遅い気がしますが・・・。

追加したものを復帰させるのは
開始位置と終了位置さえわかればできますよね。

削除したものを復帰させるには、
削除された位置とその削除内容が必要ですね。
現在のテキスト先頭からテキスト削除開始位置までのテキストと
削除されたテキストと
現在のテキスト末尾から削除終了位置までのテキストを
結合すれば、削除が復元できますよね。

一番大変なのは、テキストの変更内容を取得することだと思います。
案として、現在のキャレット位置と総文字列長を常に保持。

Changeイベントで文字数を比較しすれば追加、削除、置換の
いずれの処理であるかが判別できますよね。

追加なら、キャレット位置の保持だけでいいし、削除なら
変更前のセル位置と現在のセル位置から変更領域を算出し
その上で、変更前のテキストから
変更された文字列を取得すれば良いでしょう。

まったく同じ文字数分置換された時のことも考えて
やはり、直前のセル範囲を保持しておく必要もあるのでしょうか。
Changeイベントでは選択範囲は消えるので
保持するタイミングとしては遅いですが・・・。

ちなみに、ランレングスとは、圧縮方法の1つで
同じ並びのデータをまとめる方法です。
0101010101  →0105(01が5個ある)
うまくやれば、それなりの圧縮率はあるのかな、と。
復元も簡単だし。

編集    削除
たかみちえ  2001-06-14 02:39:22  No: 74487  IP: [192.*.*.*]

んー、分かったような、分からないような…
まあ、だいたいどうすればいいかは分かったので、
やってみます。

>  ちなみに、ランレングスとは、圧縮方法の1つで
>  同じ並びのデータをまとめる方法です。
>  0101010101  →0105(01が5個ある)
  あー、lzhの圧縮法ですねっ?
どこかで聞いたことあります。うまくすればできそうですね。

編集    削除
こころ  URL  2001-06-14 03:46:35  No: 74488  IP: [192.*.*.*]

LZHってランレングスなんですか?
う〜ん、それは知らなかったです。

こころはビットマップのrle圧縮でランレングスを知りました。
ビットマップフォーマットがRLE圧縮をサポートしてるってのは・・・
結構、誰も知られていないかも。
ちなみに、8Bitと4Bitの画像しかできないんですが。

編集    削除