Post Reply 
 
Thread Rating:
  • 397 Votes - 2.82 Average
  • 1
  • 2
  • 3
  • 4
  • 5
文字入力の抑止について
09-16-2011, 10:10 AM
Post: #1
文字入力の抑止について
TextFieldの{NumericValidator・・}で数値の検証を行い
数値以外の場合はエラーメッセージを表示するようにできるのですが、
そもそも数値以外の入力をさせたくない場合はどのような記述をすればいいでしょうか?
KeyPressイベントで数値以外を入力したらundoするような機能ってあるのでしょうか?
また、abcdeを入力してtabキーを押すとエラーは出るのですが、再度tabキーを押すと
検証されずに次の項目に遷移されてしまうのですが、毎回検証することはできないのでしょうか?

Code:
{let tf:TextField =
    {TextField
        width = 40pt,
        max-chars = 5,
        {validate-with
            {NumericValidator
                locale = "en",
                max-allowable = 99999,
                signed? = true,
                allow-grouping? = false,
                allow-decimal-point? = false,
                allow-exponent? = false
            },
            required? = false,
            dialog-on-finished? = true,
            message="入力は半角数字5文字までです。",
            refocus? = true
        }
    }
}
{let tf2:TextField =
    {TextField
        width = 40pt
    }
}
{HBox tf,tf2}
Find all posts by this user
Quote this message in a reply
09-16-2011, 11:54 AM
Post: #2
RE: 文字入力の抑止について
若干乱暴ですがTextFieldを継承したクラスで
UIのKeyPressイベントを止めつつ、
set-value-with-eventsを抑止すれば
ほぼ入力できなくなると思います。
Code:
{define-class public NumericTextField {inherits TextField}

  {constructor public {default ...}

    {construct-super {splice ...}}
    {self.ui-object.add-event-handler
{on e:KeyPress do
{switch e.value
case '1','2','3','4','5','6','7','8','9','0','-',',' do
else                {e.consume}
}
}
}

    set self.halign = "right"
}

  {method public {set-value-with-events val:String}:void
{for c:char in val do
{switch c
case '1','2','3','4','5','6','7','8','9','0','-',',' do
else            {return}
}

    }

    {super.set-value-with-events val}  }

}

{NumericTextField value = "150"}
Find all posts by this user
Quote this message in a reply
09-21-2011, 12:02 PM
Post: #3
RE: 文字入力の抑止について
ありがとうございます。
このままだとBackSpace等も効かなくなるので、それなりに工夫が必要ですね。
Find all posts by this user
Quote this message in a reply
09-22-2011, 07:44 AM (This post was last modified: 09-22-2011 07:48 AM by 森口 慶紀.)
Post: #4
RE: 文字入力の抑止について
>TextFieldの{NumericValidator・・}で数値の検証を行い
>数値以外の場合はエラーメッセージを表示するようにできるのですが、
>そもそも数値以外の入力をさせたくない場合はどのような記述をすればいいでしょうか?
>KeyPressイベントで数値以外を入力したらundoするような機能ってあるのでしょうか?

こんな感じではどうでしょうRolleyes
KeyPressイベントではなく、ValueChangeイベントにてundo処理を行っています。
ペーストされた場合でも値が入らない様になります。

Code:
{curl 8.0 applet}
{curl-file-attributes character-encoding = "utf8"}

{import * from CURL.LANGUAGE.REGEXP}

{def tf = {TextField
              {on ValueChanged at tf:TextField do
                  {if {regexp-match? |"\D"|, tf.value} then
                      {tf.undo}
                  }
              }
          }
}
{value
    {HBox
        tf
    }
}
Find all posts by this user
Quote this message in a reply
09-22-2011, 09:23 AM
Post: #5
RE: 文字入力の抑止について
ありがとうございます。
123a
と入力した場合undoだから全部消えてしまいますね。
aだけ消えるのはValueChangedでは難しいのでしょうか?
Find all posts by this user
Quote this message in a reply
09-22-2011, 09:50 AM
Post: #6
RE: 文字入力の抑止について
単純な数値入力でよければ以下はいかがでしょうか?

