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


タメ子  2007-12-19 23:19:33  No: 138445

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-20 01:36:09  No: 138446

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


タメ子  2007-12-20 22:59:27  No: 138447

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


見ざる聞かざる土居まさる  2007-12-21 05:46:38  No: 138448

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

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


タメ子  2007-12-27 23:03:22  No: 138449

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

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

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

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

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


見ざる聞かざる土居まさる  2008-01-12 09:46:04  No: 138450

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加