質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

5回答

1218閲覧

C#のfor文について教えてください

niconicodryyy

総合スコア36

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/05/08 01:12

C#

1code1 2using System.Windows.Forms; 3 4class Sample1 5{ 6 public static void Main() 7 { 8 Form fm = new Form(); 9 fm.Text = "サンプル"; 10 fm.Width = 250; fm.Height = 150; 11 12 Label lb = new Label(); 13 lb.Width = fm.Width; lb.Height = fm.Height; 14 15 for (int i = 1; i<= 10; i++) 16 { 17 if (i % 2 == 0) 18 lb.Text += i + "を表示します\n"; 19 } 20 21 lb.Parent = fm; 22 Application.Run(fm); 23 } 24}

上記のコードは書籍やさしいC#第2版より抜粋しております。
現在、上記の書籍を元に学習中なのですがわからない部分があるのでご教授を
お願い致します。

上記のコードを実行すると
2を表示します
4を表示します
6を表示します
8を表示します
10を表示します
と表示されますが
ラベルを作成した後の

C#

1code2 2lb.Width = fm.Width; lb.Height = fm.Height;

の一文を削除すると
2を表示します
4を表示します
の2つしか表示されません。
code2はラベルの幅や高さを設定するもので繰り返し文には関係ないと思うのですが
何故code2を削除すると上手く表示されなくなるのでしょうか?

*Visual Studio 2017のコードファイルで上記のコードを実行しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/08 01:16

結果の画面キャプチャなど添付されたほうが状況も把握しやすくなるので、質問に追記願います。
guest

回答5

0

ベストアンサー

問題の下記コードは

C#

1lb.Width = fm.Width; 2lb.Height = fm.Height;

ラベルの幅、高さをフォームと同じにするということです。
これをコメントアウトするということは、ラベルの大きさは規定値が使用されます。
下記画像は分かりやすくラベルの枠を表示したものです。

コメントアウトしていないもの
コメントアウト前

コメントアウトしたもの
コメントアウト後

6を表示します
8を表示します
10を表示します
この部分は実際には追加されていますが、見えない領域となっています。

投稿2019/05/08 01:23

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私もmts10806さんのおっしゃる通り、「結果の画面キャプチャなど添付されたほうが状況も把握しやすくなる」(mts10806さんの修正依頼より) と思います。

ただし、今回はなんとなくイメージができそうなので書いてみます。


今回はfor文は関係ありません

むしろ、Labelクラスのオブジェクトが問題になっています。

C#に限らず、ほとんどの言語やライブラリでのGUI ( ボタンとかラベルとか ) は、

自動的に大きくなったり、小さくなったりすることはありません

Qtで言えば Layout(クラスの)オブジェクトとかが自動的に計算して...

っていうことも確かにありますが、それはLayoutとかがやっているだけです。

コントロール( C#での名称はわかりません ) は自動的に広がったりしません。

2mLの容器に500mLの水を注ごうとするが入らない...
「なんで入らないんだよ!?」と怒るようなもの。

そりゃ、入らないでしょ...ってなりませんか?
500mL以上の容器( バケツでもいいし、ペットボトルとかでもいい ) に入れるでしょ?

それと一緒です。

質問にあるコードは動かしていませんが、

質問者さんが提示した結果を例に出すと、

2を表示します 4を表示します

までは、ラベルのデフォルトの大きさに入るようです。

次の

6を表示します

は多分表示自体はされています。
しかし、ラベルの大きさが足りないので、見切れている状態です。

どうしても動的に、行数に合わせて大きさを変えたいのであれば、

C#

1 for (int i = 1; i<= 10; i++) 2 { 3 if (i % 2 == 0){ 4 lb.Height += FONTSIZE; 5 lb.Text += i + "を表示します\n"; 6 } 7 }

といった具合に、ラベルのサイズを徐々に大きくしていく...みたいにすればいいです。

ただし、上にある FONTSIZE っていうのは「文字の大きさ」です。
ふつうは 20 とか 30 とか そういう風に数字が入りますが、
フォントサイズはフォントや言語とかそういうのに左右される可能性があるので伏字的に書いています。
もしフォントサイズ = 20 なら 20 と置き換えてください。

たぶん、Label.calcFontSize とかみたいなメソッドが用意されているはずなので、それの戻り値を設定するとか。
(メソッド名は適当。C#は使っていないので。)

投稿2019/05/08 01:35

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2019/05/08 03:50

低評価した方、すみません。 後学のために理由も書いていただけないでしょうか? 低評価だけだと修正もできないので...
guest

0

そのcode2ってのはラベルの大きさを設定してるコードなので、
単にラベルの大きさがその表示をおさめきれないというだけかと

投稿2019/05/08 01:16

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Code 2 があるときは Label の幅・高さが Form に設定した値 250 x 150 となるところ、Code 2 を削除するとデフォルト(小さくなるはず) になって文字列を全部表示しきれないからでは?

for を疑っているようですが、そこは今回の話とは直接関係ないです。

投稿2019/05/08 01:23

編集2019/05/08 01:27
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

デフォルトサイズにおさまりきらない範囲は表示しないから、ですね。
そこはwidthやheightの値を色々いじってみて検証すると良いです。

場合によりますが、AutoSizeプロパティをtrueにしておくのもありかと。

つまりタイトルにあるfor文自体は関係がないということです。

投稿2019/05/08 01:22

編集2019/05/08 01:23
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問