Thread Rating:
  • 417 Vote(s) - 2.89 Average
  • 1
  • 2
  • 3
  • 4
  • 5
TextFlowBox内の文字列変更について
09-06-2011, 04:47 PM,
#1
TextFlowBox内の文字列変更について
ひょっとしたらすごく簡単なことなのかもしれませんが・・・
TextFlowBoxの文字列を変更する必要があるとき
TextFlowBox.clear 後 TextFlowBox.add を使うのが一般的でしょうか?
clear を使用してしまうと、指定していたオプションまで消えてしまうのですが
なにか方法はありませんでしょうか。

Code:
{let tfb:TextFlowBox =  {TextFlowBox
                            horigin = "center",
                            paragraph-justify = "center",
                            color = "black",
                            font-size = 22pt,
                            font-style = "italic",
                            font-weight = "bold",
                            font-family = "MS Pゴシック",
                            text-preserve-whitespace? = true,
                            "こっから\n→ここまで"
                        }}

{tfb.clear}
{tfb.add "ここまで\n→こっから"}
{value tfb}
Reply
09-07-2011, 09:23 AM, (This post was last modified: 09-07-2011, 09:24 AM by ashimo.)
#2
RE: TextFlowBox内の文字列変更について
addの戻り値が追加されたオブジェクトだからだとすれば、

これならどうでしょう 。

Code:
{let tfb:TextFlowBox =  {TextFlowBox
                            horigin = "center",
                            paragraph-justify = "center",
                            color = "black",
                            font-size = 22pt,
                            font-style = "italic",
                            font-weight = "bold",
                            font-family = "MS Pゴシック",
                            text-preserve-whitespace? = true,
                            "こっから\n→ここまで"
                        }}

{value
    {tfb.clear}
    {tfb.add "ここまで\n→こっから"}
    tfb
}

Reply
09-08-2011, 10:03 AM,
#3
RE: TextFlowBox内の文字列変更について
ashimo様

確かに正しく表示されました。
が、なぜなのかイマイチ納得ができておりません。

これでもうまくいきました。
Code:
{let tfb:TextFlowBox =  {TextFlowBox
                            horigin = "center",
                            paragraph-justify = "center",
                            color = "black",
                            font-size = 22pt,
                            font-style = "italic",
                            font-weight = "bold",
                            font-family = "MS Pゴシック",
                            text-preserve-whitespace? = true,
                            "こっから\n→ここまで"
                        }}


{tfb.clear}
{let v:Visual = {tfb.add "ここまで\n→こっから"}}
{value
    tfb
}


(09-07-2011, 09:23 AM)ashimo Wrote: addの戻り値が追加されたオブジェクトだからだとすれば、


Visual.addのHELPを参照すると、
Quote:目的: 子アイテムを Visual に追加します。
g: 追加されるアイテムです。g がこのオブジェクトへの追加に適したタイプではない場合、g は Visual のサブタイプをタイプとする適切な値に強制変換され、その結果が追加されます。
戻り値
追加された実際の値。追加された Visual のサブタイプになります。
オーバーライド
オブジェクトの追加方法を指定する必要のあるクラスによりオーバーライドされます。Visual.add の既定実装は、子オブジェクトをオブジェクトに追加できない旨を知らせる error を呼び出します。
このメソッドをオーバーライドするクラスは、Visual.clear もオーバーライドする必要があります。

とありますが、addメソッドの戻りを受けとらないと(ashimo様のソースであればvalueマクロ?)、
適切な値に強制変換されちゃう過程(恐らくサブタイプでなく Visual)
でオプションも消えちゃうよってことでしょうか???


Reply
09-08-2011, 01:21 PM, (This post was last modified: 09-08-2011, 01:38 PM by Yuhki.)
#4
RE: TextFlowBox内の文字列変更について
(09-08-2011, 10:03 AM)onyo Wrote: 適切な値に強制変換されちゃう過程(恐らくサブタイプでなく Visual)
でオプションも消えちゃうよってことでしょうか???
私も最初実行してびっくりしましたが上記の理由ではないようです。

