none
自前のテキストボックスで「元へ戻る」を実装したい RRS feed

  • 質問

  • 初めて投稿いたします。よろしくお願いします。

     

    現在、テキストボックスを拡張したユーザコントロールを作成し、
    プロパティを設定する事で最大文字数や入力出来る文字(数字のみや半角英数字のみ、等)の
    制御を実現しています。

     

    入力制限を実施するために、KeyPressイベントで、
    下記のように入力文字を判定して表示しています。

    private void MyTextBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        // 入力された文字を解釈してテキストを表示する。
        this.DisplayText(e.KeyChar.ToString());
        e.Handled = true;
    }

    ※DisplayTextメソッドは、前述の通り、
     入力出来る文字かを判別したり、最大文字数内であるかをチェックして、
     表示可能であればテキストボックスに表示します。

     

    このやり方で、問題なくテキストボックスの入力制限は出来るのですが、
    「元へ戻る」事が出来ません。
    (テキストの表示を自前で制限しているからでしょうか。。。)

     

    入力される度に文字を順番に記憶していき、[Ctrl + Z]が押下された際に
    元の文字の表示可能ですが、右クリックの「元へ戻る」を押下する事は出来ません。

     

    既にDisplayTextメソッドは、それなりに作りこんでるため、あまり変更をせずに
    右クリックの「元へ戻る」を実装する事は出来ますでしょうか。

     

    尚、Undoメソッドを使用しても元へ戻る事は出来ませんでした。

     

    よろしくお願いいたします。

     

     

     

    2008年8月14日 18:53

回答

  • 名水さん、こんにちは。

     

     名水 さんからの引用

    このやり方で、問題なくテキストボックスの入力制限は出来るのですが、

     

    できているとは言えないです。
    Text の内容が変わってしまうのは KeyPress イベントだけではないですね。
    たとえばコンテキスト メニューからの 「貼り付け」 はこの方法では対応できないですね。

     


    既にDisplayTextメソッドは、それなりに作りこんでるため、あまり変更をせずに
    右クリックの「元へ戻る」を実装する事は出来ますでしょうか。

     

    Text を自前で変更している以上、自前で実装する必要があります。

    DisplayText メソッドを何とかした方がたぶん早いです。

    2008年8月16日 4:21
  •  名水 さんからの引用

    貼り付けと同様に
    WndProc(ref Message m) メソッドのようなWindowsのメソッド?を
    オーバーライドする事で実装出来ないかと思っています。

    デフォルトのテキストボックスがどのような実装になっているか分からないので確たることは言えません。

     

    右クリックメニュー表示処理を乗っ取る?

    右クリックのメッセージを横取りすることができれば、右クリックメニューを自前で出すことはできるんじゃないでしょうか。

    しかし、そのメニューは全て自前で実装していることが前提になります。

    メニューIDを合わせれば既存実装に投げ直すこともできなくはないでしょうが、あんまり良い感じがしません。

    実装の手間はかかりますが、右クリックメニューが他のテキストボックスとがらっと変えて良いとかいう条件が出れば、まだ芽が出てくるかなと考えます。

    逆に他のテキストボックスと何か違うメニューが出ることを認めてもらえない場合は、この手法は適用できません。

     

    既存のメニューを制御する?

    既存のメニューのグレーアウトの制御ができるかどうかは謎です。

    グレーアウトの制御ができてかつ、メニューのコマンドを横取りできたとしても、「元に戻す」機能自体は自分で実装しなければなりません。

    (この辺はCtrl + Zでの実装ができているということから、心配する要素ではないのかもしれません)

     

     

     

    ただ、どちらの方向性であっても、凝った実装はOSや.NET Frameworkのバージョンが変わると通じなくなる可能性が出てきます。

    ですので、DisplayTextでTextプロパティに設定するのではなく、もっと別の手法を検討することがお薦めします。

     

    例えば、KeyPressイベントで文字入力制限をする例としては下記のようなものが示されています。

    この例はCompact Framework向けですが、Textプロパティを使っていません。

    http://msdn.microsoft.com/ja-jp/library/ms229644(VS.80).aspx

     

    他にもこういったような事例は多く存在するものです。

    入力をフィルタリングする手法の見直しの方が楽かもしれません。

    http://codezine.jp/a/article/aid/1083.aspx?p=1

    2008年8月16日 12:40
    モデレータ

