Na základě příspěvku Komponenta TTaskBar pro VCL jsem zkusil vytvořit jednoduché řízení za použití funkčnosti starší unity uWin7Taskbar.pas, pocházející z projektu LameXP (není nejnovější a po neunicode verze Delphi bude asi potřeba ověřit správnost všech GUID, pro unicode verze od Delphi 2010 a výš používá interface dodávané Embarcaderem v jednotce ShlObj).
Protože program může být spuštěn na jakémkoliv OS Windows, pokud nemá explicitně určeno, pro jaké verze OS smí být spuštěn.
Zkusil jsem vytvořit jednoduchý mostík (rozumějme jednotku), aby aplikace fungovala jak na Windows Vista (nebo i XP), tak bez úprav zároveň i na Windows 7 a vyšších.
unit Bridge;
interface
uses
SysUtils, Forms;
procedure SetProgress(const celek, kus: Integer);
var
CanUseCB: Boolean = False; //může být v sekci implementation
implementation
uses
uWin7Taskbar, mainform;
procedure SetProgress(const celek, kus: Integer);
{-------------------------------------------------------------------------------
Procedure: SetProgress
Author: Jaro.Benes
Created: 2014.05.05
Arguments: const celek, kus: Integer
Result: None
Purpose: Umožní nastavit měřidlo na hlavním formu a pro Windows 7 a vyšší
také na buttonu taskbaru aplikace (asi jako WinRAR)
-------------------------------------------------------------------------------}
begin
//timhle se ridi taskbar, pro Vista a nizsi neni
if CanUseCB then
if SetTaskbarProgressState(tbpsNormal) then
if SetTaskbarProgressValue(kus, celek) then;
//tohle je meridlo na hlavnim formu
//protoze i starsi verze Windows to musi ukazovat
//je mozno ridit pro Windows 7 a vyssi
if frMain.Gauge1.MaxValue <> celek then frMain.Gauge1.MaxValue := celek;
//jen kdy ze hotovo
if kus = celek then
if CanUseCB then SetTaskbarProgressState(tbpsNone);
//nastaveni
frMain.Gauge1.Progress := kus;
//a videt je tehdy kdyz je mensi nez 100%
frMain.Gauge1.Visible := kus <> celek;
//tohle pro jistotu
Application.ProcessMessages;
end;
initialization
CanUseCB := False;
//if CheckWin32Version(6, 1) then //nebo taky, viz
if (Win32MajorVersion = 6) and (Win32MinorVersion >= 1) then //Win 7 a vyšší
CanUseCB := InitializeTaskbarAPI();
end.
Kód je jednoduchý, výkonná procedura SetProgress(), globální proměnná CanUseCB držící stav a hlavně v sekci initialization kód pro zjištění verze OS Windows a inicializace API taskbaru (pozor, inicializace se taky nemusí povést!).
A jak to použít?
Předpokladem je mít na hlavním formuláři (frMain jednotky mainform) měřidlo (Gauge1, ale může být i jiné, které zobrazuje nějaký průběh jako standardní a k němu je na Windows 7 a vyšších alternativní zobrazení měřidla v taskbaru (jména identifikátorů, hlavní formulář, název jeho jednotky a název měřidla hlavního formuláře je tedy nutno upravit podle aktuálního projektu).
Jednoduchý testovací kód, viz:
var
i: Integer;
begin
for i := 1 to 100 do
begin
Bridge.SetProgress(100, i);
Sleep(50);
end;
…
Přidal jsem Sleep(), aby se zobrazení kapku zpomalilo. Smysl jednotky Bridge je nabíledni, stačí ho přidat do uses další jednotky, která provádí nějakou měřitelnou operaci a pak zavolat SetProgress(maxgaugevalue, actualgaugevalue)
Určitě to lze ještě upravit, rozšířit, dle všech schopností API, a dále optimalizovat. Testoval jsem to na Delphi XE2, ale mělo by to fungovat i pro verze vyšší.
Doufám, že to pro inspiraci nebo jako jednoduchá ilustrace dobře poslouží.
Zdrojové kódy přiloženy.