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

Tipy a triky v Delphi, díl 1. - Bublinková nápověda; Blikání ikony běžící aplikace na hlavním panelu; Priorita aplikace

Jan Šindelář - 25.7.2001

Skrytá třída TApplication, která je vždy automaticky přidána do každé aplikace a je jakýmsi "prostředníkem" mezi aplikací a Windows, na první pohled pro začínajícího uživatele nic nenabízí a mnozí o její existenci ani netuší. Pokud vytvoříte novou aplikaci a otevřete si její projektový soubor (koncovka .DPR), zpravidla uvidíte něco podobného tomuto:

program Project1;
uses
  Forms,
  Unit1 in `Unit1.pas` {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Zde vidíme pouhé tři řádky kódu, kde se třída TApplication vyskytuje, a pokud s Delphi začínáte, je to na dlouho i jediné místo, kde ji uvidíte (pokud si ovšem vůbec projektový soubor otevřete). Jelikož se nejedná o "klasickou" komponentu v pravém slova smyslu, nenajdete ji na paletě komponent a nemusíte ji umisťovat na žádný formulář. Proto mnozí zapomínají na některé zajímavé vlastnosti, které nám nabízí.

Po tomto krátkém úvodu si tedy rovnou ukážeme pár příkladů.

Bublinková nápověda – Hint

Všichni uživatelé Windows tuto nápovědu jistě dobře znají – ukážete kurzorem na nějaký objekt aplikace a po krátké době se objeví malé žluté okno, "bublina", ve které je krátký popis daného prvku, tzv. Hint. Možná se vám zdá tato nápověda někdy nepříjemná, nebo vám vadí, že se objeví na tak krátký čas, že si ji nestačíte ani přečíst. Abyste se ve svých aplikacích těchto chyb vyvarovali, zkuste použít následujících vlastností výše zmíněné skryté třídy TApplication.

Barva:

Standardní světle žlutá barva sice obvykle postačuje, ale někdy se nám může hodit použít barvu vlastní, a tím nápovědu ještě více zdůraznit či sladit s celkovou barevnou koncepcí vaší aplikace. Tak tedy:

Application.HintColor:=clRed;

Tímto kódem docílíme červeně zbarvených "Hintů", což není pravda příliš vkusné, ale na pochopení problému postačující. Hodnota je typu TColor, jako ostatně i u většiny ostatních běžných komponent. Nezapomeňte, že barva textu zůstane i nadále černá, a proto zvolte barvu dostatečně kontrastní, aby byl text vůbec čitelný.

Čas, po jehož uplynutí se nápověda zobrazí:

Application.HintPause:=2000;

Hodnota je v milisekundách, takže v našem příkladu se nápověda zobrazí za 2 sekundy. Opět je nutno volit hodnotu s rozvahou. Příliš malé číslo způsobí, že na nás bude aplikace neustále chrlit jednu nápovědu za druhou, kdykoliv myší přejedeme přes nějaký objekt. Velká hodnota naopak může netrpělivé uživatele odradit od dalšího čekání na nápovědu.

Doba, po kterou bude nápověda zobrazena:

Application.HintHidePause:=5000;

Opět se jedná o hodnotu v milisekundách a i zde je samozřejmě nutné volit hodnotu s rozmyslem.Vše záleží na tom, jak dlouhé obvykle bublinkové nápovědy píšete, i když se většinou nedoporučuje psát příliš dlouhá slovní spojení (od toho je zde klasická nápověda).V každém případě nastavte takovou hodnotu, aby si nápovědu bez problému a na první pokus stihl přečíst každý uživatel.

Zobrazování/nezobrazování nápovědy

I tento parametr se často hodí. Pokud uživatel pracuje s vaší aplikací denně, patrně už ví, které tlačítko má jakou funkci, a zbytečné zobrazování nápovědy může být otravné. Proto je dobré dát uživateli možnost volby (např. v nastavení programu), zda chce či nechce tuto nápovědu ukazovat. Toho docílíme tímto kódem:

Application.ShowHint:=false;

Náš příklad způsobí, že se nápověda zobrazovat nebude. Parametr true má logicky opačný efekt.

Všechny tyto parametry můžete umístit na (téměř) libovolné místo zdrojového kódu, a tudíž tyto vlastnosti měnit dynamicky během programu. Neustálé změny však mohou uživatele dokonale poplést, proto je vhodné spíše zvolit jednu decentní kombinaci a umístit tento kód např. do události OnCreate hlavního formuláře.

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.HintColor:=clYellow;
Application.HintPause:=1000;
Application.HintHidePause:=3000;
Application.ShowHint:=true;
end;

Závěrem této části uveďme snad jen poznámku, že tyto postupy bohužel nezmění chování nápovědy u systémových tlačítek oken (tlačítko na minimalizaci, maximalizaci, zavření aplikace), což však celkový efekt příliš nezkazí.

Blikání ikony běžící aplikace na hlavním panelu

Určitě to dobře znáte – aplikace běžící na pozadí dokončí nějakou činnost a očekává např. další vstup od uživatele, nebo na sebe potřebuje upozornit z jiného důvodu. Ty "méně vychované" se automaticky maximalizují a skočí na popředí rovnou do vaší rozdělané práce. Slušnější aplikace na sebe snaží upoutat pozornost tím, že začne blikat ikonou na hlavním panelu. A právě tento efekt si teď ukážeme. Není to složité a je to opět pouze jednořádkový příkaz :

flashwindow(application.handle,true);

Druhý parametr určuje, zda se má ikona rozsvítit či zhasnout (false). Ke zhasnutí můžete také znovu použít příkaz s parametrem true, doporučuji však používat vždy postup s kombinací "true/false".

Nutno poznamenat, že tímto příkazem samozřejmě docílíme "rozsvícení" ikony, ale ne slibovaného bliknutí. K tomu nám pomůže ještě jeden příkaz – sleep, který nám na daný počet milisekund pozastaví běh procesu (zjednodušeně řečeno).Výsledný kód procedury pro bliknutí bude tedy vypadat např. takto:

procedure Blikni;
begin
flashwindow(application.handle,true);
sleep(500);
flashwindow(application.handle,false);
end;

Tím dosáhneme jednoho bliknutí. Pokud tuto proceduru zařadíte do nějakého vhodného cyklu a patřičným způsobem nastavíte události hlavního formuláře, snadno docílíte např. toho, že aplikace bude blikat tak dlouho, dokud si toho uživatel nevšimne a maximalizuje ji.

Bohužel tento postup nebude spolehlivě fungovat pod Windows 2000, kde se sice podaří ikonku rozsvítit či zhasnout, avšak blikání touto procedurou nedosáhnete (je to způsobeno procedurou Sleep). Za domácí úkol si zkuste tento problém vyřešit sami. V některém z příštích dílů si ukážeme jednu z možností.

Priorita aplikace

Někdy se nám může hodit i nastavení priority aplikace, tj. kolik výkonu jí systém přidělí. Pravda, na platformě Windows 9x je tato funkce malinko degradována samotnou architekturou systému, ale pod systémy Windows 2000 je plně funkční. Uvedeme si zde jednoduchou proceduru s jedním parametrem, určujícím požadovanou prioritu.

procedure NastavPrioritu(p:byte);
begin
case p of
1:Setpriorityclass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
2:Setpriorityclass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
3:Setpriorityclass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
4:Setpriorityclass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
end;
end;

Pro úplnost přehled (překlad) výše zmíněných priorit, použitých v naší proceduře:

Zvláště s posledními dvěma variantami je nutno nakládat opatrně, aby aplikace nezpůsobila nestabilitu celého systému.

Tímto končí první díl našeho seriálu.Vidíte, že mnohé funkce, kterými se chlubí některé (mnohdy i placené) komponenty, můžete snadno zvládnout sami, často pouhým jedním řádkem kódu.