[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秒になったわけではありませんが、体感的に「ちょっと早い」と感じる効果はありました。






関連記事
[Delphi] フォームを閉じる時に入力チェックをしてエラーなら閉じない

[Delphi] 個人的 逆引き関数リファレンス

[Delphi]小ネタ備忘録

[Delphi]MySQLへの接続で失敗(未解決)

[Delphi] Indyのエラー関連