C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Undoの内容のチェック


(過去ログ 127 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■75745 / inTopicNo.1)  Undoの内容のチェック
  
□投稿者/ ni (1回)-(2015/04/28(Tue) 17:07:36)

分類:[.NET 全般] 

Windows7Pro(64bit)、VSE2013を使用、NET Framework 4 です。

かなりの初心者かと思います、WEB上で拾いながら改変しつつ
書いています。
どうぞお手柔らかに。

Undoの動きについてご教授いただけますようよろしくお願い致します。

Private Sub undoredo_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ToolStripMenuItem_UNDOREDO.Click
If TextBox1.CanUndo = True Then
TextBox1.Undo()
End If

と普通のフォームにテキストボックスがあり、右クリックコンテキストメニューに『元に戻す』
コマンドを配置してるイベントです。

なぜか、Undoを実行すると、前のTextBox1.Textではなく2つ前のTextBox1.Textの値が
戻ってくる事があります。
(恐らく間の処理が何か影響があるのだろうと思いますが、今現在見当がつきません。)
Undoの値をUndo実行前に取得する事はできますでしょうか。
できるようであれば、Undo前に値を取得し、TextBox1.Textの変更前の値を
設定したく思います。
他に方法があれば、対策をご提案いただけますよう、よろしくお願い致します。
引用返信 編集キー/
■75749 / inTopicNo.2)  Re[1]: Undoの内容のチェック
□投稿者/ Azulean (469回)-(2015/04/29(Wed) 17:43:15)
2015/04/29(Wed) 17:43:39 編集(投稿者)

No75745 (ni さん) に返信
> なぜか、Undoを実行すると、前のTextBox1.Textではなく2つ前のTextBox1.Textの値が
> 戻ってくる事があります。

これは、Ctrl+Z やテキストボックスの右クリックメニューなどのテキストボックス自体が備える「元に戻す」操作でも同じことなるパターンですか?
もし、そうであれば、自分で Undo を作るしかないと思います。
(認識違ったらご指摘ください)


> Undoの値をUndo実行前に取得する事はできますでしょうか。
> できるようであれば、Undo前に値を取得し、TextBox1.Textの変更前の値を
> 設定したく思います。

TextBox に対してコードから文字列を設定すると、Undo バッファはクリアされます。
コードから文字列を設定するといった手を考えるなら、最初から自分で Undo を作るしかありません。


Undo を自作する場合、どこまでを1操作と見なすかが悩ましいところです。
自分でいろいろな仕様を決めて実装することになると思われます。
引用返信 編集キー/
■75800 / inTopicNo.3)  Re[2]: Undoの内容のチェック
□投稿者/ ni (2回)-(2015/05/03(Sun) 19:58:34)
2015/05/03(Sun) 19:59:52 編集(投稿者)
2015/05/03(Sun) 19:59:31 編集(投稿者)
No75749 (Azulean さん) に返信
> 2015/04/29(Wed) 17:43:39 編集(投稿者)

Azulean さん、貴重なご意見いただきましてありがとうございます。

ただいまGW中で内容詳細確認できませんので、再度確認のうえ7日頃ご連絡致しますので、今しばらくお待ちください。
以下、思いつく範囲で、読んでいますよ、と言う意味も込めて、記します。

> これは、Ctrl+Z やテキストボックスの右クリックメニューなどのテキストボックス自体が備える「元に戻す」操作でも同じことなるパターンですか?

>>(恐らく間の処理が何か影響があるのだろうと思いますが、今現在見当がつきません。)
とお伝えしたように、どうやらこのUndoの処理を
・右クリックのコンテキストメニュー【元に戻す】

・Ctrl+Z
の処理の方法が異なっているために起こっている事の様に思います。
(本来はそうなのでしょうか?
この両コマンド実行時のTextBox1.changeイベントへの回り方が違うように感じます。)

しかしコンテキストメニューの【元に戻す】のプロパティーの、ショートカットキー(?正しいネーミングが今現在確認できかねます)には
Ctrl+Zを登録してあるので、そっちが優先になるものなのかと思っていますが、
そうではないのでしょうか。


■Ctrl+ZのUndo

■TextBox1.Undoとは本来は違うコマンド?処理なのでしょうか。


と、確かな情報が手元にない中ではございますが、一旦取り急ぎご返信させていただきます。
ご意見いただけまして、非常に助かります。
引用返信 編集キー/
■75801 / inTopicNo.4)  Re[3]: Undoの内容のチェック
□投稿者/ Azulean (474回)-(2015/05/03(Sun) 20:14:52)
メニューに自分で割り当てた Ctrl+Z を一旦やめて、別のショートカットキーに変えてみて、動作をテストして見るのも手かもしれません。
それで起きないなら、Ctrl+Z をかぶらせることで何かを招いているのでしょう。

もしそうなら、TextBox の Ctrl+Z のハンドリングを無効化させるか、TextBox の場合はメニューのショートカットキーハンドリングを無効化させるか、そもそも Ctrl+Z をメニューで受け取らないかなど、回避的な実装が必要かもしれません。
引用返信 編集キー/
■75827 / inTopicNo.5)  Re[4]: Undoの内容のチェック
□投稿者/ ni (3回)-(2015/05/07(Thu) 17:00:55)
2015/05/14(Thu) 10:41:01 編集(投稿者)
2015/05/14(Thu) 10:40:57 編集(投稿者)

No75801 (Azulean さん) に返信

Azulean さん、引き続きご教授いただきましてありがとうございます。

動きを確認観察してみたところ、
・キーボード操作のみに2つ前の値を取得します。
(右クリックコンテキストメニュー『元に戻す』では正しい動作、
1つ前の操作のTextBox1.Textの値を取得する。)

・TextBox1で複数選択した文字列を
1.DeleteやBackSpaceキーで一旦削除し、
2.『Ctrl+V』で文字列を『張り付け】、
3.キー操作『Ctrl+Z』で1.操作後の状態の(複数選択文字列が削除された)
値が返ってこない、
と言う問題でした。

・TextBox1のKeyDownイベントで入力制限(半角数字のみ)を掛けている事を
思い出しました。

その出のキー選別が悪いのかと思いましたが、DeleteやBackSpaceが効いている
(選択文字列が削除される)ので、問題はそこではないように思います。


しかし、文字列選別だけで制限が掛けるのが結構厄介なので、
今現在カスタムコントロール実装にて文字列の制限をする事に変更中です。
http://jeanne.wankuma.com/tips/vb.net/textbox/permitchars.html
http://www.vbstation.net/tips/inherits_control.htm



> メニューに自分で割り当てた Ctrl+Z を一旦やめて、別のショートカットキーに変えてみて、動作をテストして見るのも手かもしれません。
> それで起きないなら、Ctrl+Z をかぶらせることで何かを招いているのでしょう。
と、Azulean さんにご提案いただきました、
ContextMenuStrip1.ShortCutkeys=Ctrl+*
と*部に別の文字を与えてみましたが、同じでした→と言うところから
キー判定でつまづいているように感じました。
(他にもエンターキー等の設定をしていなかった事も踏まえ。カスタムコントロールを実装しました。)

ですので、この件は未解決ではございますが一旦置きたいと思います。
・Windows標準のCtrl+*キーでのコマンドと、
通常の右クリックメニューにある
・Undo、Cut、Copy、Paste、Remove、SelectAll
がどうやら同じ動きはしないのでは??
と言うところで置きます。
(別の解決すべき事が出て参りましたので。)
ご協力本当にありがとうございました。

またの際はどうぞよろしくお願い致します。

追記します。↓↓以下がこの続きです。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=75841

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -