tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルテキストボックスのアンドゥ・リドゥについて
記事No9486
投稿日: 2009/10/22(Thu) 18:14
投稿者囲炉裏
[開発環境]
  OS:Windows XP Professional
 IDE:Visual Studio 2008 Express Edition

今、簡単なテキストエディタを作っています。
エディタ部分にTextBoxコントロールを使用しているのですが、
TextBoxには1回のアンドゥ・リドゥしか出来ません。
なので、独自に実装し、TextChangedイベントでテキストを取得し、
履歴(List(Of String))に追加して、アンドゥ、リドゥ処理時に
履歴を参照し表示するようにしました。
しかし、これだと1000文字のテキストを編集すると、毎回約1000文字ずつ
履歴に追加されることになり、メモリを使いすぎると思い、
違う方法を探しています。

何かよい方法はないでしょうか。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: テキストボックスのアンドゥ・リドゥについて
記事No9487
投稿日: 2009/10/23(Fri) 09:12
投稿者GOD
> 何かよい方法はないでしょうか。
> よろしくお願いいたします。
>
位置、文字列1、文字列2、操作(追加/削除/置換....)のメンバーを持つクラスを作成して
履歴として保存するようにしたらどうでしょう。
メンバーは操作によって増減しますが...(置換が必要ないなら文字列2がいらないとか。)

例1.345を削除時
前:123456789 → 後:126789
位置:2、文字列1:345、操作:削除

[ツリー表示へ]
タイトルRe^2: テキストボックスのアンドゥ・リドゥについて
記事No9490
投稿日: 2009/10/23(Fri) 17:03
投稿者囲炉裏
GOD さん、回答ありがとうございます。

> 位置、文字列1、文字列2、操作(追加/削除/置換....)のメンバーを持つクラスを作成して
> 履歴として保存するようにしたらどうでしょう。

なるほど。そのアイディアは思いつきませんでした。
がんばって実装して見ます。
ありがとうございました。

[ツリー表示へ]
タイトルRe^3: テキストボックスのアンドゥ・リドゥについて
記事No9491
投稿日: 2009/10/23(Fri) 18:10
投稿者囲炉裏
> がんばって実装して見ます。

実装を試みましたが、入力や切り取り、貼り付けなどをした後の
変更部分の取得方法が分かりません。
TextChangedイベントだとどこが変更されたかどうかを取得できないので
困っています。

どなたかよろしくお願いします。

[ツリー表示へ]
タイトルRe^4: テキストボックスのアンドゥ・リドゥについて
記事No9492
投稿日: 2009/10/24(Sat) 02:26
投稿者GOD
> > がんばって実装して見ます。
>
> 実装を試みましたが、入力や切り取り、貼り付けなどをした後の
> 変更部分の取得方法が分かりません。
> TextChangedイベントだとどこが変更されたかどうかを取得できないので
> 困っています。
>
KeyPressイベントとかでキー取得できないかな。
コピペ関連はClipboardクラスを調べてみて。
使いそうなのはCtrl+C, Ctrl+V, Ctrl+X, Shift+Ins, Shift+Delくらいかな?

[ツリー表示へ]
タイトルRe: テキストボックスのアンドゥ・リドゥについて
記事No9493
投稿日: 2009/10/24(Sat) 07:02
投稿者花ちゃん
> しかし、これだと1000文字のテキストを編集すると、毎回約1000文字ずつ
> 履歴に追加されることになり、メモリを使いすぎると思い、
> 違う方法を探しています。

現状は、どの位メモリを消費し、それをどの程度までに抑えたいと思って
おられるのでしょうか?

Changedイベント や キー入力の度に複雑な判断処理をすれば、動作が重くなる可能性が
ありますが、メモリの方が優先しますか?
Windows95 や 98 のような OS で使用するなら別ですが、XP 以降ならそれほど
メモリを気にする必要もないかと思いますが(それとも何か問題がでているとか)

私なら、多くのソフトのように、元に戻す等の動作の履歴の回数に制限を設けます。
テキストエディタの目的にもよりますが、通常20回以上の前の動作まで元に戻すような
事はされないかと思うので、VBのIDEのように最新の履歴を20回分まで保存するように
制限すれば、文字列変数を20個使用するのと同程度のメモリ使用になると思うのですが。

今回の条件に合致するかどうかは、知りませんが、変わった方法としては、
この掲示板でも話題になった、投稿No.3810  投稿No.5911 のような方法もあります。

※ 上記の過去ログは、下記のソフトでご覧になれます。

 VB6.0及びVB.NET用掲示板の過去のログ及び閲覧ソフト(検索キー [元に戻す])
 http://hanatyan.sakura.ne.jp/freesoft/vb60logview.htm

[ツリー表示へ]
タイトルRe^2: テキストボックスのアンドゥ・リドゥについて
記事No9494
投稿日: 2009/10/24(Sat) 09:49
投稿者GOD
> > しかし、これだと1000文字のテキストを編集すると、毎回約1000文字ずつ
> > 履歴に追加されることになり、メモリを使いすぎると思い、
> > 違う方法を探しています。
>
> 現状は、どの位メモリを消費し、それをどの程度までに抑えたいと思って
> おられるのでしょうか?
>
sender.Textをそのまま保存していたんじゃないでしょうか。
それだとメモリ消費量は「(編集中のファイルの大きさ+α)×操作回数」になってしまう
のでお勧めできません。
囲炉裏さんの例は1000文字となっていますが、これが1GBとかのファイルだったら...

[ツリー表示へ]
タイトルRe^3: テキストボックスのアンドゥ・リドゥについて
記事No9495
投稿日: 2009/10/24(Sat) 16:06
投稿者囲炉裏
>>花ちゃんさん
> 私なら、多くのソフトのように、元に戻す等の動作の履歴の回数に制限を設けます。
> テキストエディタの目的にもよりますが、通常20回以上の前の動作まで元に戻すような
> 事はされないかと思うので、VBのIDEのように最新の履歴を20回分まで保存するように
> 制限すれば、文字列変数を20個使用するのと同程度のメモリ使用になると思うのですが。

>>GODさん
> sender.Textをそのまま保存していたんじゃないでしょうか。
> それだとメモリ消費量は「(編集中のファイルの大きさ+α)×操作回数」になってしまう
> のでお勧めできません。
> 囲炉裏さんの例は1000文字となっていますが、これが1GBとかのファイルだったら...

花ちゃんさん、GODさん、貴重なご意見ありがとうございます。

花ちゃんさんの言うとおり、回数制限を作るというのも良いですね。
確かに、テキストファイルはそんなに元に戻すを繰り返すときもないですね(^_^;)

でも、GODさんのいうとおり、文字数が多ければ多いほど重くなってしまうと思います。

ですので、GODさんの意見を参考にしようと思います。

[ツリー表示へ]