Delphi Programming / Object Pascal

[掲載 2014年06月04日] [更新 2019年01月21日] Delphi サンプルプログラム集 |
| 712_タスクバーへの追加・削除とプログレス表示 |
| 動作確認等 |
Windows 7 U64(SP1) + Delphi XE(UP1) Pro
Windows 7 U64(SP1) * Delphi XE6 Pro |
 |
712_Taskbar_Progress.zip [4,374 KB] 2019年01月21日版 (EXE 同梱) |
タスクバーへのボタン (アイコン) 表示関係のサンプルです。
ITaskbarList インターフェイスを使用します。このインターフェイスは、Delphi 2010 で実装されています。Delphi 2009 以前で使用するには、インターフェイスの実装が必要です。
もし 1 つは、タスクバーに進行状況用のプログレスを表示するサンプルです。この機能は Windows 7 で実装されました。Windows 7 では、以下の MSDN の記事のように、これ以外にもタスクバー関係のインターフェイスが実装されています。 |
タスクバーへのフォームのアイコン表示関係のサンプルが、以下のサンプルにもあります。
タスクバーの表示の制御は、アプリケーションウィンドウの操作が関係します。Delphi 2007 ではアプリケーションウィンドウが扱いやすくなっています。
Delphi 2007 より前で、このアプリケーションウィンドウに対応するには、[... 秘密のウインドウに対する対処] の記事が参考になります。 |
[備考 1]
Delphi 2009 以前で、本ページで使用している ITaskbarList, ITaskbarList3 インターフェイスを使用するには、ShObjidl.idl という IDL ファイルからタイプライブラリを作成し、タイプライブラリを取り込みます。タイプライブラリの取り込みで作成したユニットから、それらのインターフェイス部分だけのコードを取り出して利用することになります。ただし、修正が必要な場合もあります。
ShObjidl.idl は、Windows SDK 8.1 で提供されています。以下の記事を参考にしてください。
|
[備考 2]
上の文章で、インターフェイスのコードを追加すれば利用可能と書きましたが、Delphi 2006 以前では [秘密のウィンドウ] に対処するコードが必要です。
ただし、Delphi 2006 以前のプロジェクトを、そのまま Delphi 2007 以降で使用する場合は、やはり [秘密のウィンドウ] に対処したコードが必要です。
Delphi 2007 以降で、新規にプロジェクトを作成する場合は、秘密のウィンドウに対処したコードは必要ありません。
Delphi 2007 以降と、それより前では、プロジェクトのソースコードに違いがあります。以下の記事を参考にしてください。
|
| 01_任意のフォームをタスクバーに表示 - ITaskbarList |
複数の子フォームを持つアプリケーションで、任意のフォームのボタンをタスクバーに表示するための参考サンプルです。
本サンプルでは、3 つの子フォームを作成します。これらは、自動生成から除外して、実行時に生成します。タスクバーには、メインフォームと、現在アクティブなフォームを表示します。
ITaskbarList インターフェイスのインスタンスをメインフォームのユニットで生成し、子フォームの OnActivate イベントと OnDeactivate イベントで、タスクバーへの表示を制御します。
ITaskbarList インターフェイスのコードは、Delphi 2010 には実装されています。Delphi 2009 以前ではインターフェイスのコードを追加しないと使用できません。また、Delphi 2006 以前では [秘密のウインドウ] に対処したコードも必要です。 |
 |
図1
設計時のメインフォームと子フォーム |
下図が実行時の画面です。ボタンをクリックすると、子フォームを表示します。その子フォームがアクティブになると、メインフォームとは別に、子フォームのボタンがタスクバーに表示されます。
別の子フォームがアクティブなると、その子フォームがタスクバーに表示され、非アクティブになった子フォームは、タスクバーから削除されます。 |
 |
図2
アプリ起動直後
|
 |
図3
子フォームを表示
- 表示した子フォームのアイコンがタスクバーに表示される
|
 |
図4
アクティブな子フォームを変更
- メインフォームと、アクティブな子フォームだけがタスクバーに表示される
|
| タスクバーのサムネイル画像は、メインフォームとアクティブな子フォームがグループ表示となっています。 |
 |
