過去の桐井戸端BBS (桐ver.9)
20848 フォームのテキストボックスを文字列の長さによって変化させたい 小林 宗之 2003/06/13-13:32
フォームのテキストボックスを文字列長さによって変化させたいのですが、フォントも自動的に変えるものとします。

問題になるのは、計算では右端文字が次行に折り返すはずなのに一行目に収まってしまうのです。
計算式 &行字数=#切り捨て((&max幅-&sp[&F])/&F,0)  /*全角文字数*/
 ここで、&max幅:表示幅 , &sp[&F]:余白分 , &F:フォントの大きさ
例えば、表示幅 120pt , 高さ 28pt の場合、
フォント 12pt &sp[12]=3.9pt &行字数=9      OK
     11pt &sp[11]=1.4pt &行字数=10 NG
と計算されるのですが、実際には全角で11文字表示されてしまいます。
なお余白分はフォーム上でいろいろ試した結果、フォントの大きさによって異なることが解り、それを用いています。

どなたか教えて戴けるよう、よろしくお願いいたします。
20849 Re:テキストボックスでのフォントと表示幅について教えてください 悲しげ 2003/06/13-15:13
記事番号20848へのコメント
どもっ、小林さん
お答えではありませんが、ところで当該テキストオブジェクトに
設定してある「フォント名」は何ですか?
(多分関係ないと思いますが、ついでにスタイルや太さも)
20850 Re:テキストボックスでのフォントと表示幅について教えてください 小林 宗之 2003/06/13-15:58
記事番号20849へのコメント
悲しげさん


(継承)MS ゴシック
スタイルは標準、デフォルト設定は 9pt です。
20871 Re:テキストボックスでのフォントと表示幅について教えてください うにん 2003/06/14-23:46
記事番号20848へのコメント
余白は「開始位置X」で指定できます。

余白を0にしてみるとわかりますが、11ptのフォントだからといって、
幅が常に11pt(または半角なら5.5pt)あるというわけではないようです。
(文字の左の空白部分がなくなります)

元々画面は普通96dpiなので、3で割り切れないサイズでは誤差が出るのでは
ないでしょうか?(サイズ÷72×96ピクセルになりますので)

20875 Re:テキストボックスでのフォントと表示幅について教えてください うにん 2003/06/15-10:02
記事番号20871へのコメント
>元々画面は普通96dpiなので、3で割り切れないサイズでは誤差が出るのでは
>ないでしょうか?(サイズ÷72×96ピクセルになりますので)

120pt=160ピクセルで、11pt=14.666ピクセルなので多分切り捨てられて14ピクセル。
160÷14=11あまり6、となってるように見えますね。
試しに誤差がなくなるようにWindowsの画面設定で72dpiにしてみたら、
120ptで余白0のテキスト領域には全角10文字(半角21文字)になりましたよ。

20892 Re:テキストボックスでのフォントと表示幅について教えてください 小林 宗之 2003/06/16-10:06
記事番号20875へのコメント
すみませんうにんさん、それぞれの数値の意味がよく解らないのでゆっくりと教えてください。
>>元々画面は普通96dpiなので、3で割り切れないサイズでは誤差が出るのでは
>>ないでしょうか?(サイズ÷72×96ピクセルになりますので)
>
>120pt=160ピクセルで、11pt=14.666ピクセルなので多分切り捨てられて14ピクセル。
>160÷14=11あまり6、となってるように見えますね。
>試しに誤差がなくなるようにWindowsの画面設定で72dpiにしてみたら、
>120ptで余白0のテキスト領域には全角10文字(半角21文字)になりましたよ。
>

Windowsの画面設定で96dpiを72dpiにはどうやるのですか?
サイズ÷72×96ピクセルになりますので・・・・・?
120pt=160ピクセル・・・・・・?
余白0・・・に設定するには?
それぞれの関係はどうなっているのでしょうか?

20897 Re:テキストボックスでのフォントと表示幅について教えてください うにん 2003/06/16-12:52
記事番号20892へのコメント
>Windowsの画面設定で96dpiを72dpiにはどうやるのですか?

デスクトップのあいてるところで右クリックしてプロパティを選び、
「設定」の「詳細」で画面のフォントサイズを指定するところがあります。
「小さいフォント」が96dpiで「大きいフォント」が120dpiです。
その他を選ぶと任意に指定できるので、72dpiに設定して再起動します。

