Jak na TaskBar Progress jinak?

vložil Jaro Beneš 8. května 2014 01:22

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.


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: ,

Praxe

Komentáře

10.5.2014 16:19:52 #

TLama

Copak, copak. Cenzura ? Nekdo nesnesl kritiku česko-english programování ?

TLama

11.5.2014 1:27:36 #

radekc

Ano, nesnesl jsem hulvátství a smazal jsem to.

radekc

12.5.2014 14:37:54 #

JaroB.

:)

a můžu za to já?

JaroB.

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS