ラベル配列の再描画方法


cphero_one  2016-08-11 14:32:18  No: 143506  IP: 192.*.*.*

Windows7 VB2010でパネルの上にプログラムからラベルの配列を設定して
グラフ描画をさせているのですが、初回は問題なく描画しますが、
データーを更新させても反映されません、何か手続きが抜けていると
思いますのでご教示お願いいたします。


#Region "10分流量積算グラフ描画"
    Private Sub WriteGrif_10()
        Dim j As Integer
        Dim myBuff As Integer
        Dim myY_Scale As Single
        j = 0
        WriteGrif_cls()
        myY_Scale = 660 / 550
        For i = 1 To 144
            myBuff = Val(glDM(6100 + i)) * myY_Scale
            glG_Fuel(i).size = New Size(6, myBuff)
            glG_Fuel(i).location = New Point(j, 660 - myBuff) '------棒グラフの高さ
            glG_Fuel(i).autosize = False
            glG_Fuel(i).text = ""
            glG_Fuel(i).backcolor = Color.Cyan
            glG_Fuel(i).visible = True
            Me.PictureBox1.Controls.Add(glG_Fuel(i)) '----Panelにラベルを載せる
            j = j + 9
        Next
        Me.PictureBox1.BringToFront() '----最前面に表示
        Me.PictureBox1.Visible = True


    End Sub
#End Region

編集 削除
魔界の仮面弁士  2016-09-30 10:01:03  No: 143507  IP: 192.*.*.*

> パネルの上にプログラムからラベルの配列を設定して 
glG_Fuel() というのが「Label の配列」なのだとしたら、
「Panel の上」ではなく「PictureBox の上」に
配置されているように見えます。


しかしグラフ表示なら、Label のサイズで表現するよりも、
Grapchis クラスに描画処理を記述するか、あるいは
グラフ描画のための Chart コントロールを使った方が良い気がします。


> Dim j As Integer 
j += 9 な処理が組み込まれていますが、一度も使われていないような…?


> glG_Fuel(i).size = New Size(6, myBuff) 
glG_Fuel(i) のインスタンスは、どのタイミングで生成されていますか?

あらかじめ(Form の Load などで)生成されているものを
使い回しているのだとしたら、AutoSize 指定や Controls.Add は
最初の一回だけで良く、何度もやりなおす必要は無いはずです。


それとも WriteGrif_cls 等で、
毎回、glG_Fuel(i) = New Label() などとして
新規に作り直しているのでしょうか。

だとしたら、それ以前に表示していた Label を
PictureBox 上から取り除いた上で、Dispose していますか?
古い物を取り除かない場合は、処理を繰り返すたびに
どんどん、Label の数が増える事になりますよね。


> データーを更新させても反映されません、
・データ更新後に、グラフ描画処理が呼ばれているかどうか、確認されましたか?

・PictureBox1.Controls.Count で返されるコントロール数は、想定どおりですか?

・Label の座標やサイズは想定どおりですか?

・同じ座標に複数の Label が重なっていませんか? 重なって良いのなら、
  そのうちのどちらが手前になるべきか、正しく管理されていますか?

・イベント処理(Button の Click など)の中に、長いループ処理を
  記述していないでしょうか。処理がアイドル状態にならないと、
  コントロールの操作結果は画面に反映されませんので、多くの場合、
  操作結果が表示されるのは、イベント処理が End Sub を通過した後です。

編集 削除