(文字が「すごく」小さくなります。Windowsのバージョンによって
多少表現が違うかも)

>サイズ÷72×96ピクセルになりますので・・・・・?
「サイズ÷72×96」ピクセル と書けばよかったかな?

画面の設定が96dpiの場合、ptで指定した「サイズ」は画面上では3分の4倍の

「ピクセル」(ドット)数で表示されるという意味です。

>120pt=160ピクセル・・・・・・?

なので、120ptの領域は160個の点で表示されるということです。

12ptフォントは実質16ドットフォントということになります。

>余白0・・・に設定するには?
あ、書式メニューの「定義画面の設定」で「詳細プロパティを使用する」に
なっていないとでてこないようです。


オブジェクトの属性の「テキスト」タブの「横の位置」「縦の位置」のボタン群の
右端に余白を設定するボタンがあります。

20902 ありがとうございます。ようやく解りました。 小林 宗之 2003/06/16-15:06
記事番号20897へのコメント
うにんさん、お世話をお掛けしました。
いろいろやってみてようやく解りました。
どうもありがとうございます。

72dpiでは「すごく」小さくなり、文字がつぶれてしまいました。

>120ptの領域は160個の点で表示されるということです。
>12ptフォントは実質16ドットフォントということになります。

の部分が、改めて考えてみるとあたりまえな事なのに解りませんでした。
計算式を、
  枠サイズドット フォントサイズドット としてみたら
&字数=#切り捨て(#切り捨て(#PointToDot(&幅),0)/#切り捨て(#PointToDot(&F),0),0)
で、11ptの時に11個となりました。
20905 やっぱり旨くいかない。 小林 宗之 2003/06/16-17:22
記事番号20902へのコメント
いろいろやってみてようやく解ったと思いきや、やっぱり旨くいきません。
フォントを変えると
>計算式を、
>  枠サイズドット フォントサイズドット としてみたら
>&字数=#切り捨て(#切り捨て(#PointToDot(&幅),0)/#切り捨て(#PointToDot(&F),0),0)
>で、11ptの時に11個となりました。
では合わなくなります。
半角の時も合わない場合が発生します。

うにんさんの
>余白を0にしてみるとわかりますが、11ptのフォントだからといって、幅が
>常に11pt(または半角なら5.5pt)あるというわけではないようです。
>(文字の左の空白部分がなくなります)
と言っておられたように、計算不可能なんでしょうか。
20908 Re:やっぱり旨くいかない。 うにん 2003/06/16-20:41
記事番号20905へのコメント
>>&字数=#切り捨て(#切り捨て(#PointToDot(&幅),0)/#切り捨て(#PointToDot(&F),0),0)
>>で、11ptの時に11個となりました。
>では合わなくなります。
>半角の時も合わない場合が発生します。

基本的にMSゴシックとかの等幅フォントであれば上記の式で合うと思うのですが…
半角の場合は切り捨てる前に÷2でいいはずです。

>うにんさんの
>>余白を0にしてみるとわかりますが、11ptのフォントだからといって、幅が
>>常に11pt(または半角なら5.5pt)あるというわけではないようです。
>>(文字の左の空白部分がなくなります)

これはWindowsのフォントというものがそういうものなんだと思います。
#PointToDot はすっかり忘れてましたが、HELPを見ると余白は2ptが標準のようですね。
(薄い字で0cmになっているのに)確かにそのくらいに見えます。

>と言っておられたように、計算不可能なんでしょうか。

欧文フォントだとサイズは高さに対してしか意味がないのでほとんど無理でしょうけど…

20914 等幅フォントと言えども・・・ 小林 宗之 2003/06/17-11:24
記事番号20908へのコメント
うにんさん、どうも。
実験してみた結果を報告します。

&max幅=可変 , &sp[8]=5 , &sp[9]=3.9 , &sp[10]=2.7 , &sp[11]=3 , &sp[12]=3.9 , &sp[14]=1.4
とした場合、
&行桁数=#切り捨て((#切り捨て(#PointToDot(&max幅),0)-#切り捨て(#PointToDot(&sp[&F]),0))/#四捨五入
(#PointToDot(&F)/2,0),0)
&行字数=#切り捨て(#切り捨て(#PointToDot(&max幅-&sp[&F]),0)/#切り捨て(#PointToDot(&F),0),0)
の式でなんとか実用になりそうです。
いろいろと教えていただいて大変勉強になりました。有難うございます。

戻る