Narodil som sa v čase, keď počítače neboli bežnou súčasťou domácnosti a hoci na strednej škole sme už informatiku mali, veľmi mi to nepomohlo. V 11-tich rokoch som totiž prišiel o zrak a tak bolo nemysliteľné, aby som si sadol za počítač a niečo na ňom urobil. Až v druhej polovici 90-tych rokov sa začalo hovoriť o tom, že aj nevidiaci budú môcť používať počítač a to vďaka špeciálnym programom – čítačom obrazovky – screenreaderom – ktoré budú zabezpečovať komunikáciu počítača s nevidiacim. To som bol už na vysokej škole a ako technický typ som po tejto novinke hneď siahol a stal sa aktívnym užívateľom Windows. Čoskoro sa ale ukázalo, že nie všetko je tak, ako sa zdá.
Čo je čítač obrazovky a ako funguje?
Čítač obrazovky sa snaží rozpoznať na obrazovke objekty a vyčítať z nich ich popisok alebo obsah. Treba si však uvedomiť rozdiel medzi tým ako vníma obrazovku vidiaci človek a čítač. Kým človek jedným pohľadom obsiahne celú obrazovku a vyberie si z nej to čo potrebuje, čítač môže v jednej chvíli sprostredkovať iba jednu informáciu a to tú, ktorá je práve pod kurzorom. Nevidiaci teda musí sám pomocou klávesnice presúvať kurzor či už po prvkoch okna pomocou tabulátora alebo po položkách zoznamu či riadkoch textu šípkami, a čítač mu následne oznamuje, čo je práve pod kurzorom. Z toho vyplýva, že ak sa na niektorý objekt nedá pomocou klávesnice dostať, nevidiaci užívateľ sa o ňom ani nedozvie a nemá ani možnosť ho použiť. (Výnimkou je titulok okna a stavový riadok, ktoré si síce tiež nevedia privlastniť fokus, no čítače ich spravidla vedia prečítať po stlačení nejakej klávesovej skratky..)
Rovnako sú pre čítač neviditeľné texty, ktoré sú graficky vykreslené či už na formulári alebo v nejakej grafickej komponente. Programátorsky je to vždy iba zhluk pixelov s rôznymi vlastnosťami. Ak sa k takémuto grafickému dielku priprogramuje udalosť onclick, môže vzniknúť vzhľadovo krásna komponenta, ktorá je ale pre čítač úplne neviditeľná. Napríklad tlačidlo Install v novom inštalátore Delphi. S čítačom spustíte inštalátor, odsúhlasíte licenciu a všetko ostatné, ale samotnú inštaláciu už z klávesnice nespustíte.
Čo je prístupná aplikácia?
Pod pojmom „prístupná aplikácia“ rozumieme aplikáciu, ovládateľnú čítačom obrazovky. Veľmi zjednodušene možno povedať, že prístupná aplikácia je taká, ktorá používa štandardné ovládacie prvky a objekty, tieto sú dostupné z klávesnice a majú korektné popisy. Žiaľ, ako v minulosti tak aj dnes nie každá aplikácia tieto podmienky spĺňa, preto hoci na internete existuje záplava softwaru všetkého možného druhu, nevidiaci môže siahnuť len po tých programoch, ktoré sú prístupné čítaču obrazovky.
Aké čítače dnes existujú?
V prostredí Ms Windows je najpoužívanejším čítačom obrazovky komerčný Jaws (www.freedomscientific.com) alebo NVDA (www.nvaccess.org), ktorý si môžete stiahnuť a vyskúšať bezplatne. Súčasťou systému Windows je MS Narrator, ktorý sa postupne zlepšuje, no ešte zďaleka nedosahuje kvality čítača, použiteľného pri každodennej práci.
Systém Linux vlastný integrovaný čítač nemá, je však možné použiť program Orca.
Ak vlastníte zariadenie s operačným systémom Android, ios alebo osx, máte v ňom už integrovaný čítač obrazovky, ktorý stačí len aktivovať. V Androide je to Google Talkback a v zariadeniach od Applu je to VoiceOver.
Prečo Delphi
Keďže svoj počítač som veľmi rýchlo zdolal, chcel som ísť ďalej a chcel som preniknúť do tajov programovania. Chcel som si sám vytvoriť nenáročné programy, ktoré by suplovali iné, na internete síce dostupné ale čítačom neprístupné aplikácie. Pýtal som sa skúsených programátorov a dostal mnoho tipov, no narážal som na totálne neprístupné vývojové prostredia. Napokon som skončil pri Freepascale, ktorý sa síce čítačom nedal ovládať vôbec, no jeden známy ma naučil písať kód v Notepade a kompilovať ho externe cez kompiler FPC. Takto som však vedel robiť iba konzolové aplikácie a ja som chcel viac, no písať ručne v Notepade aplikácie pre Windows bolo nad moje sily. Tu prišiel iný kamarát a poradil mi Delphi. Vyskúšal som na jeho radu staršiu verziu 6 a objavil prístupné ide prostredie a možnosť vytvárať aplikácie pre Windows bez toho, že by som ako laik musel ručne vytvárať triedy a objekty, ktorým som vtedy vôbec nerozumel. Stačilo pridať na formulár pár komponent, napísať kód a bolo to. Ideálne pre mňa, ktorý som s programovaním iba začínal. Tak som sa stal nadšencom Delphi a dodnes túto jednoduchosť oceňujem, pretože stále som iba programátor-amatér a profesne sa pohybujem v úplne iných oblastiach, čo mi nedáva dostatok času a možností na hĺbkové štúdium informatiky.
Delphi, prístupnosť a programovanie bez zraku
Verzia 6 mi plne vyhovovala, pretože bola veľmi dobre prístupná čítačom obrazovky. Samozrejme, nemožno si pod tým predstaviť, že som Delphi ovládal tak, ako vidiaci. Opäť pripomínam, že všetko ovládanie sa musí diať z klávesnice a ťahanie objektov po obrazovke myšou neprichádza do úvahy. Delphi 6 však ponúkalo ku všetkému alternatívne riešenia. Ako teda vznikali moje aplikácie v Delphi 6?
1. Pridanie komponent na formulár
Ak som potreboval pridať na formulár novú komponentu, nepoužil som paletu na hlavnej obrazovke, pretože tá nebola čítačom vôbec prístupná. Nedali sa tam šípkami vyberať jednotlivé komponenty. Našťastie D6 mal v menu Wiev položku Components list, kde bolo možné komponenty vybrať v klasickom zozname a pridať ich na formulár
2. Vzhľad formulára
Fáza, ktorá je pre mnohých možno banálnou záležitosťou, pre mňa vždy znamená otročinu. Ak som mal na formulári 15 objektov a nechcel som, aby vidiaci používateľ po spustení mojej aplikácie uvidel veľkú kopu v strede obrazovky, musel som prvky nejako rozmiestniť. Využíval som na to prácne vlastnosti top a left každého objektu a počítal, aké by asi mali mať prvky hodnoty, aby sa neprekrývali. Ako príklad uvediem jednoduché okno na zadanie IP adresy a portu na pripojenie klienta k serveru. Mám formulár o veľkosti 500x400, dve komponenty tedit, dve tlabel a dve tlačidlá tbutton. Ak si predstavím, že okno bude mať akoby tri riadky, v prvom bude prvý label a edit, v druhom druhý a v treťom tlačidlá, musím si okno rozdeliť na tri časti a umiestniť objekty tak, aby bol label vždy vľavo a edit dostatočne vpravo. Urobím to asi nejako takto:
Tlabel1.top:=50;tlabel1.left:=100;
Tedit1.top:=50;tedit1.left:=300; (hádam to bude stačiť)
Tlabel1.focuscontrol:=tedit1;
Tlabel2.top:=150;tlabel2.left:=100;
Tedit2.top:=150;tedit2.left:=300; (hádam to bude stačiť)
Tlabel2.focuscontrol:=tedit2;
Tbutton1.top:=250;tbutton1.left:=200; (nech sú tlačidlá trochu ďalej od kraja)
Tbutton2.top:=250;tbutton2.left:=300;
Skúste si na základe týchto čísel predstaviť ako asi bude okno vyzerať. Situácia je samozrejme hodne zložitejšia, ak je na obrazovke viac prvkov alebo tam majú byť aj väčšie komponenty napr. nejaký zoznam alebo tmemo pre zápis textu. Chceto vždy riadnu dávku času a predstavivosti.
Hoci som tu použil zápis v podobe zdrojového kódu, väčšinou som tieto hodnoty nastavoval v Object inspectore alebo priamo v dfm súbore, ktorý na moje veľké šťastie nie je binárny.
3. Nastavovanie ďalších vlastností
Object inspector je v celku dobre prístupný, takže zmena vlastností je v podstate jednoduchá. Na začiatku som iba dlho riešil otázku, ako do OI načítať žiadanú komponentu, ak ich už mám na formulári viac. Nakoniec som však zistil, že ak si zobrazím objektový strom (alt+shift+F11) a na žiadanej komponente dám enter, bude táto vybratá a po zobrazení Object inspectora (F11) už pohodlne mením jej vlastnosti.
4. Písanie kódu
Z hľadiska prístupnosti už celkom bez problémov, keďže unity sa správajú ako texty a čítače bez problémov čítajú text. Problémy, spojené s nefunkčnosťou zapísaných algorytmov tu neriešim, pretože problém spravidla nebýva v očiach ale o pár centimetrov vyššie.
Programovať bez zraku, len za pomoci čítača obrazovky teda je možné, aj keď je to trochu krkolomnejšie a vyžaduje si trpezlivosť, predstavivosť a kreativitu pri otázkach, ako sprístupniť to, čo je pre iných bežné. Keďže za tie roky som vytvoril už niekoľko menších či väčších programov, spravidla pre nevidiacich, riešil som niekoľko otázok, nad ktorými sa vidiaci programátor nemá dôvod zamýšľať. Uvediem pre ilustráciu niektoré z nich:
A) Ako nevidiacemu sprístupniť informáciu na obrazovke
Sú situácie, kedy program chce niečo užívateľovi oznámiť stručnou informáciou, ktorú bežný programátor vypíše napr. do komponenty TLabel. Čítač obrazovky takúto informáciu nezachytí (pozn. delphi.cz: TStaticText by měl být kompatibilní se čtečkou). Museli by sme ju vypisovať do nejakej komponenty napr. do TEdit alebo TMemo. Nevyzerá to však najkrajšie a užívateľ by si aj tak musel neustále do tejto komponenty presúvať kurzor, aby si informáciu prečítal. Ja som sa uchýlil k technológii, ktorú už rutinne používam vo všetkých svojich projektoch a to je oznamovanie informácií priamo cez sapi. Rozhraním sapi je dnes vybavený už každý počítač a jednoduchým kódom typu
Uses comobj
Var voice:olevariant;
A potom
voice := CreateOLEObject('SAPI.SpVoice');
voice.speak(label1.caption,9);
je možné poslať obsah TLabel priamo do reproduktora. Ak teda vypíšem do komponenty TLabel nejaký text, pošlem ho zároveň aj rozhraniu sapi. Takáto voliteľná hlasová podpora by bola vítaná aj v iných aplikáciách. Stretol som sa s ňou v programe Tapinradio, ktorý je určený na počúvanie internetových rádií. Pri inštalácii je možnosť zapnúť hlasovú podporu, ak je užívateľ zrakovo postihnutý. V takom prípade sú informácie, zobrazované v rôznych labeloch či titulku okna posielané aj na rozhranie sapi.
B) Komponenta TStringGrid
Programoval som aj databázový program, kde som chcel informácie zobrazovať v tabuľke. Komponenta tstringgrid je na to úplne ideálna v prípade, že na ňu človek vidí. Ak nie, je to docela problém, pretože táto komponenta síce dokáže uchopiť focus ako objekt, no nie je možné šípkami chodiť po jednotlivých bunkách a vyčítať ich obsah. Ak som teda túto komponentu vložil na formulár, mohol som do nej načítať dáta, avšak užívateľ si ich nevedel prečítať. Vyriešil som to napokon tak, že som sledoval stláčanie navigačných kláves (šípky, home, end, page up, page down a kombinácie) a ak sa po stlačení nejakej klávesy vyznačila časť tstringgridu, načítal som si vyznačenú oblasť do stringu a vyššie popísaným spôsobom poslal rozhraniu sapi. Užívateľ teda mal dojem, že komponenta je prístupná, v skutočnosti to však tak nie je.
C) Indikácie stavu
Situácie, kedy prebieha operácia a na obrazovke sa objaví ikonka, že zostáva 15 percent, alebo kedy sa po dosiahnutí nejakého stavu zafarbí políčko na červeno a podobne, sú časté. Niekedy skrátka treba len upozorniť, že vypršal časový limit, bol dosiahnutý povolený počet znakov, skončila náročná operácia, je načítaný súbor a podobne. Takéto situácie oznamujem zásadne zvukovým signálom. Je preto pre mňa dôležité mať naštudovaný systém, ktorý mi umožní efektívne spracovávať, prehrávať a v prípade potreby aj modifikovať zvuky tak, aby som mohol buď rôznymi zvukmi alebo aj jedným zvukom rôznej výšky oznamovať to, čo potrebujem. Klasická knižnica mmsystem je na toto dosť chudobná, preto som po dlhých peripetiách a pokusoch objavil a naštudoval knižnicu Bass.
Samozrejme výpočet alternatívnych riešení rôznych problémov by mohol pokračovať, avšak ako ukážka to azda stačí.
Delphi dnes
Veľmi dlho som zotrvával pri osvedčenej verzii 6 a nemal odvahu na update, pretože väčšinou je každá nová verzia nejakého programu menej prístupná. Pokusne som si nainštaloval verziu 7 a tá moje obavy potvrdila. Prostredie by bolo ešte prístupné, no menu sa vôbec nedalo ovládať z klávesnice. Správalo sa ako jeden objekt a hoci po stlačení alt (to je môj bežný spôsob ako vstupovať do menu) som sa dostal na prvý riadok s ponukou File, Edit atď., ďalej to už nijako nešlo. Verzia 7 bola teda nepoužiteľná.
K updatu som sa odhodlal opäť až po nejakom čase a siahol som rovno po verzii XE8 a 10.1. Bál som sa, že si v nich už vôbec neškrtnem, ale čakalo ma milé prekvapenie, takže Embarcadero dostalo odo mňa pochvalu. Menu týchto verzií je prístupné bez problémov, rovnako tak prostredie unitu a Object inspectora. Problém sa však vyskytol v troch iných oblastiach:
1. Tool palette
V ostatných verziách Delphi zmizla položka Component list z menu Wiev, ostala iba paleta a tá je absolútne nepoužiteľná. Po jednotlivých komponentoch sa nedá vôbec prechádzať šípkami a tak vôbec nie som schopný pridať nový objekt na formulár. Ostávajú mi iba dve možnosti: buď otvoriť projekt v D6 a pridať objekty cez starý dobrý Component list (to robím v prípade nového projektu), alebo objekty pridávať ručne editáciou zdrojových pas a dfm súborov. Tu však musíte presne poznať názov a ideálne aj nejaké tie vlastnosti, čiže použiteľné len pri známych objektoch. Komponenty, ktoré sú pre mňa v Delphi 10 nové, som tak ešte nemal možnosť vôbec vyskúšať. Na internete sa váľa mnoho rozšírení pre IDE Delphi, no všetky riešia iba grafické zobrazenie palety. Pomohlo by jednoduché rozšírenie IDE, ktoré by dostupné komponenty zobrazilo v klasickom listwiev a po stlačení tlačidla by vybraný komponent pridalo do projektu. (pozn. delphi.cz: možná by mohlo pomoci Ctrl+Alt+P, které způsobí aktivaci Tool palete).
2. Object inspector
V podstate prístupný až na otázku, ako doň načítať požadovanú komponentu. V starých Delphi fungovalo, že po zobrazení objektového stromu stlačením enter na komponente bola táto načítaná aj v OI. Teraz to už tak nefunguje. Po zobrazení OI sa vraj na obrazovke nachádza zoznam komponentov, kde si možno požadovaný objekt vybrať, no dostať sa naň kurzorom sa z klávesnice asi nedá, aspoň sa mi to zatiaľ nijako nepodarilo. Našťastie dfm súbory sú ešte stále textové a nie binárne, vďaka tomu teda vlastnosti objektov editujem ručne. To isté platí o odstraňovaní komponent, v prostredí IDE to totiž nedokážem. Pomohla by jedna klávesová skratka, ktorá by kurzor presunula do zoznamu komponent, alebo keby bol tento zoznam dosiahnuteľný klávesou tabulátor.
3. Firemonkey
Celý môj elaborát bol o projektoch VCL. Firemonkey som ešte príliš nepreskúmal, nakoľko hneď pri tvorbe nového projektu som narazil na nemožnosť nastaviť šablónu a potom – ak sa mi to aj nejako podarilo – na nemožnosť pridať akúkoľvek komponentu – viď bod 1.
Našli by sa aj ďalšie oblasti, ktoré by v prístupnosti mali čo doháňať, tie sa však týkajú buď nástrojov, ktoré sa dajú oželieť, alebo sa nedostatok v prístupnosti dá vyriešiť iným, hoci krkolomnejším postupom. Vyššie uvedené tri body však priamo znemožňujú nevidomému programátorovi vývoj. V nových Delphi vďaka nim zatiaľ len dotváram už staršie projekty, alebo tvorím nové, ak si ich najprv v staršej verzii vytvorím a naplním komponentami (prichádza do úvahy iba v prípade VLC).
Verím však, že by tieto problémy boli riešiteľné. Aj cestou tohto článku by som preto rád apeloval na Embarcadero alebo tých, ktorí sú schopní tvoriť rozšírenia, aby sa pri otázke prístupnosti trochu pristavili a urobili niečo pre všetkých nevidiacich programátorov. Delphi stále považujem za veľmi výkonný, užívateľsky komfortný a vzhľadom na podporu rôznych platforiem aj praktický vývojový nástroj a rád by som pri ňom ostal.
V tomto článku som sa pokúsil opísať, ako asi vyzerá práca nevidomého programátora, poukázal som však aj na prekážky v nádeji, že sa azda podarí ich skôr či neskôr odstrániť a Delphi budú prístupné pre komunitu nevidiacich programátorov. To, že Embarcadero na nevidiacich predsalen trochu pamätá, dokazuje FireMonkey Accessibility Package, ktorý umožňuje tvoriť firemonkey aplikácie s priamou podporou čítačov obrazovky pre platformy Windows a Mac (škoda že nie aj Android). Vrelo tento balík programátorom odporúčam.
A ak by problematika prístupnosti zaujímala niekoho viac, odporúčam tiež stránku msdn.microsoft.com/en-us/windows/bb735024.aspx
Štefan Kiss (stefankiss.sk)