Tipy a triky v Delphi, díl 103.

Dnešní díl nám přináší opět něco pro Windows XP. Tentokrát se naučíme použít "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.

Diskuze (12) Další článek: Microsoft má zaplatit další půl miliardy

Témata článku: Software, Windows, Programování, Díl, Strong, Trik, Krátká animace

Určitě si přečtěte


Aktuální číslo časopisu Computer

Test 6 odolných telefonů a 22 powerbank

Srovnání technologií QLED a OLED

Měřte své sportovní výkony

Sady pro chytrou domácnost