Hlavní navigace

Programovací jazyk Ada: dialogová okna a ukončení seriálu

13. 8. 2015
Doba čtení: 5 minut

Sdílet

Minulý díl jsme celý věnovali obecnějšímu řešení problémů s akcí a reakcí v rámci grafických uživatelských widgetů. V dnešním dílu dokončíme náš ukázkový kód jednou krátkou ukázkou. Vzhledem k tomu, že dnešní díl je zároveň posledním dílem naší série, provedeme v něm i celková shrnutí a závěr.

Editační pole už necháme stranou a podíváme se na něco, co bylo v minulých dílech s příkladem pro konzoli naprosto běžné – nějaký výstup do konzole. Nyní jsme ale v grafickém rozhraní a žádnou konzoli nemáme k dispozici (sice to není úplně pravda, ale prozatím budeme z tohoto tvrzení vycházet). Jaké tedy máme možnosti výstupu? Jednu možnost už jsme si ukázali – vložit nějakou hodnotu do určitého typu widgetu, který je pro takové zobrazení vhodný. Druhou možnost si ukážeme v dalším rozšíření našeho příkladu. Jedná se o řešení, které se nám může hodit i do budoucna a tak se mu budeme trochu věnovat. Pomocí další knihovny můžeme zobrazit různé typy tzv. dialogů, což jsou podřízená okna, která vždy zobrazují kombinaci textu, ikon a ovládacích tlačítek. Jako první musíme přidat do kódu odkaz na tuto knihovnu, přesněji řečeno na dvě:

with Gtkada.Dialogs;
with Gtk.Enums;

K tomu musíme přidat deklaraci jedné proměnné:

Dlg_btn : Gtkada.Dialogs.Message_Dialog_Buttons;

a samotnou funkci, která dialogové okno vytvoří:

