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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

6503閲覧

VB.net ラベルの動的生成について

退会済みユーザー

退会済みユーザー

総合スコア0

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/06/27 06:57

編集2021/06/27 07:52

本当にお久しぶりです reaです
現在、ラベルの動的生成処理を作成しており
下記にて15個のラベルを3×5で生成しているのですが、
少しでも処理が軽くなるようにしたいです。(常に動的生成させたい為)
下記のソースで調整できる箇所がございましたら、ご指摘いただけますと幸いです。

また、下記のソースですが、For i= のループでも
やはり変わらないでしょうか。。
ご指摘いただけますと幸いです。

※下記のソースにてコントロールのクリア処理が抜けておりますが、
生成前にコントロールのRemove処理とDispose処理は必ず行っております。

<開発環境>
Visual Studio 2017

<ターゲットフレームワーク>
.NET Framework 3.5

<アプリケーションの種類>
Windows フォームアプリケーション

※動的生成を行うことの経緯ですが、現在はテストなので固定で15個ラベルを必ず生成するように
しておりますが、本来は[1~15]の間で、後続の処理を行った後に都度可変致します。
また、表示列が減る場合5個以下または10個以下の場合には
列を表示しないようにしたい為、動的に行っております。

VB.net

1 2'- 変数 3 Dim Test_Label() As Label '- 生成ラベル(15で固定) 4 Dim Width As Integer = 0 '- 縦位置 5 Dim Hight As Integer = 2 '- 横位置 6 Dim idx As Integer = 0 '- Index 7 8 '- New 9 Test_Label = New Label(15) {} 10 11 For Each d In Test_Label 12 13 '- 縦 14 If idx = 5 Or idx = 10 Then 15 Hight += 36 / VGA 16 End If 17 18 '- 横 19 Select Case idx 20 Case 0, 5, 10 : Width = 3 21 Case 1, 6, 11 : Width = 97 22 Case 2, 7, 12 : Width = 191 23 Case 3, 8, 13 : Width = 285 24 Case 4, 9, 14 : Width = 379 25 End Select 26 27 '- Property 28 d = New Label With { 29 .Name = "Label_" & idx, 30 .Size = New System.Drawing.Size(95, 37), 31 .BackColor = Color.DarkGreen, 32 .ForeColor = Color.White, 33 .Font = New System.Drawing.Font("MS ゴシック", 24), 34 .Location = New Point(Width, Hight), 35 .Text = "T_" & idx.ToString 36 } 37 '- コントロールの追加 38 Me.Pnl_Test.Controls.Add(d) 39 '- Index +1 40 idx += 1 41 Next 42

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/27 07:06

ラベルって何のラベルですか? 開発環境は書けないのでしょうか? 実際にアプリの時間がかかることが問題で、そこがボトルネックなのですか?
退会済みユーザー

退会済みユーザー

2021/06/27 07:29 編集

ラベルの種類と開発環境の記載漏れ、大変失礼いたしました。 動的生成しているラベルですが、標準で存在するForms.Labelとなります。 開発環境はVisual Studio 2017 です。 質問のラベル生成以外にもTextBox等の動的生成を行う為、 少しでも処理を軽くできる箇所がないかご質問致しました。
gentaro

2021/06/27 07:26

処理を軽くしたいのなら、現在どの程度の時間がかかっているのかを計測するなりして、それと比較した目標値を提示してはどうか。 また、質問文では「少しでも処理が軽くなるようにしたい」と書きながら、コメントでは「少しでもメモリの使用率を抑えたく」と述べているが、どっちを主眼において質問しているのかわからない。(メモリを潤沢に使って処理を軽くする方法はどうなの、とか)
退会済みユーザー

退会済みユーザー

2021/06/27 07:29 編集

ご指摘ありがとうございます。 「処理を軽くしたい」が主題となります。 混乱させてしまい大変申し訳ございません。 追記の内容を修正します。
YAmaGNZ

2021/06/27 07:33

まずは動的に生成する必要が本当にあるのかといったところだと思います。 事前に作って表示を切り替えるだけにするとか、そもそも使いまわせるのかなど考慮した結果が生成するなんですかね?
退会済みユーザー

退会済みユーザー

2021/06/27 07:33

WinForms アプリの Label コントロールということで良いのですよね? Core ではなくて .NET Framework ということで良いのですか? そのバージョンを書いてください。ここは「質問への追記・修正の依頼」の場所なので、初期画面では閉じているので見ない人もいますので、追加情報は質問欄を編集して追記願います。
退会済みユーザー

退会済みユーザー

2021/06/27 07:38

>>YAmaGNZさん 動的に生成することの可否ですが、 質問内容に動的生成する経緯を追加いたします。 ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/06/27 07:39

時間がかかることの対応や使用メモリの削減が目的ではないようですが、なのに「処理を軽く」とはどういうことでしょう? 処理時間やメモリ消費に特に問題なく、今のコードで期待通り動いているなら、余計なことはしないのが良いと思うのですが。
退会済みユーザー

退会済みユーザー

2021/06/27 07:40

>>SurferOnWwwさん .NET Frameworkになります。 質問内容に環境を追記いたします。 ご指摘ありがとうございます!
退会済みユーザー

退会済みユーザー

2021/06/27 07:44 編集

単純に軽くしたいってふわっと言われても困るんですが。 現在どこでどの程度時間掛かってるけど、このくらいにしたいとか具体的な目標値みたいなのは無いんですか?そもそも、どこで処理時間掛かってるかとか時間きちんと測りました?
YAmaGNZ

2021/06/27 07:56

追記の説明を読む限りではMaxの数を最初に作っておいて、表示・非表示の切り替えだけでいけそうに思えます。
退会済みユーザー

退会済みユーザー

2021/06/27 08:00

>>YAmagGNZさん ご指摘の通り、表示数の可変はあれど、 最大値は15で固定なので初回に作っておけば、都度作る必要はなくVisibleのTrueとFalseで 問題ないと気づきました。。。 ご指摘ありがとうございます!
退会済みユーザー

退会済みユーザー

2021/06/27 08:03 編集

コントロール多いときの一番の処理のボトルネックって描画処理になると思うんですが、あの回答で本当に解決したんですか?(15くらいだと、どのみち問題になるほどの速度じゃないだろうけど)
gentaro

2021/06/27 08:04

結局「軽くしたい」ってのは何だったんだ?という疑問だけが残った。
退会済みユーザー

退会済みユーザー

2021/06/27 08:10

実際は特に問題が発生してるでもなく、ソースレビューして欲しいだけとかそんな感じなのかな。
退会済みユーザー

退会済みユーザー

2021/06/27 08:13

謎の高速退会
退会済みユーザー

退会済みユーザー

2021/06/27 08:52

もっとスマートにコーディングする方法はないのかと聞いてもらうと話が早かったと思いますけど・・・
gentaro

2021/06/27 09:12

お久しぶりとか書いて顕示欲がある割にあっさり退会してしまうのか…。
guest

回答1

0

ベストアンサー

生成するブツの個数がきまっててその中身も決まってるなら、それぞれのパラメータをテーブル(定数)で定義しといて、ループで生成するってのが早いんではないかと

#そもそもLabelのテーブル リストにすりゃいいやんってのはそのとおり

投稿2021/06/27 07:49

編集2021/06/27 07:51
y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2021/06/27 07:57

最大値が15で決まっていますので、 初回に生成しておけばあとはVisibleのTrue False で解決できる為、 都度、生成する必要はないことに気づきました。。。 ご回答いただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問