バイト数の場合、指定より -1 バイトで返す場合もありますし。。
]]>その計算式ですが、
元のテキストが全角のみか半角のみなら、文字数で指定できますが、
混在しているとバイト数で指定しなければなりませんね。
バイト数の場合、
最初から一文字ずつバイト数を加えて行き、
指定バイト数になったらそこまでのテキストを返す。
Whileで関数で出来そうですが、今の私の使用環境が古いのでその関数で検証できません。
LetとEvaluateの再起式ではできまししたので一応提示しておきます。
Let ( [ $cnt = 0 ;
$ln = Length ( テキスト ) ;
$txt = "" ;
$bt = 0 ;
$les = " Case ( $cnt > $ln ; テキスト ; $bt > 指定バイト数 ; $txt & ""..."" ;
Let ( [ $cnt = $cnt + 1 ;
$txt = Left ( テキスト ; $cnt ) ;
$bt = Length ( Filter ( $txt ; RomanZenkaku ( KanaZenkaku ( $txt ) ) ) & $txt ) ] ;
Evaluate ( $les ) ) ) " ] ;
Evaluate ( $les ) )
少し実験してみたところ、フィールドからあふれてるときはフィールド枠が拡張されているのを検知する数式が、一時使えなくなってたと思ってたんですが19v4では使えるようです。
こんな感じで、レイアウト定義上のフィールド高さと、編集中の実際に表示されてるフィールド高さを比較して、onObjectExitのトリガスクリプトなどで文字列が隠れることを検知します。
Let ( [
b = FieldBounds ( "" ; Get(レイアウト名) ; "showDotsAfterOverflowedText::t" ) ;
h = MiddleWords ( b ; 4 ; 1 ) - MiddleWords ( b ; 2 ; 1 )
] ;
GetLayoutObjectAttribute ( "f1" ; "height" ) <> h
)
問題の1つは、「デザイン関数」はフィールド名で指定するので、同じフィールドを複数配置すると動作が不安定になります(取得する値がフィールドの配置順に依存)
もう1つは、1つのフィールドが複数回表示されるリスト形式では、...の表示を行ごとにオンオフするので設定が複雑になるでしょう。
そこまで手間をかける価値があるかどうか...
フィールド高さを2行目の上部が少し見えるようにしておくと、簡単にテキストがはみ出してることがわかりますが、ゆとりのあるレイアウトでしか使えない方法ですね。
]]>