Umíme to s Delphi, 42. díl – třída TApplication, dokončení

Před týdnem jsme popsali důležité třídy Delphi – TObject a TComponent. Začali jsme se také zabývat třídou TApplication, která umožňuje pohlížet na aplikaci jako na celek a nastavovat některé „globální aplikační“ vlastnosti. Dnes popis této třídy dokončíme pohledem na její metody, přičemž se zaměříme na dvě nejčastěji používané.
Aby naše procházka po možnostech třídy TApplication byla kompletní, uvedeme ještě

několik používaných metod této třídy, viz následující tabulka:

Metoda Popis
CreateFrom Vytvoří nový formulář.
HelpContext Zobrazí zadané téma ze souboru nápovědy (udávaného vlastností HelpFile).
HideHint Skryje aktuální plovoucí nápovědu.
Initialize Inicializuje aplikaci. Je volána z „hlavního programu“ aplikace (viz předchozí text této kapitoly).
MessageBox Zobrazí okno se zprávou. Možnosti nastavení vzhledu tohoto okna jsou velmi rozsáhlé – za chybu považuji fakt, že jsme se s ním dosud nesetkali. Hned v závěru této kapitoly to napravíme.
Minimize Minimalizuje aplikaci do pruhu Windows.
ProcessMessages Velmi důležitá metoda, příklad naleznete pod tabulkou. Přeruší provádění aplikace a umožní Windows zpracovat zprávy aplikace čekající ve frontě.
Restore Obnoví minimalizovanou aplikaci do původní velikosti.
Run Spouští aplikaci. Je volána z „hlavního programu“ aplikace (viz předchozí text této kapitoly).
ShowException Zobrazí chybovou zprávu o výjimce. Výjimku předáme metodě v parametru.
Terminate Ukončí aplikaci.

Jedna z metod třídy TApplication je ProcessMessages. Protože se jedná o velmi důležitou metodu, probereme ji trochu podrobněji a uvedeme si podrobný příklad jejího použití.

Metoda Application.ProcessMessages – zpracování zpráv při delším výpočtu

Tuto metodu se vyplatí často (avšak s rozmyslem) používat. Přeruší totiž provádění aplikace a předá řízení operačnímu systému Windows, takže ten může zpracovat další zprávy aplikace. Systém si nechá řízení jen na bezprostředně nezbytnou dobu. Občasné zavolání této metody:

Application.ProcessMessages;

při dlouhotrvajících výpočtech je velmi vhodné, protože aplikace je neustále „živá“, reaguje na podněty uživatele, může překreslit svůj obsah, může být přesunuta jinam na ploše, apod.

Pokud ve své aplikaci budete mít nějakou funkci, která bude jen trochu náročnější na čas, vyplatí se v ní „čas od času“ – např. po každé stovce průběhů cyklem – zavolat Application.ProcessMessages, jinak dojde k zdánlivému zatuhnutí příslušné aplikace až do okamžiku, než bude funkce dokončena. Aplikace totiž nebude reagovat na žádné události a bude se jevit jako havarovaná.

Metoda ProcessMessages nemá žádné parametry.

Příklad použití metody Application.ProccesMessagess:

procedure TfrmHlavni.btnTestClick(Sender: TObject);

var
  I: Integer;

begin
  for i := 1 to 100000 do
  begin
    frmHlavni.Caption := IntToStr(I);
    if I mod 100 = 0 then
      Application.ProcessMessages; // předej řízení, zpracuj zprávy
  end;
end;

Důležitá poznámka: Řešení uvedené v předchozím příkladu ovšem také znamená, že se bude muset vyhodnotit 100000 podmínek navíc, přičemž podmínka patří mezi pomalejší příkazy. Proto je nutné vždy citlivě uvážit, zda možný přínos vyváží nutnou režii.

V tomto příkladu dojde k předání řízení systému vždy po 100 průchodech cyklem. Zkuste si z něho vypustit celý podmíněný příkaz if a pokuste se při běhu programu třeba pohnout oknem nebo aplikaci minimalizovat.

Poznámka pro pokročilé uživatele: Dalším způsobem, který zajistí, že aplikace bude „živá“ i při dlouhém výpočtu, je použití vláken. Problematice vláken se budeme časem v našem seriálu jistě věnovat, takže dnes jen stručně naznačme, že běžící program (tedy proces) může být rozdělen na jednotlivá vlákna (části procesu), která dokáží běžet souběžně (paralelně); pomocí vláken se proto realizuje tzv. paralelní programování.

Metoda Application.MessageBox – tvorba výpisových boxů