図5
タスクバーのサムネイル画像 |
リスト1
メインフォームとは別に、子フォームのアイコンをタスクバーに表示する |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ShlObj, ComObj;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
FrmTaskBarList : ITaskbarList;
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3, Unit4;
{$R *.dfm}
//=============================================================================
// 任意のフォームのボタンをタスクバーに表示
// 子フォームでITaskbarListインターフェイスを使用
// メインフォームは常にタスクバーに表示
//
// フォーム生成時の処理
// ITaskbarListインターフェイスの生成
// ITaskbarListの使用には、usesにShlObjが必要
// CreateComObjectの使用には、usesにComObjが必要
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
FrmTaskBarList := CreateComObject(CLSID_TaskbarList) as ITaskBarList;
end;
//=============================================================================
// フォーム破棄時の処理
// ITaskbarListインターフェイスを解放
//=============================================================================
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FrmTaskBarList) then FrmTaskBarList := nil;
end;
//=============================================================================
// Form2を生成して表示
// Form2は自動生成から除外している
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.Left := Self.Left + 100;
Form2.Top := Self.Top + 30;
Form2.Show;
end;
//=============================================================================
// Form3を生成して表示
// Form3は自動生成から除外している
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
Form3 := TForm3.Create(Self);
Form3.Left := Self.Left + 130;
Form3.Top := Self.Top + 80;
Form3.Show;
end;
//=============================================================================
// Form4を生成して表示
// Form4は自動生成から除外している
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
Form4 := TForm4.Create(Self);
Form4.Left := Self.Left + 160;
Form4.Top := Self.Top + 130;
Form4.Show;
end;
end.
リスト2
子フォームのコード。他の子フォームのコードも同じ
このコード内でタスクバーへの表示を制御する |
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
//=============================================================================
// フォームを閉じる時の処理
// このフォームは、自動生成から除外しているので自身を解放
//=============================================================================
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
//=============================================================================
// OnActivateイベント処理
// タスクバーに追加して、そのタスクバーのボタンをアクティブに
//=============================================================================
procedure TForm2.FormActivate(Sender: TObject);
begin
if Form1.FrmTaskBarList <> nil then begin
Form1.FrmTaskBarList.AddTab(Self.Handle);
Form1.FrmTaskBarList.ActivateTab(Self.Handle);
end;
end;
//=============================================================================
// OnDeactivateイベント処理
// タスクバーから消去
//=============================================================================
procedure TForm2.FormDeactivate(Sender: TObject);
begin
if Form1.FrmTaskBarList <> nil then begin
Form1.FrmTaskBarList.DeleteTab(Self.Handle);
end;
end;
end.
| 02_アクティブなフォームだけをタスクバーに表示 - ITaskbarList |
前項のサンプルと同じように、複数の子フォームを持つアプリケーションの例です。
本サンプルでは、メインフォームと子フォームも含めて、現在アクティブなフォームだけをタスクバーに表示します。
前項のサンプルと違うのは、子フォームに書いてある、タスクバーへの表示制御のコードを、メインフォームにも追加しただけです。
ITaskbarList インターフェイスのコードは、Delphi 2010 には実装されています。Delphi 2009 以前ではインターフェイスのコードを追加しないと使用できません。また、Delphi 2006 以前では [秘密のウインドウ] に対処したコードも必要です。 |
 |
図6
設計時のメインフォームと子フォーム |
その前に、複数のフォームがあるアプリケーションの動作を確認しておくことにします。
下図がその結果です。
複数のフォームを持つアプリケーションは、子フォームを表示しても、タスクバーに表示されるのはメインフォームだけです。もちろん、タスクバーのサムネイル画像はメインフォームです。 |
 |
図7
実行して、子フォームを表示
- タスクバーには、メインフォームのボタンだけが表示される
|
 |
図8
タスクバーのサムネイル
- 子フォームがアクティブでも、メインフォームのサムネイル
|
下図が、本サンプルでの実行結果です。
現在アクティブなフォームだけしか、タスクバーに表示しません。また、サムネイルも、現在アクティブなフォームの画像となります。 |
 |
図9
子フォームを表示
- 表示した子フォームがタスクバーに表示される
- ここでは、Form3
- メインフォームはタスクバーに表示されない
|
 |
