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)
でも同じ結果でしたので、やはりチラつき防止策を間違えて
いるのでしょうか・・・
参考
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1617356&SiteID=7
Blue様
ご返答ありがとうございます。
リンク先を読ませて頂きましたが、解決の手段とはなりませんでした。
私の技量ゆえなのかもしれませんが、ダブルバッファについては、
回答の中にある「コントロールの描画には、関係ありません」とのこと。
コントロールの描画(Visible操作など)でチラつきを取る、もしくは
抑える手段はないでしょうか?
自分の経験上ですけど原因と解決策として以下をあげておきます。
1:1フォームにおけるコントロール数が多すぎるのではないでしょうか
2:動的にコントロールを作成していること。
3:パソコンが低性能
3はともかくとして、
1はフォームを分けることにより1フォームあたりのコントロール数
を減らす。2は最初からコントロールを作成する(めんどくさいかも
しれないけど1と組み合わせればなんとかなるのではないでしょうか
見ざる聞かざる土居まさる様
ご返答ありがとうございます。
コントロール数は確かに多いのですが、
フォームを分けることはできません。
ここでの例として100個となっていますが、
テストで30個くらいでも気になる程度で
現象がでました。
動的というのも仕様です。もともとはベタで
コントロールを作っていましたが、お客様の
要望でデータベースのデータから動的に作成
するという仕様を頂きました。
また現在使用していますPCは
Pentium(R) 4 3.20GHz
メモリ 1GB
です。
これ以上のものは望めません・・・。
以下のようにしてみればどうでしょうか
方法1
1:動的コントロールを作成しているフォームのvisible=falseにする。
2:別のフォームをvisible=trueにする
(画面を描画中ですしばらくお待ち下さいを表示)
3:1のフォームの動的コントロールを設定
4:2のフォームのvisible=falseにする。
5:1のフォームのvisible=trueにする。
方法2
ボタン数(=コントロール表示パターン数)だけフォーム又は
ユーザーコントロールを作成しvisibleプロパティで切り替える
以上でちらつきは抑えられますが、
方法1は画面の表示動作は遅くなります。
方法2は動的にコントロール作成する必要がなくなるので表示は
遅くなることはないのですが、生産性が悪くなります。
動的にコントロール作成は仕様とはいえ、あまりおすすめできません。