procedure Show_Dialog (Widget : access Gtk_Widget_Record'Class) is              --1
begin                                                           --2
   Dlg_btn := Gtkada.Dialogs.Message_Dialog (Msg            => "Text Dialogu",           --3
                                             Dialog_Type    => Gtkada.Dialogs.Warning,       --4
                                             Buttons        => Gtkada.Dialogs.Button_OK, --5
                                             Default_Button => Gtkada.Dialogs.Button_OK, --6
                                             Help_Msg       => "Pomocný text dialogu",      --7
                                             Title          => "Titulek dialogového okna",  --8
                                             Justification  => Gtk.Enums.Justify_Center, --9
                                             Parent         => null);                --10

   Edit2.Set_Text (Dlg_btn'Img);                                        --11

end Show_Dialog;                                        --12

na 1. řádku v deklaraci procedury není nic nového a zvláštního

na 3. řádku se deklarované proměnné určeného typu přiřazuje tzv. návratová hodnota. Zároveň se definuje hlavní text dialogového okna

na 4. řádku se definuje typ dialogového okna. Zde může být zadáno 5 typů: Warning, Error, Information, Confirmation, Custom. Typy se liší hlavní ikonou

na 5. řádku se definují tlačítka, která mají být v okně viditelná. Zde připadá v úvahu dokonce 9 variant: Yes, No, All, OK, Cancel, Abort, Retry, Ignore, Help. Tlačítka se liší ikonou a popisem. Pořadí je takto seřazeno schválně, protože každý z typů tlačítka je definován také jako celé číslo 2**N, kde N = 0..8.

na 6. řádku je definováno tlačítko, které se bude automaticky aktivovat, pokud dialogové okno uzavřeme pomocí tlačítka Enter

na 7. řádku je text nápovědy k dialogovému oknu

na 8. řádku je definice titulku okna

na 9. řádku umístění nového dialogového okna vzhledem k vybranému widgetu. Tento řádek je nepovinný, nastavené umístění je Justify_Center

na 10. řádku definice tzv. rodičovského widgetu

na 11. řádku se do pole Edit2 přenese návratová hodnota. Tato hodnota odpovídá číslu stisknutého tlačítka v dialogu. Pouze tlačítko Help žádnou návratovou hodnotu nemá. Tuto hodnotu pak můžeme použít jako rozhodovací pro následné reakce na stisk jednotlivých tlačítek.

Pomocí těchto hodnot můžeme tlačítka také definovat. A to dokonce několik tlačítek najednou. Jedno tlačítko můžeme definovat pomocí jeho hodnoty z řady:

Yes = 1, No = 2, All = 4, OK = 8, Cancel = 16, Abort = 32, Retry = 64, Ignore = 128, Help = 256

Pokud budeme chtít umístit jedno tlačítko Retry, bude 5. řádek vypadat takto:

Buttons => Gtkada.Dialogs.Message_Dialog_Buttons(64);

Pokud bychom chtěli umístit do dialogu dvě tlačítka Abort + Ignore, budeme volat hodnotu součtu jejich definičních čísel 32 + 128 = 160:

Buttons => Gtkada.Dialogs.Message_Dialog_Buttons(160);

Můžeme ale třeba umístit najednou všech 9 tlačítek, když zadáme 1+2+4+8+16+32+64+128+256=511:

Buttons => Gtkada.Dialogs.Message_Dialog_Buttons(511);

Abychom byli úplně přesní, ono těch tlačítek vlastně existuje 10. To poslední, které jsme zatím neuvedli ani nepředvedli, je „žádné“ tlačítko Button_None s návratovou hodnotou 0. V tomto případě v dialogovém okně žádné tlačítko není:

Buttons => Gtkada.Dialogs.Message_Dialog_Buttons(0);

V představování a předvádění dalších widgetů z balíku GtkAda by se určitě dalo pokračovat velmi dlouho a široce. Pro naše potřeby to ale zatím bude stačit. Kompletní kód celého projektu je v přílohách main5.adb,han­dlery5.adbhandlery5.ads.

Na pěti obrázcích v galerii jsou pak vidět všechny typy dialogového okna, které vždy obsahují všechna uvedená tlačítka. Zdánlivě zmatený text je tam pouze jako doklad toho, že zde funguje diakritika.

Odkazem na soubory v příloze a obrázky končí naše poměrně rozsáhlá série článků (toto je 16. díl) o programovacím jazyce ADA. Jak již bylo řečeno hned na začátku – jedná se o sice starý a všeobecně známý programovací jazyk. Jeho využití v „běžném“ programátorském životě je ale poměrně nízké. Padlo to také již v reakcích čtenářů, že ADA je vhodnější spíše na rozsáhlejší projekty a hlavně tam, kde je důležitá robustnost a bezpečnost aplikací.

Přesto všechno si myslím, že zařazení platformy Ada do balíku výukových kurzů pro studenty nebyl vůbec špatný nápad. Kdyby nic jiného, tak přinesl zase trochu jiný pohled na danou problematiku a exkurzi do ne úplně mainstreamové oblasti programovacích jazyků. Na tomto místě by asi bylo vhodné zmínit již dříve avizovaný Výukový kurz. Ten zájemcům nabídne širší pohled na problematiku jazyka Ada. Kromě toho bude jeho součástí poměrně rozsáhlý příklad z oblasti numerické matematiky. Původním záměrem bylo vydat kurz v rámci série článků. Po delších diskusích bylo ale rozhodnuto, že se jeho vydání odloží na podzim letošního roku. Je to hlavně z toho důvodu, aby bylo možné do něj zařadit případné poznatky a připomínky z pedagogického využití série článků.

Během tvorby této série došlo k vydání další verze systému GPL GNAT a je k dispozici varianta 2015 – GPL GNAT 2015

Tato verze nebyla a nebude v rámci série článků použita. Totéž platí i pro novou verzi frameworku GtkAda. Nové verze budou následně použity pro vytvoření výše uvedeného komplexního příkladu.

Co se týká GtkAda, je z odkazu zřejmé, že je určen pro verzi GTK 3.8.4. To je docela škoda, protože existují mnohem novější a zajímavější verze. Pro naše účely to však zásadní problém nebyl.

U QtAda je situace podobná a pořád je k dispozici verze pro Qt řady 4.8. Velmi živý je ale vývoj v rámci Qt5Ada, kde je k dispozici verze pro Qt řady 5.5.

Další frameworky a zajímavé nástroje budou také uvedeny ve výukovém kurzu včetně krátkých ukázek.

Na úplný závěr bych chtěl poděkovat všem, kteří seriál sledovali a přinášeli svoje názory a postřehy do diskuse.

V dnešním dílu jsme uzavřeli poměrně rozsáhlý seriál o programování v jazyce Ada. Na tento seriál bude v dohledné době navazovat další, který se bude věnovat vybraným aspektům tvorby aplikací JavaFX.

Byl pro vás článek přínosný?

Autor článku