動的作成したラベル不可視化時のチラつき


タメ子  2007-12-19 14:19:33  No: 138445  IP: 192.*.*.*

WindowsXP VB2005

A()という構造体に

    Dim CONTROL as Label

が用意されていて、これを100個動的に用意します。
その際、フォームに順次追加していきます。

    Form.Controls.Add(A(i).CONTROL)  iはループカウンタ

今度はあるボタンが押されたら、作成したラベルコントロールを
画面上から消します。
そのとき、

    ' コントロールのレイアウト変更通知イベントの抑止
    Form.SuspendLayout()
    
    for i = 0 To 100 - 1 Step 1

        ' コントロールを不可視化する
        A(i).CONTROL.Visible = False

    Next i
    
    ' レイアウト変更通知イベント抑止の解除
  Form.ResumeLayout(False)

としましたが、画面は1つ1つコントロールを消すようにチラ
つきます。

もう少し細かく言いますと、この削除処理は、そのフォーム
ファイル内ではなく、別のモジュールファイルからPublicで
呼んでおり、Formは引数で渡って来るのですが、それが原因
でしょうか?
それともそもそも画面のチラつきを押さえる方法を間違えて
ますでしょうか?

コントロールを不可視化するのではなく、削除

    Form.Controls.Remove(A(i).CONTROL)

でも同じ結果でしたので、やはりチラつき防止策を間違えて
いるのでしょうか・・・

編集 削除
Blue  2007-12-19 16:36:09  No: 138446  IP: 192.*.*.*

参考
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1617356&SiteID=7

編集 削除
タメ子  2007-12-20 13:59:27  No: 138447  IP: 192.*.*.*

Blue様
ご返答ありがとうございます。
リンク先を読ませて頂きましたが、解決の手段とはなりませんでした。
私の技量ゆえなのかもしれませんが、ダブルバッファについては、
回答の中にある「コントロールの描画には、関係ありません」とのこと。
コントロールの描画(Visible操作など)でチラつきを取る、もしくは
抑える手段はないでしょうか?

編集 削除
見ざる聞かざる土居まさる  2007-12-20 20:46:38  No: 138448  IP: 192.*.*.*

自分の経験上ですけど原因と解決策として以下をあげておきます。
1:1フォームにおけるコントロール数が多すぎるのではないでしょうか
2:動的にコントロールを作成していること。
3:パソコンが低性能

3はともかくとして、
1はフォームを分けることにより1フォームあたりのコントロール数
を減らす。2は最初からコントロールを作成する(めんどくさいかも
しれないけど1と組み合わせればなんとかなるのではないでしょうか

編集 削除
タメ子  2007-12-27 14:03:22  No: 138449  IP: 192.*.*.*

見ざる聞かざる土居まさる様

ご返答ありがとうございます。

コントロール数は確かに多いのですが、
フォームを分けることはできません。
ここでの例として100個となっていますが、
テストで30個くらいでも気になる程度で
現象がでました。

動的というのも仕様です。もともとはベタで
コントロールを作っていましたが、お客様の
要望でデータベースのデータから動的に作成
するという仕様を頂きました。

また現在使用していますPCは
        Pentium(R) 4 3.20GHz
        メモリ 1GB
です。
これ以上のものは望めません・・・。

編集 削除
見ざる聞かざる土居まさる  2008-01-12 00:46:04  No: 138450  IP: 192.*.*.*

以下のようにしてみればどうでしょうか
方法1
1:動的コントロールを作成しているフォームのvisible=falseにする。
2:別のフォームをvisible=trueにする
    (画面を描画中ですしばらくお待ち下さいを表示)
3:1のフォームの動的コントロールを設定
4:2のフォームのvisible=falseにする。
5:1のフォームのvisible=trueにする。

方法2
ボタン数(=コントロール表示パターン数)だけフォーム又は
ユーザーコントロールを作成しvisibleプロパティで切り替える

以上でちらつきは抑えられますが、
方法1は画面の表示動作は遅くなります。
方法2は動的にコントロール作成する必要がなくなるので表示は
遅くなることはないのですが、生産性が悪くなります。



動的にコントロール作成は仕様とはいえ、あまりおすすめできません。

編集 削除