ListBoxを上手く表示させるには

解決


カリスマパンチ  2008-05-26 18:49:27  No: 139775  IP: 192.*.*.*

データ処理中の進行状況をリストボックスに表示させたいと思っています。
以下のような記述で行うとすべての処理が終わったあとに表示されてしまい、
進行状況が分かりません。
リストボックスに追加するごとに表示を更新するにはどうしたらよいでしょうか?

Me.ListBox5.Items.Add("削除を行っています")
Call 削除
Me.ListBox5.Items.Add("削除が終了しました")
Me.ListBox5.Items.Add("削除を行っています")
Call 抽出
Me.ListBox5.Items.Add("削除が終了しました")

編集 削除
魔界の仮面弁士  2008-05-26 19:14:16  No: 139776  IP: 192.*.*.*

> リストボックスに追加するごとに表示を更新するにはどうしたらよいでしょうか?
更新しても、その後一瞬で次の処理が走るなら、
更新されているようには見えないでしょうね。

あるいは、削除 / 抽出というのが、時間がかかる処理なのであれば、
その処理を実行するのに忙しくて、更新が反映されなくなってしまうかと。


もしも削除 / 抽出というのが、時間がかかる処理なのであれば、
BackgroundWorker の利用を検討してみてください。

編集 削除
 2008-05-26 21:01:21  No: 139777  IP: 192.*.*.*

DoEventsを入れればいいような

Me.ListBox5.Items.Add("削除を行っています")
DoEvents
Call 削除
Me.ListBox5.Items.Add("削除が終了しました")
DoEvents
Me.ListBox5.Items.Add("削除を行っています")
DoEvents
Call 抽出
Me.ListBox5.Items.Add("削除が終了しました")
DoEvents

編集 削除
魔界の仮面弁士  2008-05-26 21:30:47  No: 139778  IP: 192.*.*.*

> DoEventsを入れればいいような

Application.DoEvents (あるいは My.Application.DoEvents ) のことですね。

副作用が大きいため(イベント再入の可能性など)、個人的には、できるだけ
使わない方が無難だと思いますが、それでも DoEvents を使うのであれば、
DoEvents 稼動中にフォームを閉じられたり、フォーム上のコントロールが
操作されてしまう事に備えて、対処コードを組み込んでおいて下さい。


なお、抽出や削除というのが、数秒以上の時間を要する処理の場合、
DoEvents でも対処しきれない可能性がありますので、その場合には
非同期処理にする事も検討しておいた方が良いかと思います。

編集 削除
 2008-05-27 00:13:24  No: 139779  IP: 192.*.*.*

> 副作用が大きいため(イベント再入の可能性など)、個人的には、できるだけ
> 使わない方が無難だと思います

浅知恵でした。でしゃばって申し訳ありませんでしたm(__)m

編集 削除
カリスマパンチ  2008-05-27 09:15:32  No: 139780  IP: 192.*.*.*

BackgroundWorker を使って問題を解決しました。
このBackgroundWorker ってものすごく使い勝手がいいですね。
勉強になりました。
ありがとうございます。

編集 削除