[Delphi] 時間のかかる処理は砂時計・ListBoxの高速化
トップページへ
目次
1 時間のかかる処理は砂時計カーソルにしたい
2 ListBoxの高速化
時間のかかる処理は砂時計カーソルにしたい
処理が長くなりそうな時、マウスカーソルが「砂時計カーソル」になった方が良い場合は、次のように記述します。
個人的にはこれをコピペして使いまわしているので、詳細が知りたい方は「英語の楽天市場で探す ・ amazonで探す))">公式サイト」をご覧下さい。
基本的には「メイン処理」に「実行したい内容」を記述するだけです。try…finally…endの意味は、メインの処理が正常に実行できてもできなくても処理が終わったら、マウスのカーソルは以前の状態に戻しているだけです。
var Save_Cursor: TCursor; begin Save_Cursor := Screen.Cursor; Screen.Cursor := crHourglass; //砂時計カーソルを表示する try メインの処理 finally Screen.Cursor := Save_Cursor; end;
Screen.Cursorについては日本版の公式サイトをご覧下さい。
※注意点は、Delphiのエディタの自動補完により「finally … end;」が勝手に追加され、コンパイルエラーになりやすい点だけです。
2022年8月12日 追記
ListBoxリストボックスの高速化
通常、ListBoxに文字列を追加する場合、
ListBox1.Items.Add
だけで済みますが、その処理の前と後に
ListBox1.Items.BeginUpdate;
ListBox1.Items.EndUpdate;
をそれぞれ明記すると「見た目、体感」で早くなる場合があります。
ただし100件、500件程度では、あるいは高性能のPCをお使いでは「早くなったと感じない」可能性がありますので、あらかじめご了承下さい。
公式には「変更処理の監視」等が書かれていますが、要するに「BeginUpdateを明記したら、必ずEndUpdateを明記して下さい」と書いているだけです。また、高速化の事には一切触れていません。
条件と概要
・ループ処理
・ListBox.Items.Add のように「ListBoxのItemsに変更を加える処理」がある時だけ使えます。Items以外では明記しても意味がないと思います。
・データの件数が多い時だけ発揮します。
・必ず早くなるとは限りません。
・フォームのListBoxへの描画を止め、最後に一気に描画させているだけです。
(※個人的に「画面への描画は件数が多いと時間がかかる」と思っています。)
・BeginUpdateを明記したらEndUpdateも明記して下さい。EndUpdateを明記しないと、画面に結果が表示されない可能性があります。
・もしBeginUpdate/EndUpdateを使わない通常の処理の場合は、ListBox.Items.Addを実行するたびに描画します。
サンプル
ListBox1.Items.BeginUpdate; for i := 0 to FileList.Count -1 do begin ListBox1.Items.Add(Filelist.Strings[i]); end; ListBox1.Items.EndUpdate;
これを「さらに複雑化させた処理」の約300件で試した場合で、あり・なしの差は「コンマ数秒」で 2秒→1秒になったわけではありませんが、体感的に「ちょっと早い」と感じる効果はありました。