Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】プログレスバーの描画制御

今回は処理の進捗状況を表示する
プログレスバーの描画を制御するプログラミングテクニックをご紹介いたします。

 

通常、WindowsのVCLアプリケーションでプログレスバーで進捗状況を表示する場合、
TProgressBarコンポーネントを使用します。

このTProgressBarコンポーネントはPositionプロパティの値で進捗表示を更新することができます。
これを利用すると繰り返し処理する内容の進捗状況をプログレスバーで表示することができます。

<例)TProgressBarの制御例>

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin;
  ProgressBar1.Position := 0;
  for i := 1 to 100 do
  begin
    // 処理ロジック;
    ProgressBar1.Position := ProgressBar1.Position + 1;
    Application.ProcessMessages;
    ProgressBar1.Update;
  end;
end;

処理中にプログレスバーの描画を促すために、
Application.ProcessMessagesをセットで実行することで制御することがポイントです。

ただし、処理後にTProgressBarを非表示(Visible := False)にすると
プログラムによっては、Windows上で非表示が優先されて描画が途切れる場合もあります。

そうした場合は、次のように別スレッドで非表示にすることで描画をスムーズに制御できます。

<例)Visibleの非表示を制御>

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin;

  ProgressBar1.Position := 0;
  for i := 1 to 100 do
  begin
    処理ロジック;
    ProgressBar1.Position := ProgressBar1.Position + 1;
    Application.ProcessMessages;
    ProgressBar1.Update;
  end;

  // 非表示は別スレッドで実行する
  TThread.CreateAnonymousThread(
  procedure()
  begin
    Sleep(500);  // 描画を待つ時間
    ProgressBar1.Visible := False;
  end).Start;
end;

もちろんスレッドではなくTTimerなどのコンポーネントで制御することも可能です。

また、他にもTProgressBarでは以下のようなプロパティも活用できます。

  • MaxMin
    プログレスバーの上限値・下限値を変更できます。
    Maxの値を処理レコード件数に設定するなど柔軟なコーディングが可能になります。
    (初期値はMax=100・Min=0)
     
  • State
    Windowsのデフォルト処理のように、プログレスバーの色を指定できます。
    pbsNormal=緑pbsPaused=黄色pbsError=赤
     
  • Orientation
    初期値のpbVerticalだと横向きのバーになりますが、
    pbHorizontalに設定すると縦向きになります。

 

プログレスバーの表示はアプリケーションの処理状況を分かりやすくユーザーへ表示できる
機能ですので、是非ご活用ください。

 

(ミガロ.情報マガジン「MIGARO News!!」Vol.193 2016年12月号より)