Delphi Programming / Object Pascal
[掲載 2018年10月20日] [更新 2018年10月20日] Delphi サンプルプログラム集 |
714_進捗状況の表示用コントロール |
動作確認等 |
Windows 7 U64(SP1) + Delphi 10.2.3 Community |
|
714_ProgressControl.zip [4,048 KB] 2018年10月20日版 (EXE 同梱) |
時間のかかる処理のプログレス表示またはアニメーション表示 |
時間のかかる処理の間,プログレスバーで進捗状況 (シンチョクジョウキョウ) を表示したり,アニメーション表示をする例です.
本ページのサンプルコードでは使用していませんが,一般的に,時間かかる処理は別のスレッドを使用するのが基本です. |
TProgressBar (プログレスバー) コンポーネントを使用して,処理の進行の程度 (進捗状況) を表示するサンプルです. |
|
図1
プログレスバーによる進捗状況の表示 |
リスト1
TProgressBar コンポーネントを使用する進捗状況の表示例 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
MMSystem;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ProgressBar1.Anchors := [akLeft, akTop, akRight];
end;
//=============================================================================
// プログレス表示のテスト
//
// usesにMMSystemが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LMaxTime : UInt64;
LTime : Cardinal;
LStartTime : Cardinal;
begin
LMaxTime := 3500;
LStartTime := TimeGetTime;
ProgressBar1.Max := LMaxTime;
//時間のかかる処理の代わりとしてのループ
while True do begin
LTime := timeGetTime - LStartTime;
if LTime > LMaxTime then break;
ProgressBar1.Position := LTime;
Application.ProcessMessages;
//これがないとCPU使用率が跳ね上がることがある
Sleep(1);
end;
end;
end.
02_TProgressBar コンポーネント - 進捗の割合を数値で表示 |
前項と同じく TProgressBar コンポーネントで進捗状況を表示しますが,TProgressBar の上下中央に進捗状態の割合をパーセントで表示する例です.
パーセントの数値は TLabel に表示します.実行時に TLabel の親 (Parent) を TProgressBar にして,表示位置を設定しています. |
|
図2
設計時の画面
- TLabel は TProgressBar には載らない
|
|
図3
プログレスバーによる進捗状況の表示
|
リスト2
TProgressBar コンポーネントを使用する進捗状況の表示例.進捗の割合を数値で表示 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
Button1: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
MMSystem;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
ProgressBar1.Anchors := [akLeft, akTop, akRight];
//進捗状況のテキスト表示用TLableの設定
Label1.Parent := ProgressBar1;
Label1.Align := alClient;
Label1.Alignment := taCenter;
Label1.Layout := tlCenter;
end;
//=============================================================================
// プログレス表示のテスト
// 進捗状況をパーセント表示
// 表示にはTLabelを使用
//
// usesにMMSystemが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LMaxTime : UInt64;
LTime : Cardinal;
LStartTime : Cardinal;
begin
LMaxTime := 3500;
LStartTime := TimeGetTime;
ProgressBar1.Max := LMaxTime;
//時間のかかる処理の代わりとしてのループ
while True do begin
LTime := timeGetTime - LStartTime;
if LTime > LMaxTime then break;
ProgressBar1.Position := LTime;
Label1.Caption := IntToStr(Trunc(LTime / LMaxTime * 100)) + ' %';
//表示を更新
Label1.Update;
Application.ProcessMessages;
//これがないとCPU使用率が跳ね上がることがある
Sleep(1);
end;
end;
end.
03_TActivityIndicator コンポーネント |
Delphi 10 Seattle で実装された TActivityIndicator (アクティビティインジケータ) コンポーネントを使用する例です.Windows 10 の起動時に表示される,グルグルと回転するように見えるアニメーションを描画します.
TActivityIndicator コンポーネントの表示サイズは 4 つだけです.IndicatorSize プロパティで設定します.Width, Height プロパティではサイズは設定できません.
|
|
図4
設計時の画面
- 選択中のコントロールが TActivityIndicator コンポーネント
|
|
図5
TActivityIndicator によるアニメーション表示 |
リスト3
TActivityIndicator コンポを使用して処理中にアニメーション表示 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
Vcl.WinXCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ActivityIndicator1: TActivityIndicator;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
MMSystem;
{$R *.dfm}
//=============================================================================
// TActivityIndicatorによるアニメーション表示
//
// usesにMMSystemが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LMaxTime : UInt64;
LTime : Cardinal;
LStartTime : Cardinal;
begin
LMaxTime := 10000;
LStartTime := TimeGetTime;
//アニメーション開始
ActivityIndicator1.Animate := True;
//時間のかかる処理の代わりとしてのループ
while True do begin
LTime := timeGetTime - LStartTime;
if LTime > LMaxTime then begin
//アニメーション終了
ActivityIndicator1.Animate := False;
break;
end;
Application.ProcessMessages;
//これがないとCPU使用率が跳ね上がることがある
Sleep(1);
end;
end;
end.
04_TActivityIndicator コンポーネント - 進捗の割合を数値で表示 |
前項と同じく TActivityIndicator コンポーネントを使用する例ですが,TActivityIndicator の上下中央に進捗状態の割合をパーセントで表示する例です.
パーセントの数値は TLabel に表示します.TActivityIndicator.ControlStyle に csAcceptsControls を含めると TLabel の親コントロールにすることができますが,アニメーションの描画の際にかなりチラつきます.そこで,TLabel を TActivityIndicator コンポーネントと同じサイズにして,同じ位置に配置して使用しています. |
|
図6
設計時の画面 |
|
図7
TActivityIndicator によるアニメーション表示
|
リスト4
TActivityIndicator コンポを使用して処理中にアニメーション表示.進捗の割合を数値で表示 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
Vcl.WinXCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
ActivityIndicator1: TActivityIndicator;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses
MMSystem;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
//
// TActivityIndicatorのControlStyleにcsAcceptsControlsを含めるとコンテナにでき
// TLabelを配置できるが,アニメーションの描画でかなりチラつく
// そこでTLabelをTActivityIndicatorと同じ位置とサイズで配置
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
//TActivityIndicatorの各種設定
ActivityIndicator1.IndicatorColor := aicBlack;
ActivityIndicator1.IndicatorSize := aisXLarge;
ActivityIndicator1.FrameDelay := 50;
//進捗状況のテキスト表示用TLableの設定
Label1.AutoSize := False;
Label1.Parent := ActivityIndicator1.Parent;
Label1.Left := ActivityIndicator1.Left;
Label1.Top := ActivityIndicator1.Top;
Label1.Width := ActivityIndicator1.Width;
Label1.Height := ActivityIndicator1.Height;
Label1.Alignment := taCenter;
Label1.Layout := tlCenter;
Label1.Visible := False;
end;
//=============================================================================
// TActivityIndicatorによるアニメーション表示
// 進捗状況をパーセント表示
// 表示にはTLabelを使用
//
// usesにMMSystemが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
LMaxTime : UInt64;
LTime : Cardinal;
LStartTime : Cardinal;
begin
LMaxTime := 10000;
LStartTime := TimeGetTime;
//アニメーション開始
ActivityIndicator1.IndicatorType := aitSectorRing;
ActivityIndicator1.Animate := True;
Label1.Visible := True;
//時間のかかる処理の代わりとしてのループ
while True do begin
LTime := timeGetTime - LStartTime;
if LTime > LMaxTime then begin
//アニメーション終了
Label1.Visible := False;
ActivityIndicator1.Animate := False;
break;
end;
//進捗状況をパーセント表示
Label1.Caption := IntToStr(Trunc(LTime / LMaxTime * 100)) + ' %';
Application.ProcessMessages;
//これがないとCPU使用率が跳ね上がることがある
Sleep(1);
end;
end;
//=============================================================================
// TActivityIndicatorによるアニメーション表示
// 進捗状況をパーセント表示
// 表示にはTLabelを使用
//
// usesにMMSystemが必要
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
LMaxTime : UInt64;
LTime : Cardinal;
LStartTime : Cardinal;
begin
LMaxTime := 10000;
LStartTime := TimeGetTime;
//アニメーション開始
ActivityIndicator1.IndicatorType := aitMomentumDots;
ActivityIndicator1.Animate := True;
Label1.Visible := True;
//時間のかかる処理の代わりとしてのループ
while True do begin
LTime := timeGetTime - LStartTime;
if LTime > LMaxTime then begin
//アニメーション終了
Label1.Visible := False;
ActivityIndicator1.Animate := False;
break;
end;
//進捗状況をパーセント表示
Label1.Caption := IntToStr(Trunc(LTime / LMaxTime * 100)) + ' %';
Application.ProcessMessages;
//これがないとCPU使用率が跳ね上がることがある
Sleep(1);
end;
end;
end.
05_TTaskbar コンポーネン ト - タスクバーにプログレス表示 |
TTaskbar コンポーネン トを使用すると,タスクバーに進捗状態をプログレス表示できます.以下の記事に実際のサンプルがあります.
TTaskbar コンポーネントは Delphi XE6 で実装されたコンポーネントです. |
|
図8
タスクバーにプログレス表示 |
|