すべての返信

  • 名水さん、こんにちは。

     

     名水 さんからの引用

    このやり方で、問題なくテキストボックスの入力制限は出来るのですが、

     

    できているとは言えないです。
    Text の内容が変わってしまうのは KeyPress イベントだけではないですね。
    たとえばコンテキスト メニューからの 「貼り付け」 はこの方法では対応できないですね。

     


    既にDisplayTextメソッドは、それなりに作りこんでるため、あまり変更をせずに
    右クリックの「元へ戻る」を実装する事は出来ますでしょうか。

     

    Text を自前で変更している以上、自前で実装する必要があります。

    DisplayText メソッドを何とかした方がたぶん早いです。

    2008年8月16日 4:21
  •  

    じゃんぬねっと 様

     

    ご回答ありがとうございます。

     

    > できているとは言えないです。
    > Text の内容が変わってしまうのは KeyPress イベントだけではないですね。
    > たとえばコンテキスト メニューからの 「貼り付け」 はこの方法では対応できないですね。

     

    コンテキストメニューとは、「右クリック - 貼り付け」でしょうか。

    貼り付けに関しましては、WndProc(ref Message m) メソッドを
    実装しており、メッセージの内容が[WM_PASTE = 0x302] の場合、
    同様にDisplayTextメソッドを呼び出しておりますので、実装出来ているかと思います。

     

    状況をうまくお伝えできなく、申し訳ございません。

     

    貼り付けと同様に
    WndProc(ref Message m) メソッドのようなWindowsのメソッド?を
    オーバーライドする事で実装出来ないかと思っています。

     

    > Text を自前で変更している以上、自前で実装する必要があります。
    > DisplayText メソッドを何とかした方がたぶん早いです。


    こちらのやり方も視野に入れて考えたいと思います。

    2008年8月16日 12:18
  •  名水 さんからの引用

    貼り付けと同様に
    WndProc(ref Message m) メソッドのようなWindowsのメソッド?を
    オーバーライドする事で実装出来ないかと思っています。

    デフォルトのテキストボックスがどのような実装になっているか分からないので確たることは言えません。

     

    右クリックメニュー表示処理を乗っ取る?

    右クリックのメッセージを横取りすることができれば、右クリックメニューを自前で出すことはできるんじゃないでしょうか。

    しかし、そのメニューは全て自前で実装していることが前提になります。

    メニューIDを合わせれば既存実装に投げ直すこともできなくはないでしょうが、あんまり良い感じがしません。

    実装の手間はかかりますが、右クリックメニューが他のテキストボックスとがらっと変えて良いとかいう条件が出れば、まだ芽が出てくるかなと考えます。

    逆に他のテキストボックスと何か違うメニューが出ることを認めてもらえない場合は、この手法は適用できません。

     

    既存のメニューを制御する?

    既存のメニューのグレーアウトの制御ができるかどうかは謎です。

    グレーアウトの制御ができてかつ、メニューのコマンドを横取りできたとしても、「元に戻す」機能自体は自分で実装しなければなりません。

    (この辺はCtrl + Zでの実装ができているということから、心配する要素ではないのかもしれません)

     

     

     

    ただ、どちらの方向性であっても、凝った実装はOSや.NET Frameworkのバージョンが変わると通じなくなる可能性が出てきます。

    ですので、DisplayTextでTextプロパティに設定するのではなく、もっと別の手法を検討することがお薦めします。

     

    例えば、KeyPressイベントで文字入力制限をする例としては下記のようなものが示されています。

    この例はCompact Framework向けですが、Textプロパティを使っていません。

    http://msdn.microsoft.com/ja-jp/library/ms229644(VS.80).aspx

     

    他にもこういったような事例は多く存在するものです。

    入力をフィルタリングする手法の見直しの方が楽かもしれません。

    http://codezine.jp/a/article/aid/1083.aspx?p=1

    2008年8月16日 12:40
    モデレータ
  • こんにちは。中川俊輔 です。

     

    じゃんぬねっとさん、Azuleanさん、回答ありがとうございます。

     

    名水さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?有用な情報と思われたため、

    じゃんぬねっとさん、Azuleanさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    名水さんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

    2008年8月27日 8:03