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 を実行
  • タスクバーの表示はメインフォームの Form1
図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
タスクバーに進行状況を表示

リスト8
タスクバーにプログレス表示するサンプル
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 コンポーネントのサンプルがある場所