V jednom z prvních dílů tohoto seriálu, konkrétně v šestém, jsme se již setkali s několika výpisovými boxy. Zopakujme, že šlo o funkce ShowMessage, MessageDlg a MessageDlgPos. Všechny tyto uvedené dialogové boxy mají však několik nevýhod, počínaje neměnným záhlavím a konče anglickými popisy tlačítek. Důvodem anglického popisu je skutečnost, že titulky nevycházejí ze systému Windows, ale z knihoven Delphi a ty zatím, bohužel, počeštěné nejsou:-) Pokud se chcete s těmito problémy elegantně vypořádat, použijte metodu Application.MessageBox, což je zapouzdřená funkce MessageBox programátorského rozhraní Windows API. Tím je asi také řečeno, že funkce nepoužívá standardní (tedy anglické) knihovny nástroje Delphi, nýbrž knihovny systému Windows – tedy že v českých Windows budou popisky vytvořeného MessageBoxu české a v anglických Windows anglické. To je asi řešení, se kterým se můžeme ztotožnit.

Co to znamená? Z Delphi můžete volat funkce, které poskytuje operační systém Windows (lépe řečeno jeho aplikační programové rozhraní nazývané Windows API), ovšem nebývá to příliš pohodlné kvůli jejich parametrům, které často vyžadují handle okna a podobné údaje. Získání a použití těchto údajů není sice extrémně náročné, nicméně pro začátečníka může být trochu nepřehledné. Navíc je často zbytečné, protože Delphi mnohé funkce Windows API obsahuje (tzv. zapouzdřuje) a pro programátora i značně zjednodušuje. Tento odstavec nebyl pro vás asi příliš objevný, protože v předchozích kapitolách jsme se již několikrát s použitím funkce Windows API setkali (namátkou si vzpomínám na kapitolu o grafice v Delphi a na funkci SetBkMode, jejímž úkolem je nastavit způsob vykreslování objektů na plátno – transparentní či netransparentní). Funkce SetBkMode nepochází z Delphi, nýbrž z Windows API a důkazem toho také může být skutečnost, že její popis nenaleznete ve standardní nápovědě k Delphi, ale musíte si buď otevřít nápovědu k Windows API (tzv. MSDN, Microsoft Developer Network) nebo nápovědu Windows SDK, která je přístupná z hlavního menu Delphi (ne však ve všech instalacích).

Jednou z funkcí Windows API, které jsou v Delphi zapouzdřeny, je MessageBox pro vytvoření a zobrazení informačního boxu. Jak jsme si řekli, programátor má v zásadě dvě možnosti: použít přímo funkci Windows API, nebo použít odpovídající (zapouzdřenou) funkci Delphi. V každém případě bude výsledkem box s tlačítky, jejichž popisky budou ve stejné jazykové mutaci jako používaná verze systému Windows.

Delphi zapouzdřuje MessageBox jako metodu třídy TApplication. Prototyp funkce je následující:

function MessageBox(const Text, Caption: PChar; Flags: Longint): Integer;

Význam jednotlivých parametrů:

  • Text: vlastní text, který chcete zobrazit. Bude-li tak dlouhý, že se do boxu nevejde, dojde k automatickému zalomení na další řádku.
  • Caption: záhlaví boxu,
  • Flags: nastavení vzhledu boxu, jeho vlastností a tlačítek. Přípustných hodnot je poměrně dost. Jsou rozděleny do několika skupin a my si ukážeme jen ty nejdůležitější. Hodnoty lze kombinovat použitím operátoru +, jak to ukazuje příklad v závěru této kapitoly.

První skupinu tvoří parametry určující obsažená tlačítka:

  • MB_ABORTRETRYIGNORE – tři tlačítka, v českých Windows Přerušit, Opakovat, Přeskočit;
  • MB_OK – jediné tlačítko OK;
  • MB_OKCANCEL – tlačítka OK, Storno;
  • MB_RETRYCANCEL – tlačítka Opakovat, Storno;
  • MB_YESNO – tlačítka Ano, Ne;
  • MB_YESNOCANCEL – tlačítka Ano, Ne, Storno.
Druhá skupina určuje ikonu na box, např.:
  • MB_ICONWARNING – žlutočerná ikonka značící výstrahu;
  • MB_ICONQUESTION - modrý otazník značící dotaz (žádost o potvrzení);
  • MB_ICONERROR – červená ikonka značící chybu.
  • …atd.
Třetí skupinu tvoří parametr určující, které tlačítko bude standardně „předvybráno“:
  • MB_DEFBUTTON1 – „default“ tlačítko bude první;
  • MB_DEFBUTTON2 – „default“ tlačítko bude druhé;
  • …atd.
Čtvrtou skupinu tvoří „dodatečná“ tlačítka pro upřesnění vzhledu a vlastností, např.:
  • MB_HELP – přidá tlačítko Nápověda;
  • MB_RIGHT – zarovná text doprava;

Návratovou hodnotou funkce MessageBox je číslo 0, pokud nebyl dostatek paměti pro vytvoření dialogu. V opačném případě bude navrácena hodnota odpovídající tlačítku, jehož stisknutím uživatel box opustil. Možné hodnoty: IDOK (uživatel stiskl tlačítko OK), IDCANCEL, IDABORT, IDRETRY, IDIGNORE, IDYES, IDNO.

Příklad (výsledek viz následující obrázek):

  if (Application->MessageBox(
  "Ukázka funkce Application->MessageBox v českých Windows",
  "Nastavený popisek",
    MB_YESNOCANCEL + MB_DEFBUTTON2 + MB_ICONINFORMATION) == IDNO)

    ShowMessage(AnsiString ("Stiskl jste tlačítko Ne."));

