Curl Global Community
文字入力の抑止について - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: 文字入力の抑止について (/showthread.php?tid=279)

Pages: 1 2


文字入力の抑止について - usami - 09-16-2011

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}





RE: 文字入力の抑止について - nmyzk - 09-16-2011

若干乱暴ですが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"}



RE: 文字入力の抑止について - usami - 09-21-2011

ありがとうございます。
このままだとBackSpace等も効かなくなるので、それなりに工夫が必要ですね。



RE: 文字入力の抑止について - 森口 慶紀 - 09-22-2011

>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
    }
}



RE: 文字入力の抑止について - usami - 09-22-2011

ありがとうございます。
123a
と入力した場合undoだから全部消えてしまいますね。
aだけ消えるのはValueChangedでは難しいのでしょうか?



RE: 文字入力の抑止について - Yuhki - 09-22-2011

単純な数値入力でよければ以下はいかがでしょうか?

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}

マイナスを受け入れたり、小数点以下を許す場合には
もっと工夫が必要かと思います。



RE: 文字入力の抑止について - nmyzk - 09-22-2011

Yuhkiさんに出遅れましたが、
前述のNumericTextFieldを改変したサンプルを作ってみました。

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

[attachment=220]



RE: 文字入力の抑止について - 森口 慶紀 - 09-22-2011

>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
}



RE: 文字入力の抑止について - usami - 09-22-2011

>nmyzkさん
{set-of char}に許容する文字やキーを羅列しておけばよいということですね。
>森口さん
123aや12a3をコピーしてTextFieldにペーストしたら123だけ入るのってさすがに厳しいですかね?
まぁ、そこまで要求することはないとは思いますが・・Smile




RE: 文字入力の抑止について - usami - 09-22-2011

これまでのコメントを元に、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}