ラベルコントロールでの改行後のスペース

[戻る]
たいちう 2002/06/07(金) 10:10:30
なんと、質問1番乗りです。

下記のソースでは、メッセージボックスだと予期したとおりに表示されますが、
ラベルの場合には、スペースが1つ吸収されてしまうようです。
正しい改行の仕方はどうするのでしょうか。

Private Sub Form_Load()
    Dim s As String
    s = "  1" & vbCrLf & "  2"
    MsgBox s
    Label1.Caption = s
End Sub

ついでに、Cだと、
for (i=1;i<=10;i++) 
    printf("%3d %5d\n", i, i*i);
と書く場合、
VBのFormatでは対応できないみたいですが。
1つのラベルに桁をそろえて表示したい場合には、
どのようなやり方がよいのでしょう?
データグリッドを使うべきなのかな。

たいちう 2002/06/07(金) 13:24:16
すみません。読み返したら、環境を書くのを忘れていました。

Win98 & VB6SP5 及び WinXP HomeEdition & VB6SP5 です。

べーちゃん 2002/06/08(土) 00:57:47
はじめまして、ベーちゃんです。

>下記のソースでは、メッセージボックスだと予期したとおりに表示されますが、
>ラベルの場合には、スペースが1つ吸収されてしまうようです。
>正しい改行の仕方はどうするのでしょうか。

どうやら改行時には先頭のスペースを無視するみたいですね。
逆にいうと

>    s = "  1" & vbCrLf & "  2"

としているところを

s = "  1" & vbCrLf & Space(1) & "  2"

として、改行の後ろに必ずスペースを挿入したらどうですか。

>for (i=1;i<=10;i++) 
>    printf("%3d %5d\n", i, i*i);
>と書く場合、

For i = 0 To 10
    Debug.Print Format(i, "@@@") & " " & Format(i * i, "@@@@@")
Next i

とすれば桁を揃えられるますよ。

たいちう 2002/06/08(土) 07:32:20
べーちゃん様

回答有り難うございます。

後半部分は納得です。@を使うのでしたか。
前半部分は1行目とそれ以降では、処理を分けるしかないのですかね。

今、自宅なので動作確認できないのですが、そのうち出社したら、
確認します。

たいちう 2002/06/09(日) 08:53:22
Format(i, "@@@")の方は、確認できました。ありがとうございました。

スペースの吸収については、どうしてそうなるのかがまだ疑問なので、
もうしばらく、解決のチェックはひかえさせてもらいます。

べーちゃん 2002/06/11(火) 03:58:53
たいちうさん、ベーちゃんです。

私はマイクロソフトの人間じゃないのでこのコメントは私の
予想以外ではないのですが、おそらく意図的に改行後の
スペースを抜いていると思います。

項目をもし、箇条的に縦に並べるのであれば本来は複数の
ラベルコントロールを並べるのが普通です。
ではどんなときにラベルコントロールで複数行を表示するかと
いえば、通常は長い文章を表示するときに使うのです。
そのようなときに文頭にスペースがくると単語の位置が
後ろにずれますよね(字下がり状態ですね)。
ラベルの先頭行は字上がりで、その下の行が字下がりでは
格好がよくないですよね。
ということでおそらくそのような理由でわざと行頭の
スペースは吸収するようになっているんだと思います。
(見当違いの回答かもしれませんが)

ただ、いずれにせよ簡単なプロパティで解決しないのであれば
プログラム側で吸収するしかないですよね。

たいちう 2002/06/11(火) 08:51:29
[[解決]]
べーちゃん様

解説ありがとうございます。
やっぱりプログラム側でスペースを入れるしかなさそうですね。

「うーんVBは使いにくい」と、未熟者がいうのは愚かなことと思い、
提供されたものをうまく使っていけるようになりたいです。

と、いうわけで解決をチェックさせてもらいます。
またよろしくお願いします。

べーちゃん 2002/06/12(水) 00:44:19
たいちうさん。

既に解決のチェックがついているのに引きずってしまって
すみません。

>「うーんVBは使いにくい」と、未熟者がいうのは愚かなことと思い、
>提供されたものをうまく使っていけるようになりたいです。

「かゆいところに手が届かない」のはある程度仕方のないことですね。
しかし、これを逆に考えるとラベルで複数行の文章を表示したとき
先頭がスペースなら文字列自体は変えずに表示のみ自動的にスペースを
取り除いて単語くれるなんて「親切なヤツ」と考えるのが正しいので
しょう(ホンマかいな)?
VBはとっつきやすさに特化しか開発環境ですので、本来の意図と
異なる使い方をしようとすると、いきなり面倒くさくなってしまう
のはいた仕方ないでしょう。VC++はその点何でもできるんだけれど
逆に全てを自分でやらなければならなくて、それはそれで大変ですけど。

ということで、コントロール関連で思った機能がなければ、
1.コントロールの不都合な部分の回避処理を自前で行う
2.コントロールを自作する
3.市販のコントロールを買う
というのが一般的なアプローチとなるでしょう。

がんばってください。

古いスレッドには追加発言できません。