ひょっとしたらすごく簡単なことなのかもしれませんが・・・
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}
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
}
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)
でオプションも消えちゃうよってことでしょうか???
(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
}
Yuhki様
当方、ashimo様の回答を読み違えてたみたいです。
addの戻りを表示してしまっていたのが原因ってことだったのですね。。。
わかりやすい解説有難う御座いました!
因みに、Yuhki様の、サンプルコードは私が一番初めに
なんでだーっ!とハマッていたのと全く同じやつです。
改めて見ると、なるほど、そういうことかと思いました。
実は元々悩んでいたのは、CommandButton の改行を含むテキストラベルを
動的に変えるにあたってどうすればいいのか
でした。
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}}
(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ここまで"
}
}
fukuta様
(09-08-2011, 07:01 PM)fukuta Wrote: [ -> ]text-preserve-whitespace? が効かないのではなくて、CommandButton ではデフォルトで text-breakable?=false だからです
text-breakable?を参照させて頂きました。
なるほど、ディフォルト false だったのですね。。。
有難う御座いました!