理由としてはオブジェクトの各インスタンスは、グラフィック階層において 1 度だけ生成されるためです。
(ヘルプ:グラフィカル ユーザー インターフェイス>グラフィカル オブジェクト>グラフィック階層>グラフィック階層のオブジェクトのインスタンス 参照)
[addメソッドで返されるオブジェクト]=[tfbが内部でもつオブジェクト]=["ここまで\n→こっから"という文字列]であるため、
表示された際に、[addメソッドで返されるオブジェクト]として表示され、実はtfbは中身が表示されずに画面には
(上記ソースの場合は文字列の横に)存在しています。

下記ソースで試すとわかりやすいかもしれません。

Code:
{let tfb:TextFlowBox =  {TextFlowBox
                        border-color = "red", ||追加
                        border-width = 3pt,   ||追加
                        horigin = "center",
                        paragraph-justify = "center",
                        color = "black",
                        font-size = 22pt,
                        font-style = "italic",
                        font-weight = "bold",
                        font-family = "MS Pゴシック",
                        text-preserve-whitespace? = true,
                        "こっから\n→ここまで"
                    }}

{tfb.clear}
{tfb.add "ここまで\n→こっから"}
{value
tfb
}
Reply
09-08-2011, 01:53 PM,
#5
Shocked  RE: TextFlowBox内の文字列変更について
Yuhki様

当方、ashimo様の回答を読み違えてたみたいです。
addの戻りを表示してしまっていたのが原因ってことだったのですね。。。
わかりやすい解説有難う御座いました!

因みに、Yuhki様の、サンプルコードは私が一番初めに
なんでだーっ!とハマッていたのと全く同じやつです。
改めて見ると、なるほど、そういうことかと思いました。
Reply
09-08-2011, 06:20 PM, (This post was last modified: 09-08-2011, 06:24 PM by onyo.)
#6
RE: TextFlowBox内の文字列変更について
実は元々悩んでいたのは、CommandButton の改行を含むテキストラベルを
動的に変えるにあたってどうすればいいのか[Image: huh.gif]でした。

CommandButton.label 内では
text-preserve-whitespace? は有効ではないようですが
他に、簡潔な書き方がありますでしょうか?

Code:
{let hoge:String = "こっから→\nここまで"}
{define-proc public {en-n-chikan s:String}:any
    let sa:StringArray = {s.split split-chars = "\n"}
    let arg:Arguments = {Arguments}
    {for i:int = 0  below  sa.size do
        {arg.append sa[i]}
        {if sa.size == i + 1 then
            {break}
        }
        {arg.append {br}}
    }
    {return {text {splice arg}}}
}

|| 1.Labelで表示
{Label {TextFlowBox text-preserve-whitespace? = true, hoge}}

|| 2.Labelを CammndButton.label に設定
{CommandButton label = {Label {TextFlowBox text-preserve-whitespace? = true, hoge}}}

|| 3.\nの元Stringをそのまま CammndButton.label に設定
{CommandButton label = hoge}

|| 4.TextFlowBoxを CammndButton.label に設定
{CommandButton label = {TextFlowBox text-preserve-whitespace? = true, hoge}}

|| 5.{br}に置換して CammndButton.label に設定
{CommandButton label = {en-n-chikan hoge}}
Reply
09-08-2011, 07:01 PM,
#7
RE: TextFlowBox内の文字列変更について
(09-08-2011, 06:20 PM)onyo Wrote: CommandButton.label 内では
text-preserve-whitespace? は有効ではないようですが
他に、簡潔な書き方がありますでしょうか?


text-preserve-whitespace? が効かないのではなくて、CommandButton ではデフォルトで text-breakable?=false だからです。

Code:
{CommandButton
    label = "こっから→\nここまで",
    text-preserve-whitespace? = true,
    text-breakable? = true
}
または
{CommandButton
    label = {Label
                text-preserve-whitespace? = true,
                text-breakable? = true,
                "こっから→\nここまで"
            }
}

Reply
09-08-2011, 07:10 PM,
#8
RE: TextFlowBox内の文字列変更について
fukuta様

(09-08-2011, 07:01 PM)fukuta Wrote: text-preserve-whitespace? が効かないのではなくて、CommandButton ではデフォルトで text-breakable?=false だからです


text-breakable?を参照させて頂きました。
なるほど、ディフォルト false だったのですね。。。
有難う御座いました!
Reply

Forum Jump:


Users browsing this thread:
1 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('269')