図10
タスクバーのサムネイル画像
|
リスト3
現在アクティブなフォームだけをタスクバーに表示するサンプル
子フォームのコードは、前項のサンプルと同じ |
implementation
uses Unit2, Unit3, Unit4;
{$R *.dfm}
//=============================================================================
// アクティブなフォームだけをタスクバーに表示
// 子フォームでもITaskbarListインターフェイスを使用
//
// フォーム生成時の処理
// ITaskbarListインターフェイスの生成
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
FrmTaskBarList := CreateComObject(CLSID_TaskbarList) as ITaskBarList;
end;
//=============================================================================
// フォーム破棄時の処理
// ITaskbarListインターフェイスを解放
//=============================================================================
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FrmTaskBarList) then FrmTaskBarList := nil;
end;
//=============================================================================
// OnActivateイベント処理
// タスクバーに追加して、そのタスクバーのボタンをアクティブに
//=============================================================================
procedure TForm1.FormActivate(Sender: TObject);
begin
if FrmTaskBarList <> nil then begin
FrmTaskBarList.AddTab(Self.Handle);
FrmTaskBarList.ActivateTab(Self.Handle);
end;
end;
//=============================================================================
// OnDeactivateイベント処理
// タスクバーから消去
//=============================================================================
procedure TForm1.FormDeactivate(Sender: TObject);
begin
if FrmTaskBarList <> nil then begin
FrmTaskBarList.DeleteTab(Self.Handle);
end;
end;
//=============================================================================
// Form2を生成して表示
// Form2は自動生成から除外している
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.Left := Self.Left + 100;
Form2.Top := Self.Top + 30;
Form2.Show;
end;
//=============================================================================
// Form3を生成して表示
// Form3は自動生成から除外している
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
Form3 := TForm3.Create(Self);
Form3.Left := Self.Left + 130;
Form3.Top := Self.Top + 80;
Form3.Show;
end;
//=============================================================================
// Form4を生成して表示
// Form4は自動生成から除外している
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
Form4 := TForm4.Create(Self);
Form4.Left := Self.Left + 160;
Form4.Top := Self.Top + 130;
Form4.Show;
end;
| 03_メインフォームを非表示にして子フォームを表示 - ITaskbarList |
子フォームを表示する時にメインフォームを非表示にすると、タスクバーにはそのプログラム関係のアイコンは表示されません。そのような状態になると、実際にそのアプリケーションが起動しているかをタスクバーでは確認できなくなってしまいます。
前項のように、アクティブなフォームのアイコンを表示するようにすれば、子フォームのアイコンをタスクバーに表示することができます。その例です。
当然ですが、子フォームを閉じる時には、メインフォームを表示するようにします。 |
[備考 1]
Delphi 2007 よりも前のバージョンで作成した EXE は、タスクバーにメインフォームのアイコンではなく、アプリケーションのアイコンを表示します。したがって、メインフォームを非表示にして子フォームを表示してもタスクバーにアイコンが表示された状態になります。新規作成のプロジェクトでの表示は Project1 です。
Delphi 2007 以降でも、Application.MainFormOnTaskbar の値が False の時は同じです。 |
[備考 2]
アプリケーションのアイコンは、[プロジェクト] [オプション] の [アプリケーション] で設定するアイコンのことです。フォームのアイコンは、TForm のオブジェクト・インスペクタの Icon プロパティで設定するアイコンのことです。フォームのアイコンが設定されていない場合、一般的にはアプリケーション (プロジェクト) のアイコンが使われます。 |
 |
図11
作成した EXE を実行
|
 |
