Curl Global Community
ハイライト表示時のTextFieldを書き換える - 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: ハイライト表示時のTextFieldを書き換える (/showthread.php?tid=395)



ハイライト表示時のTextFieldを書き換える - usami - 01-20-2012

下記URL
http://developers.curlap.com/faq/48-faq-specification/669-2010-12-24-00-36-19.html
を参考に、次のコードにて全角および半角のカンマを入力できないようなTextFieldを作成しましたが、
ハイライト表示の状態でTextFieldの値を書き換えると、文字列が入れ替わらず、追記になってしまいますが、
これを回避する方法はありますか?
操作手順
1.全角で「123,456」を入力すると、値には「123456」が入ります
2.次に、123456の後ろに「789」を入力すると、値には「123456789」が入ります
3.次に、「123456789」をハイライト表示させたあと、「987,654」を入力すると、
期待する動作は「987654」ですが、実際は「123456789987654」になってしまいます。
Code:
{curl 8.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{applet
    {compiler-directives careful? = true}
}
{import * from CURL.LANGUAGE.REGEXP}{let start:Frame = {Frame color = "blue", font-weight = "bold"}}
{let change:Frame = {Frame font-weight = "bold" }}
{let end:Frame = {Frame color = "blue", font-weight = "bold"}}
{let result:Frame = {Frame color = "red", font-weight = "bold"}}
{let vl:Frame = {Frame font-weight = "bold"}}{let tf:TextField =
    {TextField width = 5cm,
        input-method-focus-behavior = "activate",
        ui-object = {SkinnableTextFieldUI
                        {on e:StartCompositionEvent do
                            {start.clear}
                            {change.clear}
                            {end.clear}
                            {result.clear}
                            {vl.clear}
                            {start.add replace? = true, "イベントが開始しました"}
                        },
                        {on e:CompositionChangeEvent do
                            {change.add replace? = true, e.string}
                        },
                        {on e:EndCompositionEvent do
                            {end.add replace? = true, "イベントが終了しました"}
                        },
                        {on e:CompositionResultEvent do
                            let valuestr:#String = tf.value
                            let str:String = e.string
                            set str =
                                {regexp-subst ",",
                                    str,
                                    "",
                                    replace-all?=true
                                }
                            set tf.value = valuestr & str
                            {result.add replace? = true, tf.value}
                            let ev:ValueChanged = {ValueChanged}
                            {tf.enqueue-event ev}
                            {e.consume}
                        },
                        {on e:KeyPress do
                            {if  e.value == '\u002C' then
                                {e.consume}
                            }
                        }
                    },
        {on e:ValueChanged do
            {vl.add replace? = true, tf.value}
        }
    }}{VBox
    tf,
    {Table columns = 2,
        "イベントの開始", start,
        "入力中の文字列", change,
        "イベントの終了", end,
        "入力結果", result,
        "値", vl
    }
}



RE: ハイライト表示時のTextFieldを書き換える - c-s - 01-23-2012

わざと set tf.value = valuestr & str をしているでしょう。
というと、「今のvalueと追加して」の意味ですね。

代わりに {tf.replace-selection-with-string str} 的な何かをした方がいいではないでしょうか。



RE: ハイライト表示時のTextFieldを書き換える - usami - 01-23-2012

どうもありがとうございます。
お見込みの通り、これをやらないと追記できなくて強制的にValueChangedイベントを発行してたのですが、
CompositionResultEventを次のように書き換えたら、全角スペースが
1文字しか入らず、かつハイライト表示になってしまいました。
{TextField input-method-focus-behavior = "activate"}
これだけだとハイライト表示されずに全角スペースが入ってくれるのですが何かよい方法はあるのでしょうか?
Code:
{on e:CompositionResultEvent do
    let str:String = e.string
    set str =
        {regexp-subst ",",
            str,
            "",
            replace-all?=true
        }
   {tf.replace-selection-with-string str}
   {result.add replace? = true, tf.value}
   {e.consume}
}




RE: ハイライト表示時のTextFieldを書き換える - c-s - 01-23-2012

replace-selection-with-string してから select-nothing をすればハイライトじゃなくなります。



RE: ハイライト表示時のTextFieldを書き換える - usami - 01-24-2012

期待した動作になりました。
どうもありがとうございました。