Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 103. - "Nekonečný" ukazatel průběhu

Jan Šindelář - 13.8.2003

"Nekonečný" ukazatel průběhu

Říkáte si, co je to asi zase za nesmysl? Jistě, obvyklý ukazatel průběhu nám znázorňuje v procentech, kolik už je hotovo z nějaké déle trvající činnosti, kterou počítač vykonává. Existují ale takové činnosti, jejichž délku předem neznáme a ani ji nedokážeme přibližně vypočítat, protože neznáme celkovou "sumu" úkolů. Přesto však chceme uživateli nějak dát najevo, že program pracuje a že se nezhroutil. A k tomu právě můžeme využít to, co jsem nazval možná trošku nejasně nekonečným ukazatelem průběhu. Určitě ho dobře znáte a jedna z jeho forem se zobrazuje například při samotném startu Windows XP během úvodního loga. Vizuálně se jedná o klasický ukazatel průběhu, v jehož úzkém proužku neustále dokola putuje krátký vyplněný úsek.

Tolik tedy úvodem a teď si povíme, jak na to. Dnešní postup bude poněkud netradiční, protože si vlastně vyrobíme velmi jednoduchou komponentu, která je odvozena z klasického ProgressBaru. Kód této komponenty bude vypadat takto:


unit MarqueeProgressBar;

 interface

 uses
   SysUtils, Windows, Classes, Controls, ComCtrls, Messages;

 type
   TMarqueeProgressBar = class(TProgressBar)
   private
     FActive: Boolean;
     FAnimationSpeed: Integer;
     procedure SetActive(const Value: Boolean);
     procedure SetAnimationSpeed(const Value: Integer);
     procedure UpdateProgressBar;
   protected
     procedure CreateParams(var Params: TCreateParams); override;
   public
     constructor Create(AOwner: TComponent); override;
   published
     property Active: Boolean read FActive write SetActive;
     property AnimationSpeed: Integer read FAnimationSpeed write SetAnimationSpeed;
   end;

 const
   PBS_MARQUEE  = $08;
   PBM_SETMARQUEE = WM_USER + 10;

 procedure Register;

 implementation

 procedure Register;
 begin
   RegisterComponents(`Samples`, [TMarqueeProgressBar]);
 end;

 constructor TMarqueeProgressBar.Create(AOwner: TComponent);
 begin
   inherited;
   FAnimationSpeed := 60;
 end;

 procedure TMarqueeProgressBar.CreateParams(var Params: TCreateParams);
 begin
   inherited;
   Params.Style := Params.Style or PBS_MARQUEE;
 end;

 procedure TMarqueeProgressBar.SetActive(const Value: Boolean);
 begin
   FActive := Value;
   UpdateProgressBar;
 end;

 procedure TMarqueeProgressBar.SetAnimationSpeed(const Value: Integer);
 begin
   FAnimationSpeed := Value;
   UpdateProgressBar;
 end;

 procedure TMarqueeProgressBar.UpdateProgressBar;
 begin
   if FActive then
     SendMessage(Self.Handle, PBM_SETMARQUEE, 1, FAnimationSpeed)
   else
     SendMessage(Self.Handle, PBM_SETMARQUEE, 0, 0);
 end;

 end.


Standardní ProgressBar je rozšířen o několik málo parametrů navíc. Nejdůležitější je vlastnost Active, kterou se spouští celá animace a dále AnimationSpeed, kterou nastavujeme její rychlost. Po instalaci se komponenta objeví na záložce Samples, což si můžete samozřejmě libovolně změnit.

Pokud vše proběhlo v pořádku, stačí teď jen otevřít nový projekt, umístit naši novou komponentu na formulář a případně upravit její vlastnosti a vzhled podle potřeby. To ovšem není vše. Aby celá věc fungovala, potřebujeme přidat i podporu nových stylů Windows XP. V Delphi 7 je to snadné, stačí jen na formulář přidat komponentu XPManifest ze záložky Win32. Ve starších verzích musíte přidat manifest sami a jak to udělat, to už jsme si kdysi důkladně předváděli.

Tento vylepšený ProgressBar bude fungovat i v případě, že máte vizuální styly Windows XP vypnuté, ale ve starších verzích Windows bohužel ne.