図12
子フォームを表示
- メインフォームを非表示
- タスクバーの表示は子フォームである Form2
|
リスト4
子フォームを表示する時のメインフォームのコード
前項のサンプルに追加したのは Hide だけ |
//=============================================================================
// Form2を生成して表示
// Form2は自動生成から除外している
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.Left := Self.Left + 100;
Form2.Top := Self.Top + 30;
Form2.Show;
// このフォーム(メインフォーム)を非表示)
Hide;
end;
| 前項のサンプルの子フォームの OnClose イベントにメインフォームを表示するコードを追加します。メインフォームを表示しないとアプリケーションを終了することができなくなってしまいます。 |
リスト5
子フォームの OnClose イベントのコードでメインフォームを表示する |
//=============================================================================
// フォームを閉じる時の処理
// このフォームは、自動生成から除外しているので自身を解放
//=============================================================================
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
// メインフォームを表示
Form1.Show;
end;
| 04_メインフォームを非表示にして子フォームを表示 - WndParent |
|
子フォームを実行時に生成するのであれば、前項のサンプルで使用している ITaskbarList を使用しなくても、メインフォームを非表示にして子フォームを表示した時に子フォームのアイコンをタスクバーに表示することができます。
そのためには、メインフォームを非表示にしてから子フォームを生成して表示します。そして、子フォームが生成される時に実行される CreateParams メソッドで、その子フォームの親をデスクトップのウィンドウにします。
|
リスト6
メインフォームのコード
子フォームを表示する前 (子フォームを生成する前) にメインフォームを非表示にする |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
protected
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3, Unit4;
{$R *.dfm}
//=============================================================================
// Form2を生成して表示
// Form2は自動生成から除外している
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
// このフォーム(メインフォーム)を非表示)
Hide;
Form2 := TForm2.Create(Self);
Form2.Left := Self.Left + 100;
Form2.Top := Self.Top + 30;
Form2.Show;
end;
//=============================================================================
// Form3を生成して表示
// Form3は自動生成から除外している
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
// このフォーム(メインフォーム)を非表示)
Hide;
Form3 := TForm3.Create(Self);
Form3.Left := Self.Left + 130;
Form3.Top := Self.Top + 80;
Form3.Show;
end;
//=============================================================================
// Form4を生成して表示
// Form4は自動生成から除外している
//=============================================================================
procedure TForm1.Button3Click(Sender: TObject);
begin
// このフォーム(メインフォーム)を非表示)
Hide;
Form4 := TForm4.Create(Self);
Form4.Left := Self.Left + 160;
Form4.Top := Self.Top + 130;
Form4.Show;
end;
end.
| 子フォームが Form2 の時は、子フォームのコードを例えば以下のようにします。 |
リスト7
子フォームのコード。子フォームを実行時に生成する場合に有効な方法 |
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
protected
procedure CreateParams(var Params: TCreateParams); override;
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
//=============================================================================
// CreateParams メソッド処理
//=============================================================================
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
//このフォームの親をDesktopとする
//タスクバーにForm1にこのフォームのアイコンが表示される
if not Form1.Visible then begin
Params.WndParent := GetDesktopWindow;
end;
end;
//=============================================================================
// フォームを閉じる時の処理
// このフォームは、自動生成から除外しているので自身を解放
//=============================================================================
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
// メインフォームを表示
Form1.Show;
end;
end.
| 05_タスクバーでプログレス表示 - ITaskbarList3 |
タスクバーにプログレス表示するサンプルです。この機能は Windows 7 以降で有効となります。
ITaskbarList3 インターフェイスの機能を使用します。
ITaskbarList3 インターフェイスのコードは、Delphi 2010 には実装されています。Delphi 2009 以前ではインターフェイスのコードを追加しないと使用できません。また、Delphi 2006 以前では [秘密のウインドウ] に対処したコードも必要です。 |
 |
図13
設計時画面 |
実行画面です。
SetProgressState 関数の引数の値によって、プログレスの色等が変わります。 |
 |
図14
タスクバーに進行状況を表示 |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ShlObj, ComObj;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
TaskBarList3 : ITaskbarList3;
end;
var
Form1: TForm1;
implementation
uses MMSystem;
{$R *.dfm}
//=============================================================================
// フォーム生成時の処理
// ITaskbarListインターフェイスの生成して、それからITaskbarList3を生成
// ITaskbarList3はDelphi2010で実装されている
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
TaskBarList : ITaskbarList;
begin
//ローカル変数は不定なので念のため初期化
TaskBarList := nil;
//Windows 7以上なら実行
if not CheckWin32Version(6, 1) then exit;
TaskBarList := CreateComObject(CLSID_TaskbarList) as ITaskBarList;
if TaskBarList = nil then exit;
//IUnknownインターフェイスの派生インターフェイスはQueryInterfaceが使用可能
if TaskBarList.QueryInterface(IID_ITaskbarList3, TaskBarList3) =S_OK then begin
//ITaskBarList3のインターフェイスのインスタンス(TaskBarList3)取得成功
end else begin
//ITaskBarList3のインターフェイスのインスタンス(TaskBarList3)取得失敗
end;
TaskBarList := nil;
end;
//=============================================================================
// フォーム破棄時の処理
// ITaskbarList3インターフェイスを解放
//=============================================================================
procedure TForm1.FormDestroy(Sender: TObject);
begin
if TaskBarList3 <> nil then TaskBarList3 := nil;
end;
//=============================================================================
// タスクバーにプログレスを表示
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
MaxTime : UInt64;
aTime : UInt64;
StartTime : Cardinal;
begin
if TaskBarList3 = nil then exit;
MaxTime := 5000;
StartTime := TimeGetTime;
TaskBarList3.SetProgressState(Handle, TBPF_NORMAL);
//何かの処理の代わりとしてのループ
while True do begin
aTime := timeGetTime - StartTime;
if aTime > MaxTime then break;
TaskBarList3.SetProgressValue(Handle, aTime, MaxTime);
Application.ProcessMessages;
Sleep(1);
end;
TaskBarList3.SetProgressState(Handle, TBPF_NOPROGRESS);
end;
end.
ITaskbarList3 インターフェイスの継承関係は次のようになっています。
前項のサンプルで使用した ITaskbarList を継承したインターフェイスとなっています。 |
CLSID_ITaskbarList: TGUID...
....
ITaskbarList = interface(IUnknown)
ITaskbarList2 = interface(ITaskbarList)
ITaskbarList3 = interface(ITaskbarList2)
ITaskbarList4 = interface(ITaskbarList3)
したがって、上のコードでは、QueryInterface 関数を使用しましたが、次のように、Supports 関数を使用してもインターフェイスのインスタンスを取得することができます。
Supports 関数は、内部で QueryInterface 関数を実行しています。 |
procedure TForm1.FormCreate(Sender: TObject);
var
TaskBarList : ITaskbarList;
begin
//ローカル変数は不定なので念のため初期化
TaskBarList := nil;
//Windows 7以上なら実行
if not CheckWin32Version(6, 1) then exit;
TaskBarList := CreateComObject(CLSID_TaskbarList) as ITaskBarList;
if TaskBarList = nil then exit;
if Supports(TaskbarList, IID_ITaskbarList3, TaskbarList3) then begin
//ITaskBarList3のインターフェイスのインスタンス(TaskBarList3)取得成功
end else begin
//ITaskBarList3のインターフェイスのインスタンス(TaskBarList3)取得失敗
end;
TaskBarList := nil;
end;
| また、ITaskbarList インターフェイスのインスタンスを生成しなくても、CoCreateInstance 関数を使用して次のように ITaskbarList3 のインスタンスを取得することもできます。 |
procedure TForm1.FormCreate(Sender: TObject);
begin
//Windows 7以上なら実行
if not CheckWin32Version(6, 1) then exit;
//CoCreateInstanceとCLSCTX_ALLの使用には、usesにActiveXが必要
if Succeeded(CoCreateInstance(CLSID_TaskbarList,
nil,
CLSCTX_ALL,
IID_ITaskbarList3,
TaskBarList3)) then begin
//ITaskBarList3のインターフェイスのインスタンス(TaskBarList3)取得成功
end else begin
//ITaskBarList3のインターフェイスのインスタンス(TaskBarList3)取得失敗
end;
end;
| 06_タスクバーでプログレス表示 - TTaskbar コンポーネント |
前項と同じく、タスクバーにプログレス表示するサンプルです。この機能は Windows 7 以降で有効となります。
Delphi XE6 では、タスクバーを操作するための TTaskbar コンポーネントが追加されました。このコンポーネントを使用した例です。 |
 |
図15
設計時画面 |
 |
図16
実行画面 |
リスト9
タスクバーにプログレス表示するサンプル
Delphi XE6 で実装された TTaskbar コンポーネントを使用する例 |
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
System.Win.TaskbarCore, Vcl.Taskbar, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Taskbar1: TTaskbar;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses MMSystem;
{$R *.dfm}
//=============================================================================
// タスクバーにプログレス表示
// Delphi XE6で実装されたTTaskBarコンポーネントを使用
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
MaxTime : UInt64;
aTime : Cardinal;
StartTime : Cardinal;
begin
//Windows 7以上なら実行
if not CheckWin32Version(6, 1) then exit;
MaxTime := 7000;
StartTime := TimeGetTime;
Taskbar1.ProgressMaxValue := MaxTime;
Taskbar1.ProgressState := TTaskBarProgressState.Normal;
//何かの処理の代わりとしてのループ
while True do begin
aTime := timeGetTime - StartTime;
if aTime > MaxTime then break;
Taskbar1.ProgressValue := aTime;
Application.ProcessMessages;
Sleep(1);
end;
Taskbar1.ProgressValue := 0;
end;
end.
Delphi XE6 に、TTaskbar コンポーネントのサンプルがあります。
場所は、下図のように、[Samples] フォルダの [VCL] の [Taskbar] フォルダ内です。 |
 |
図17
[スタート] から、サンプルのフォルダを開く |
 |
図18
TTaskbar コンポーネントのサンプルがある場所 |
|