Komponenty nebo objekty?

Napadá mě ještě jedna maličkost, která asi dosud v našem seriálu nezazněla. Opakovaně sice hýříme pojmy „Visual Component Library“, „komponenta“ a „objekt“, ale zatím jsme si neřekli, jaký je mezi komponentami a objekty vlastně vztah. Platí, že každá komponenta je objektem, zatímco některé objekty nejsou komponentami. Takové objekty nemají vizuální reprezentaci a jsou přístupné pouze za běhu aplikace.

Tyto objekty se často používají pro datové typy některých vlastností komponent, např. vlastnost Font některých komponent je objekt třídy TFont (třída popisující písmo). Kromě toho můžeme tyto objekty používat ve svých aplikacích (lze vytvořit objekt typu TFont a ukládat si do něj např. dočasné informace o písmech, které uživatel zvolil apod.).

V následujícím přehledu naleznete příklady některých objektů, které nejsou komponentami (výčet není kompletní):

  • Grafické objekty: TBitmap, TBrush, TCanvas, TFont, TGraphic, TGraphicsObject, TIcon, TMetaFile, TPen, TPicture.
  • Streamy: TBlobStream, TFileStream, THandleStream, TIniFile, TMemoryStream, TFiler, TReader, TWriter.
  • Kolekce: TList, TStrings, TStringList, TCollection.
  • Třídy pro práci s COM aplikacemi.
Každá komponenta je objektem určité třídy, přičemž pro každou komponentu existuje zvláštní třída, jejíž název je shodný s názvem komponenty, jen začíná na „T“. Ostatně – to vše už jste jistě poznali. Jediný fakt, který možná stojí za zdůraznění, zní takto: budete-li vyhledávat v rejstříku nápovědy v Delphi, hledejte spíše podle názvů typů (tedy s písmenem T na začátku) než podle názvů komponent (raději TButton než Button, apod.). Popis mnohých komponent sice najdete oběma způsoby, ale není to zaručený způsob.

Na závěr

Obecně lze říci, že metoda Application.MessageBox se používá mnohem častěji než její ekvivalenty, které nabízí Delphi (tedy ShowMessage, MessageDlg, MessageDlgPos, apod.). Důvodem je, jak bylo zmíněno, jazyková nezávislost na knihovnách Delphi a především poměrně rozsáhlé možnosti nastavení vzhledu vytvořeného boxíku. V našem seriálu sice pro výpis krátké informace používáme takřka výhradně funkci ShowMessage, ale to neberte jako reprezentativní ukázku chování běžných vývojářů:-), neboť se tak děje především z důvodu jednoduchosti této funkce. Stejně tak se poměrně často používá metoda Application.ProcessMEssages, i když nutno podotknout, že v poslední době se stále více vývojářů (zcela správně) přiklání k implementaci déletrvajících úkolů pomocí vláken, tedy samostatných výpočetních procesů. Nerad bych na tomto místě něco sliboval, ale doufám, že i v našem seriálu se k problematice vláken a paralelního programování dostaneme.

Tolik tedy k dnešnímu tématu. Doufám, že popis třídy TApplication byl dostatečně vyčerpávající – ačkoliv by se o této třídě samozřejmě daly popsal mnohem větší stohy virtuálního papíru:-) Za týden se těším nashledanou.

Diskuze (4) Další článek: Registrace domény po česku

Témata článku: Software, Windows, Programování, Zvláštní význam, Používaná verze, Tlačítko, Třída, Dokončení, DEL, Delphi, Hlavní důvod, Jediný prototyp, Následující aplikace, Vlákno, Živý stream, Předchozí odstavec, Dok, Živá ukázka, Díl, TRI


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

Vodafonu se zhroutila kabelovka. Síť bývalého UPC má výpadky
Lukáš Václavík
VodafoneUPC
Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

** Vybrali jsme nejlepší monitory na práci i pořádné hraní ** Nejlevnější monitor s kvalitním panelem nestojí ani tři tisíce ** Rozlišení 4K a větší obrazovka už není nedostupný luxus

David Polesný | 30

David Polesný
Monitory
Velký den pro Apple: Uvedl tři nové Macy s vlastním procesorem M1
Lukáš Václavík
PočítačeApple
Co je to UWB? Nová technologie zastoupí Wi-Fi, Bluetooth i NFC a slibuje velké věci

Co je to UWB? Nová technologie zastoupí Wi-Fi, Bluetooth i NFC a slibuje velké věci

** V nových mobilech se začíná objevovat tajemná zkratka UWB ** Jde o další technologii, jak navzájem propojit různá zařízení ** Oproti Wi-Fi a Bluetooth má řadu výhod

Lukáš Václavík | 36

Lukáš Václavík
UWBIoTTechnologie

Aktuální číslo časopisu Computer

Jak prodloužit výdrž notebooku

Velké testy: gamepady a inkoustové tiskárny

Důkladný test Sony Playstation 5