Code:
{import * from CURL.LANGUAGE.REGEXP}

{define-class public NumberTextField {inherits TextField}

  {constructor public {default ...}
    {construct-super {splice ...}}
  }
  
  {method public open {replace-selection-with-string
                          text-to-insert:StringInterface
                      }:void
    {output text-to-insert}
    {if {regexp-match? |"^\D*$"|, text-to-insert} then
        set text-to-insert = ""
    }
    {super.replace-selection-with-string text-to-insert}
  }
}

{NumberTextField}

マイナスを受け入れたり、小数点以下を許す場合には
もっと工夫が必要かと思います。
Find all posts by this user
Quote this message in a reply
09-22-2011, 09:56 AM
Post: #7
RE: 文字入力の抑止について
Yuhkiさんに出遅れましたが、
前述のNumericTextFieldを改変したサンプルを作ってみました。

でもコピー&ペーストを許容するならYuhkiさんのつくりの方がよさそうですね。
ご参考まで。


.curl  NumericTextField.curl (Size: 1.63 KB / Downloads: 473)
Find all posts by this user
Quote this message in a reply
09-22-2011, 09:57 AM (This post was last modified: 09-22-2011 09:59 AM by 森口 慶紀.)
Post: #8
RE: 文字入力の抑止について
>123aと入力した場合undoだから全部消えてしまいますね。
>aだけ消えるのはValueChangedでは難しいのでしょうか?

申し訳ありません。確認不足でした。。。Sad

Code:
{curl 8.0 applet}
{curl-file-attributes character-encoding = "utf8"}

{import * from CURL.LANGUAGE.REGEXP}

{def tf = {TextField
              {on e:KeyPress do
                  {tf.record-typing-for-undo e.value}
              },
              {on ValueChanged at tf:TextField do
                  {if {regexp-match? |"\D"|, tf.value} then
                      {tf.undo}
                   else
                      {tf.clear-undo-stack}
                  }
              }
          }
}
{value
      tf
}
Find all posts by this user
Quote this message in a reply
09-22-2011, 01:14 PM
Post: #9
RE: 文字入力の抑止について
>nmyzkさん
{set-of char}に許容する文字やキーを羅列しておけばよいということですね。
>森口さん
123aや12a3をコピーしてTextFieldにペーストしたら123だけ入るのってさすがに厳しいですかね?
まぁ、そこまで要求することはないとは思いますが・・Smile
Find all posts by this user
Quote this message in a reply
09-22-2011, 04:00 PM
Post: #10
RE: 文字入力の抑止について
これまでのコメントを元に、max-charsになったら自動的にtabキーを押して次の項目に遷移するような
TextFieldを作成してみました。初回起動して12345を入力しても遷移しないのですが、もう一度
12345を入力しなおすと自動遷移します。この現象ってどこに原因があるのでしょうか?
初回と2回目は同じ動きをしているっぽいのですが謎です。
また、tf2をmax-charsの変更だけで同じ挙動をさせたいのですがこの場合はNumericTextFieldのような
拡張クラスを作らなければならないのでしょうか?

Code:
{import * from CURL.LANGUAGE.REGEXP}
{let max-chars:int = 5}
{let tf1:TextField =
    {TextField
        width = 40pt,
        max-chars = max-chars,
        {on e:KeyPress  do
            {tf1.record-typing-for-undo e.value}
        },
        {on e:ValueChanged at tf:TextField do
            {if {tf.get-text}.size >= max-chars then
                let kp:KeyPress = {KeyPress}
                set kp.value = KeyPressValue.tab
                {tf1.ui-object.enqueue-event
                    kp
                }
                {e.consume}
            }
            {if {regexp-match? |"\D"|, tf.value} then
                {tf.undo}
             else
                {tf.clear-undo-stack}
            }
        },
        {on AttachEvent do
            {tf1.become-active}
        }
    }
}
{let tf2:TextField =
    {TextField
        width = 40pt,
        max-chars = 4
    }
}
{HBox tf1,tf2}
Find all posts by this user
Quote this message in a reply
Post Reply 

Forum Jump:


User(s) browsing this thread:
1 Guest(s)