Bankovní institut vysoká škola Praha Katedra informačních technologií a elektronického obchodování
Vyuţití zásobníkových jazyků pro uţivatelské řízení aplikací
Diplomová práce
Autor:
Bc. Marcela Turková Informační technologie a management
Vedoucí práce:
Praha
Doc. Ing. Alena Buchalcevová, PhD.
Duben 2010
Prohlášení
Prohlašuji, že jsem diplomovou práci na téma:
Využití zásobníkových jazyků pro uživatelské řízení aplikací ( Stack Languages For User Application Control )
vypracovala samostatně pod odborným dohledem vedoucí diplomové práce za použití pramenů uvedených v přiložené bibliografii
V Praze dne ………….
…………………………………. podpis autora
2
Poděkování
Tímto bych chtěla poděkovat vedoucí této diplomové práce doc. Ing. Aleně Buchalcevové, PhD. za její podněty, nápady, hodnotné připomínky a za odborné vedení.
3
Abstrakt Pro potřeby speciálních typů desktopových aplikací byla vytvořena mutace programového jazyka Forth, nazvaná P42, která je přilinkovaná k programu jako včleněný jazyk tzv. embedded language. Pomocí tohoto nového skriptovacího jazyka P42 je umožněn přístup k řízení aplikací z uživatelského rozhraní. Diplomová práce nejprve popisuje základní principy jazyka Forth, poté se zaměřuje na jazyk P42, tj. na implementaci tohoto nástroje do programovacího prostředí Delphi verze 6, a dále na popis základních příkazů a na ukázku použití P42 k tvorbě výstupních sestav. Důraz je zejména kladen na řešení tiskových formulářových sestav pro potřeby společnosti Sazka, a.s. s možností uživatelských zásahů do modifikací zobrazovaných dat a formátu výstupních protokolů. Modul, který je v současné době součástí několika aplikací, prošel důkladným testováním. Na jeho zlepšování se nadále pracuje a v případě potřeby se jeho funkce budou rozrůstat tak, že jazyk P42 bude doplňován o další moduly.
Klíčová slova Zásobníkové jazyky; Interpretační jazyky; Programovací jazyk Forth; Včleněný jazyk; Slovo; Slovník jazyka; Datová struktura; Delphi 6; Desktopová aplikace; Softwarová aplikace; Program; Modul; Výstupní sestavy; Fronta; Zásobník; Uživatelský zásobník; Zásobník návratových adres; Infix; Prefix; Postfix; Polská logika; Reverzní polská logika; Interpret; Implementace; Syntaxe a sémantika; Objekt; Datový typ;
4
Abstract For using particular types of desktop applications a special embedded module was built based on the programming language Forth, named P42, which made it possible to have access to control the application from the users interface. The diploma work deals with presentation of the language Forth, implementation of a special embedded module P42 into the language Delphi version 6, with a description of basic commands and illustrating examples and the creation of printed reports. For the needs of the company Sazka, a.s., the accent is specifically put as a solution in the form of printed reports with the possibility of user’s modification to represent the dates and layouts of the reports. At present, this module is integrated into several applications and its works reliably. The module was carefully tested and is constantly developed. As needed its function will be enlarged in the same way, that the language P42 will be supplemented with other modules.
Keywords Stack languages; Interpreter languages; Programming language Forth; Embedded language; Word; Dictionary; Data structure; Delphi 6; Desktop application; Software application; Program; Module; Reports; Queue; Stack; User Stack; Return Stack; Infix; Prefix; Postfix; Polish Notation; Reverse Polish Notation; Interpreter; Implementation; Syntax and semantics; Object; Data type;
5
Obsah Prohlášení ............................................................................................................................... 2 Poděkování ............................................................................................................................. 3 Abstrakt .................................................................................................................................. 4 Klíčová slova .......................................................................................................................... 4 Abstract................................................................................................................................... 5 Keywords ................................................................................................................................ 5 Úvod ........................................................................................................................................ 8 1
Charakteristika zásobníkových jazyků a možnosti jejich využití.................................. 11
2
Zásobníkový jazyk Forth ............................................................................................... 15
3
4
5
6
2.1
Historie jazyka Forth ................................................................................................ 15
2.2
Základní vlastnosti jazyka Forth............................................................................... 16
2.3
Výhody a nevýhody jazyka Forth............................................................................. 17
Rozšíření jazyka Forth pro použití při objektově orientovaném programování ............ 19 3.1
Důvody pro návrh nových modulů ........................................................................... 19
3.2
Vývojové prostředí Delphi ....................................................................................... 19
3.3
Moduly jazyka P42 a jejich včlenění do Delphi ....................................................... 20
3.4
Syntaxe jazyka .......................................................................................................... 24
3.5
Interpretace slov v jazyce P42 .................................................................................. 24
3.6
Porovnání jazyka Forth a jazyka P42 ....................................................................... 24
3.7
Rozdíl v implementaci P42 proti standardnímu jazyku Forth .................................. 27
Slovníky zásobníkového jazyka P42 ............................................................................. 29 4.1
Základní slovník P42_base ....................................................................................... 30
4.2
Slovník pro vytváření tiskových sestav P42_VREP ................................................ 33
4.3
Slovník pro práci s databázovými objekty P42_VDBT ........................................... 34
4.4
Slovník pro práci s teletextem P42_VTTX .............................................................. 35
Použití zásobníkového jazyka pro vytváření výstupních sestav.................................... 37 5.1
Možnosti tisku výstupních sestav v Delphi .............................................................. 37
5.2
Případová studie ....................................................................................................... 40
5.2.1
Popis aplikace ................................................................................................... 40
5.2.2
Požadavky na výstupní sestavy formulářového typu ....................................... 46
5.2.3
Modul pro vytváření tiskových sestav .............................................................. 47
Další možnosti použití zásobníkového jazyka P42 ....................................................... 54 6.1
Použití zásobníkového jazyka k údržbě dat v aplikacích ......................................... 54
6
6.2
Použití zásobníkového jazyka pro vytváření teletextových stran ............................. 55
Závěr ...................................................................................................................................... 57 Terminologický slovník........................................................................................................ 59 Literatura a zdroje ................................................................................................................. 62 Seznam obrázků .................................................................................................................... 63 Seznam tabulek ..................................................................................................................... 64 Seznam příloh ....................................................................................................................... 64
7
ÚVOD Téma diplomové práce jsem si zvolila protože se použitím zásobníkových jazyků v praxi zabývám. Podklady a řešení uvedené v diplomové práci vychází z reálné potřeby akciové společnosti Sazka, kde jsem jako programátorka dostala za úkol vyřešit sadu problémů s tiskovými sestavami. Uživatelé, kteří s tiskovými sestavami pracují, měli zejména následující požadavky, které jsou v dalším textu vysvětleny: možnost úpravy tiskové sestavy, zachování historie tiskových protokolů, redukci velikosti spustitelného exe souboru , vytvoření BMP, JPG z výstupních sestav. Ve
společnosti Sazka,
a.s.
se
denně
provádějí
různá
losování
většinou
v podvečerních a večerních hodinách, přičemž časový úsek od losování do prezentace výsledků v médiích bývá pouhých 30 až 60 minut. V případě nestandardních a chybových situací musí vedoucí losování okamžitě rozhodnout o vhodné a rychlé nápravě chyby. V případě výpadku podnikové sítě, SQL serveru, poruchy počítače či lidské chyby (např. zadání chybného data losování, přenášeného Jackpotu z minulého tahu, vylosovaných čísel, vypočítaných výher atd.) musí mít vedoucí losování možnost data ve všech navazujících procesech urychleně změnit a bezprostředně vytvořit protokoly o losování pro státní dozor, notáře a média. Následně pak musí správné údaje prezentovat na Internetu, Teletextu, IVR (tj. Interactive Voice Response, resp. Automatický hlasový systém) a odeslat emailem registrovaným odběratelům. Vzhledem k tomu, že se výstupní protokoly často mění, bylo třeba umožnit tisk „historických“ výstupních sestav. Protože se původní návrhy uchovávaly v projektu aplikace, výsledný spustitelný exe soubor se neúměrně rozrůstal, tudíž potřeba redukce velikosti přeloženého spustitelného souboru byla opodstatněná. Vytištěné výstupní protokoly se skenovaly a takto uložené se posílaly do dalších návazných procesů. Možnost ukládání reportů přímo v aplikaci v elektronické podobě (BMP, JPG) byla další žádost uživatelů. Ve společnosti byla již dříve vytvořena sada modulů P42 založená na zásobníkovém jazyce Forth a to modul základní, modul pro práci s databázovými objekty a modul pro práci
8
s teletextem. Pro řešení zadaného úkolu jsem proto naprogramovala modul P42_Vrep s vlastnostmi, řešící problémy uživatelů s tisky. Tento nový modul musel být do aplikací implementovatelný stejným způsobem jako předchozí moduly, a musel být schopný spolupracovat s objekty prostředí Delphi 6, ve kterém je většina aplikací ve společnosti vytvořena.
Hlavní cíle práce Hlavním cílem práce je popsat možnosti využití zásobníkového jazyka pro řízení výstupních sestav: popsat a zhodnotit problematiku tisku výstupních sestav u provozních aplikací, analyzovat stávající možnosti, navrhnout vlastní řešení problémů pomocí zásobníkových jazyků, zdokumentovat slova v jazyce P42, uvést příklady nasazení jazyka v praxi, zdokumentovat skript pro výstupní sestavu, ukázat možnosti dalšího využití jazyka P42.
Obsah práce Diplomová práce je rozdělena na dvě navazující části, teoretickou a praktickou. V teoretické části jsou stručně charakterizovány zásobníkové jazyky, jejich historie, použitelnost, výhody a nevýhody a to vše s ohledem na konkrétní potřeby řešení. Dále je charakterizován nově vyvinutý zásobníkový jazyk P42 a popis předem definovaných slov a návodu na jejich použití i s příklady a s grafickými ukázkami. Praktická část se týká popisu implementace modulu P42 do prostředí Delphi. Poté obsahuje případovou studii – zadání problému a jeho řešení. Vzhledem k tomu, že v současné době programuji v Delphi 6, vývojovém prostředí firmy Borland, jsou pak v praktické části použity ukázky obrazovek vytvořených v Delphi 6 a částí zdrojových kódů též v programovacím jazyce Object Pascal, jež Delphi využívá.
9
Přínosy v praxi Problémy, podobné problému řešenému v diplomové práci se vyskytují i v jiných společnostech a čtenář po přečtení diplomové práce může řešení využít v situacích, které nelze řešit pouze se standardními moduly dodávanými s vývojovým prostředím Delphi.
10
1 CHARAKTERISTIKA ZÁSOBNÍKOVÝCH JAZYKŮ A MOŢNOSTI JEJICH VYUŢITÍ Tato kapitola je věnována základním vlastnostem zásobníkových jazyků, vysvětluje princip zásobníků, notaci a postup při zpracování takovéhoto výrazu. Dále se věnuje možnostem využití a příklady jazyků, které jsou na zásobníku založeny. Základní vlastnosti zásobníkových jazyků jsou: jedná se o jazyky hybridní, pracují na principu zásobníku, používají postfixovou notaci.
Jazyky interpretované Interpretované jazyky jsou jazyky, které jsou překládány až za běhu programu. Bývají pomalejší. Vždy se musejí spouštět v interpretu. K interpretačním jazykům např. patří programovací jazyk Basic a skriptovací jazyky Python či PHP. ZÁ S O B N ÍK
A
A
B
B
A
C
C
B
C
B
A
B
A
D
D
A
A
Obrázek 1 – Princip zásobníku (zdroj: autorka)
Princip zásobníku Princip zásobníku ukazuje Obrázek 1. Při každém požadavku na vyjmutí prvku ze zásobníku se vybere prvek naposledy vložený, tj. „ten nejmladší“. Jak uvádí [5], v této souvislosti se také používá zkratka LIFO (Last In First Out – poslední vložen, první vyjmut).
11
Příkladem zásobníku z reálného světa může být zásobník papírů u tiskáren, kde papír navrchu je odebrán nejdříve. 100 6 10 * - 4 12 + /
100 6 10 10 6 60
100 6 100 10
6 100 násobení: 10 a 6 se vyjmou ze zásobníku
100
výsledek násobení 6*10 se uloží do zásobníku
60 100
odčítání: 60 a 100 se vyjmou ze zásobníku výsledek odčítání 100-60 se uloží do zásobníku
60 100 40
40
4
4
40
12
12
4
12 4
40
16
sčítání: 12 a 4 se vyjmou ze zásobníku výsledek sčítání 4+12 se uloží do zásobníku
16 40
dělení: 16 a 40 se vyjmou ze zásobníku
16 40 2,5
40
výsledek dělení 40/16 se uloží do zásobníku
2,5
Obrázek 2 – Grafické znázornění zpracování výrazu 100 6 10 * - 4 12 + / (zdroj: autorka)
Postfíxová notace Jak je uvedeno v [10] v postfixové notaci (někdy nazývaná reversní polská notace či RPN – Reverse Polish Notation), je situace opačná než u prefixové notace. V zápisu výrazu každý operátor následuje až po operandech, ke kterým patří. Operand může být buď číselná hodnota nebo opět výraz, který je také v postfixové notaci. Výrazy se vyhodnocují vždy zleva doprava. Pořadí vyhodnocování je plně určeno strukturou výrazu a v zápisu tudíž nejsou závorky. Ačkoli se zdá, že je postfixová notace pro někoho značně nepřehledná, její silná stránka spočívá ve snadné manipulaci s výrazy
12
uloženými v zásobníku. Při vyhodnocování stačí jeden průchod výrazem zleva doprava s využitím zásobníku na ukládání číselných hodnot. Příklad zpracování výrazu ukazuje Obrázek 2. Postfixová notace se používá např. u kalkulaček nebo v některých překladačích.
Operand:
1 např.100 Operand se vloží do zásobníku
Znaménko: např.+
Ukončení:
10
ze zásobníku se vyzvednou dva vrchní operandy a provede se operace definovaná znaménkem. Výsledek se vloží do zásobníku výsledek (hodnota výrazu) je jako jediné číslo v zásobníku
Tabulka 1 – Postup při zpracování skriptu Zápisy v postfixové notaci 60 100 100 60 50 100 100 50
/ /
( ( ( (
výsledek výsledek výsledek výsledek
je je je je
mínus 40 ) 40 ) 0,5 ) 2 )
Moţnosti vyuţití zásobníkových jazyků Podle
[4] jsou zásobníkové jazyky
používaný v nejrůznějších oblastech od
programování jednočipových mikroprocesorů přes řídící systémy radiolokátorů a jiných zařízení až po tvorbu špičkových her. K nejznámějším programům zásobníkových jazyků je program Postscript, který používá většina chytřejších tiskáren pro realizaci náročnějších tisků. Styl programování používaný v jazyce Forth používají i "assemblery" platforem Java a .NET. U obou se kód napsaný původně v nějakém vyšším programovacím jazyce převádí do podoby, která je ideově shodná s kódem zapsaným v jazyce Forth. Další jazyk, který je založen na podobném principu je Jazyk Joy. Dle [11] jde o jazyk, který vznikl v akademickém prostředí a je odvozen od velmi jednoduchých funkcionálních základů s minimalistickou syntaxí, přičemž samotný výpočet (vyčíslení funkcí) je založen na manipulaci se zásobníky.
1
Důležité je upozornit na správné pořadí operandů u nekomutativních operátorů
13
Jak uvádí [12], jazyk Factor je zaměřen spíše prakticky, má již množství knihoven a kvalitní a použitelné integrované vývojové prostředí (IDE). O tom, že je jazyk prakticky použitelný, svědčí i to, že je v něm implementován například HTTP server, služba RPC, parser jazyka XML, poměrně rozsáhlá knihovna pro tvorbu grafického uživatelského rozhraní (GUI), ovladače pro připojení k různým databázím (MySQL, Postgres) a tvorbu popř. zpracování výsledků SQL příkazů, grafické aplikace využívající OpenGL, jednoduché hry typu Tetris, emulátory jazyků založených na Lambda kalkulu nebo dokonce emulátory starobylých automatových her typu Space Invaders.
Shrnutí Tato kapitola je zaměřena na popis základních vlastností zásobníkových jazyků, vysvětluje princip zásobníku a zásady při zpracování postfixové notace. Dále ukazuje, že využití principu zásobníku pro programovací jazyky není zastaralé, ale používá se i v současnosti. V následující
kapitole
bude
důkladněji
popsán
jeden
z
programovacích jazyků založených na principu zásobníku a to jazyk Forth.
14
nejznámějších
2 ZÁSOBNÍKOVÝ JAZYK FORTH V této kapitole je popsán vznik jazyka Forth, základní vlastnosti jazyka a jeho výhody a nevýhody. Logika a princip jazyka FORTH je pramenem pro návrh sady nově vyvinutých modulů, použitých v akciové společnosti Sazka a nazvaných P42. Shrnutí výhod a nevýhod jazyka Forth pak sloužilo jako podklad pro rozhodnutí, zda princip zásobníku v praxi použít.
2.1 Historie jazyka Forth Jazyk Forth byl vyvinut v šedesátých letech minulého století jediným člověkem, a to pro jeho osobní potřebu. Programátor a tvůrce, Charles „Chuck“ Moore byl a dodnes je považován za významnou osobnost v oblasti výpočetní techniky. Byl to rozený minimalista, a tato jeho vlastnost je zjevná i v jeho dalších nesčetných systémech a programech. V době vzniku jazyka Forth bylo zvykem rozdělovat programovací jazyky na generace, proto Charles Moore pojmenoval svůj programovací jazyk jako představitele nové, čtvrté generace malých počítačů. Podle [5] systémy založené na jazyku Forthu byly vytvořeny proto, že nepotřebovaly žádnou podporu ze strany operačního systému – ve skutečnosti se operační systém vůbec nenahrával do operační paměti. V dalších letech se to pro některé aplikace ukázalo jako velká výhoda, zejména se projevil rychlejší přístup na disky a velmi rychlé přepínání kontextu běžících procesů. Jazyk se posléze ukázal jako úspěšný. K většímu rozšíření jazyka Forth došlo po roce 1971 a to po jeho prvním významném nasazení v Arizoně, v Národní Rádio Astronomické observatoři. Pomocí jazyka Forth byl ovládán, řízen a zaměřován jedenáctimetrový radioteleskop a s využitím jazyka Forth byla následně sbíraná data ukládána na magnetickou pásku. Firma Forth Inc., se spoluzakladatelem Charlesem Moorem dostala další zakázky na zabudování klonu jazyka (MicroForth) na skupiny osmibitových mikroprocesorů CDP1802, Motorola 6800, MOS 6502 a Zilog Z80. Nadále vznikalo mnoho modifikací a verzí jazyka Forth, jak komerčně používaných, tak úzce specifických, což vyústilo k určení normy jazyka. Jako standard Mezinárodní astronomické unie byl jazyk Forth přijat v roce 1976.
15
2.2 Základní vlastnosti jazyka Forth Forth je jazyk s jednoduchou syntaxí. Podle [5] jeho nasazení může být značně efektivní v situacích, kdy je kladen důraz na jednoduchost ovládání nebo na malou velikost systému. Hodí se k propojení s dalšími systémy druhých výrobců. V jazyce Forth jsou, na rozdíl od jiných zásobníkových jazyků, např. jazyka Joy, jsou podprogramy a funkce označována jako tzv. Slova. Podle [4], úplný program jazyku Forth je tvořen posloupností tzv. slov, oddělených mezerami nebo znaky „Nová řádka“. Slovo může být označeno (pojmenováno) jakýmkoliv znakem kódu ASCII s výjimkou mezery a řídících znaků nebo libovolnou posloupností těchto znaků neobsahujících mezeru ani řídící znaky. Každému slovu je jednoznačně přiřazena nějaká činnost a slovo tedy představuje obdobu procedury. Tato procedura očekává všechny své parametry na zásobníku, odkud je po převzetí vymaže a uloží tam případné výsledky. Definice všech slov, neboli popisy ke slovům přiřazených činností, jsou uloženy v tzv. slovníku, který bývá někdy označován jako třetí zásobník. Slouží k uchování definic nových slov, hodnot proměnných, polí apod. Slova z něj můžeme přidávat a opět je z něj odmazávat obdobně, jako položky ze zásobníku. Jazyk používá tzv. programování zdola nahoru (bottom-up programming) . Nejdříve se definují slova jednoduchá, základní a
poté pomocí slov již známých se přistupuje
k definování slov složitějších. Specifickou vlastností jazyka Forth je, že tato postupně tvořená slova nejen definujeme, ale také zároveň odlaďujeme. Okamžité odlaďování slov je umožněno tím, že všechna slova očekávají své vstupní parametry na zásobníku a tamtéž ukládají své výsledky. Není tedy nutné vytvářet zvláštní procedury, předávající testovaným slovům parametry a tisknoucí jejich výsledky, neboť tyto činnosti můžeme jednoduše realizovat „ručně“. Jazyk samozřejmě implementuje množinu typů proměnných jako jsou numerické a řetězcové typy nebo pole. Nabízí obvyklé struktury jako cyklus (DO, WHILE, FOR) či podmínku (IF, ELSE, ENDIF ). Forth je uzpůsoben k neustálému rozšiřování slov dle potřeby programu. Programátoři mohou sami definovat slova nová a ta pak snadno implementovat
16
2.3 Výhody a nevýhody jazyka Forth Dle [5] je jazyk Forth svým původem dost podobný programovacímu jazyku Perl. Nebyl vytvořen v akademickém prostředí (na rozdíl od jazyků LISP, Pascal nebo SmallTalk), ale byl přímo určen na zpracování složitých výpočtů s větším množstvím rozhodování a za pomocí podprogramů, funkcí a SLOV. Podle [9] při vzniku jazyka Forth byl výkon počítačů poměrně malý a nebyl levný ani strojový čas. To nutilo programátory k rychlému a jednoduššímu vývoji programů s minimálními nároky na velikost operační paměti. Proto vznikaly jazyky na jedné straně optimalizované co do nároků na paměť, výkon a rychlost a na druhé straně na použití pro daný problém. Z dnešního pohledu se všechna tato omezení mohou jevit absurdní. Přesto existují situace, kdy se tato minimalistická řešení ukazují jako výhody.
Výhody
Nevýhody
Jazyk byl navržen pro praktické používání
Postfixová notace
Možnost vytváření elegantních jednolitých Nevhodný na programování velkých algoritmů
robustních systémů
Snadná implementace programu Malá náročnost na systémové zdroje Snadná přenositelnost Tabulka 2 – Výhody a nevýhody jazyka Forth
Protože je kód interpretu velmi malý, je přenositelnost jazyka na jiné systémy poměrně velká. Zbytek implementace jazyka pak tvoří pouze slovník, který je standardní a snadno rozšiřitelný. Na druhou stranu postfixová notace řídících příkazů a výpočetních operací se někdy zdá jako problematická a některým programátorům může zpočátku i vadit. Postfixovou notaci používá např. programovací jazyk Postscript, určený ke grafickému popisu tisknutelných dokumentů, takže návyky na tuto notaci se dají použít v odvětví DTP.
17
Na robustní aplikace se hodí moderní objektově orientované nebo tzv. hybridní programovací jazyky, např. C++, Object Pascal, C#, Visual Basic .NET, ve kterých je použita moderní koncepce, kde jsou v programu jednotlivé prvky modelované reality seskupeny do entit, nazývaných objekty, a lze na ně uplatňovat základní vlastnosti objektově orientovaného
programování,
jako
např.
skládání
(composition),
zapouzdření
(encapsulation), dědičnost (inheritance), mnohotvárnost (polymorfismus).
Shrnutí Tato kapitola je zaměřena na popis základních vlastností zásobníkového jazyka Forth. Dále uvádí jeho výhody a nevýhody. Při souhrnu výhod a nevýhod se ukázalo, že jazyk Forth je vhodný jako vzor pro návrh sady modulů P42.
18
3 ROZŠÍŘENÍ JAZYKA FORTH PRO POUŢITÍ PŘI OBJEKTOVĚ ORIENTOVANÉM PROGRAMOVÁNÍ V této kapitole jsou vysvětleny důvody proč bylo vybráno řešení přes zásobníkové jazyky, dále je popsáno rozšíření jazyka Forth tak, aby mohl pracovat i s objektově orientovanými objekty vývojového prostředí Delphi, vysvětlen způsob interpretace slov v jazyce P42 a zdůrazněny rozdíly mezi jazykem Forth a jazykem P42.
3.1 Důvody pro návrh nových modulů Při řešení aplikací v Sazka, a.s. se často vyskytovaly případy, kdy bylo nutno v provozu zasáhnout do funkcionalit aplikací anebo do dat výstupních protokolů a to bez úpravy zdrojového kódu aplikace. Bylo také nutno zachovat historii funkcionalit, dále pak různé verze algoritmů výpočtu a zejména starší formáty výstupních tiskových protokolů. Uchovávat veškerá tato historická data v aplikaci přinášelo nadměrný nárůst velikosti výsledného zkompilovaného spustitelného souboru. Na základě výše popsaných požadavků se nám jevilo jako nejvýhodnější využít již velmi dobře propracovaného jazyka Forth. Významnou roli hrála snadná implementace a možnost navázání na objekty ve vývojovém prostředí Delphi. Proto byly navrženy moduly jazyka P421 implementovatelné do aplikací v Delphi 6. Standard jazyka Forth ale musel být upraven, a to nejen v oblasti slovníku (nová slova pro potřebu Sazka a.s.), ale i ve struktuře dat (struktura zásobníků). Snažili jsme se, aby co nejvíce vlastností jazyka zůstalo kompatibilních se standardem jazyka Forth..
3.2 Vývojové prostředí Delphi Delphi je komplexní vizuální vývojové prostředí umožňující snadno a rychle dodávat výkonné aplikace pod operačním systémem Windows. Podporuje mnoho databázových platforem. První verze Delphi byla uvedena na trh firmou Borland v roce 1994. Programovací prostředky vývojového prostředí jsou založeny na jazyce Object Pascal, kompilátor převádí zdrojový kód do kódu strojového. Aplikace vytvořené v Delphi jsou rychlé, ucelené, poskytují příjemná uživatelská rozhraní.
1
Jazyk pojmenoval autor základních modulů Ing. Vladimír Pecka (P=Pecka, 4=Forth, 2=druhá verze), programátor, který
si prošel všemi stádii vývoje programování.
19
V současné době je na trhu již verze Delphi 2010 for Win32 v edicích Professional, Enterprise a Architekt.
3.3 Moduly jazyka P42 a jejich včlenění do Delphi Moduly jazyka P421 jsou vytvořeny ve vývojovém prostředí Delphi, jedná se o tzv. unity, což jsou samostatně kompilovatelné programové jednotky (kolekce konstant, typů dat, procedur a funkcí).
Obrázek 3 – Přidání modulů jazyka P42 do projektu aplikace
Základním modulem je modul P42_base. V tomto modulu resp. unitu je základ jazyka Forth, interpret, pomocné procedury a slovník se všemi standardními a obecně použitelnými slovy. K základnímu modulu P42_base přísluší moduly dalších slovníků: modul pro práci s datovými tabulkami P42_Vdbt, 1
Moduly se tč. dají použít pouze ve vývojovém prostředí Delphi. Do budoucna se uvažuje moduly zapouzdřit do dll
knihoven k použití v jiných vývojových prostředích. Úpravy by vyžadovaly důkladnou analýzu pro nastavení vazebních rozhraní pro interface.
20
modul pro práci s tisky P42_VRep, modul unit pro práci s teletextem P42_Vttx. Další moduly se slovníky se dají dle potřeby snadno doprogramovat.
Při implementaci do konkrétní aplikace je nezbytné vždy použít základní modul P42_base, ostatní moduly se přidávají k aplikaci podle potřeby. Potřebné unity jazyka P42 se dle potřeby připojí do projektu aplikace1 stejným způsobem, jako je přidávají jiné moduly2. V unitu, ve kterém se budou moduly P42 používat, se do uses3 tyto moduly přidají (Obrázek 4). Tím se moduly P42 správně přičlení.
Obrázek 4 – Přidání modulů P42 do uses
1
Aplikace v Delphi se nazývá projekt, skládá se z různých částí, které jsou ukládány do samostatných souborů.
2
Přidání nového modulu/unitu do projektu se provede přes hlavní menu -> Project -> Add to project -> a výběr
3
Klausule uses slouží k nadefinování unit, které připojujeme k danému unitu.
21
V unitu P42_base jsou procedury a funkce zapouzdřeny do třídy (class1) P42F_base typu TForm2. V této třídě jsou následující procedury a datové struktury veřejného typu a tedy mohou být využity v dalších modulech aplikace. Jsou také využívány v dalších modulech slovníku jako P42_vdbt, P42_vtxt a P42_vrep. Veřejné datové struktury modulu P42_base Systémové proměnné SYST: record FORM:TComponent; LIST:TCustomMemo; LVOC:TStrings; MODE:byte; TRACE:boolean; THOUSANDSEPARATOR:Char; DECIMALSEPARATOR:char; IGNWORD:boolean; RESULT:variant; BREAK_LPRG:boolean; end; Parametry pro komunikaci s aplikací viz slovo % PARAMETR:array[0..9] of variant; Parametry pro systémové parametry viz slovo % SYSPAR:array[0..9] of variant; Informace o stavu ukazatelů zásobníků NUMB_ERR:integer; Počet chyb INFO:record PROGTQ:integer; PROGSQ:integer; DICTTQ:integer; DICTSQ:integer; end; Stringlist pro komunikaci s aplikací viz slovo DATA@ DATA:TStringList;
Veřejné procedury a funkce a data modulu P42_base Vytvoření instance modulu a inicializace procedure OPEN(OWNER:TComponent;LIST:TCustomMemo;LVOC:TStrings); Uzavření modulu a uvolnění procedure CLOSE; Předat typ položky variant jak písmeno C,N,L,D,X function TYPVARIANT(V:variant):Char; Konverze variant na DateTime function VARIANTTODATETIME(V:variant):TDateTime; Slova ze slovníku do seznamu definovaného v proceduře OPEN procedure LWORDTOLIST;
1
Class je strukturovaný datový typ nadefinovaný uživatelem. Deklarujeme ho se pomocí klíčového slova class. Uvnitř třídy jsou pak určeny jednotlivé objekty. 2
TForm je komponenta, která reprezentuje v aplikaci standardní okno, kde o základní class při tvoření GUI aplikací
22
Uložit stav ukazatelů a syst. Proměnných procedure SAVE_PRGPOINT; Obnovit stav ukazatelů a syst. Proměnných procedure REST_PRGPOINT; Základní inicializace modulu procedure INIT(OWNER:TComponent;LIST:TCustomMemo;LVOC:TStrings); Vložit informace o slovu do slovníku procedure INS_DICT(ID:string;CFA:TPROC_DIC;PFA:longint;TYP:byte); Aktivovat slovník procedure INIT_DICT; Přečíst a přeložit program v P42 ze souboru function LOAD_PROG(PH:string;SECT:string;BLOK:string;LIST:TStrings=nil):integer; Přečíst a přeložit program v P42 ze souboru function LOAD_DICTINSECT (PH:string;SECT:string;KEY:string;LIST:TStrings=nil):integer; Speciální funkce pro výpočet COMMAND s hodnotou VAL výsledek do Result function CALC(COMMAND:string;VAL:variant):variant; Interpretace resp. Kompilace COMMAND function INTERPRET(COMMAND:string):variant; Nulovat zásobník US procedure CLEAR_STACK; Hodnota z TOP US do Result function POP(TYP:string;var FL_OK:boolean):variant; Vložit hodnotu VAL do US procedure PUSH(V:variant); Hodnota z TOP RS do Result function POP_RST(var TYP:word):longint; Hodnota z pozice N RS do Result function PICK_RST(N:integer;var TYP:word):longint; Vložit hodnotu LN do RS procedure PUSH_RST(TYP:word;LN:longint); Vložit hodnotu LN do ExitStack procedure PUSH_EST(TYP:word;LN:longint); Vložit hodnotu z ExitStack do Result function POP_EST(var TYP:word):longint; Vložit hodnotu z ProgramStack do Result function POP_PROG(var TYP:byte):variant; Vložit hodnotu V do ProgramStack procedure PUSH_PROG(TYP:byte;V:variant); Najít komponentu podle jména v aktivním formuláři function FIND_COMPONENT(NAME:string):TComponent; Zpracovat chybu procedure ERROR(ERR:string); Pozici US do Result function GET_STACKTQ:integer;
23
3.4 Syntaxe jazyka Syntaxe jazyka P42 je převzata z jazyka Forth. Ve slovnících jazyka P42 oproti jazyku Forth některá slova chybí a některá slova bylo potřeba doprogramovat.
3.5 Interpretace slov v jazyce P42 Interpretace může probíhat ve dvou módech, a to exekučním nebo kompilačním. Přepínání mezi exekučním a kompilačním módem je řízeno přímo z interpretovaného textu. Např. slovo : (dvojtečka) přepíná do kompilačního módu, slovo ; (středník) přepíná do exekučního módu. Tato slova ovšem vykonávají další činnost, více pak kapitola 4.1. K přepnutí do exekučního módu slouží také slovo [ (levá hranatá závorka) a k přepnutí do kompilačního módu slouží slovo ] (pravá hranatá závorka).
3.6 Porovnání jazyka Forth a jazyka P42 Tabulka 3 zobrazuje dostupné možnosti v porovnávaných jazycích Porovnání jazyka Forth a jazyka P42
Forth P42
Zdrojem textu je převážně soubor nebo jeho část
Ano
Ano
Zdrojem textu může být i řetězcová konstanta umístěná přímo v aplikaci
Ano
Ano
Slovem může být slovo ze slovníku jazyka
Ano
Ano
Slovem může být jméno objektu aktuálního formuláře v Delphi typu
Ano
TControl1 Ve slovníku může být hodnota typu variant2
Ano3
Tabulka 3 – Porovnání jazyka Forth a jazyka P42
1
Jedná se o vizuální komponenty, tzn. uživatel je může v reálném čase vidět. Mají mnoho různých vlastností.
2
variant: Typ není předem nadefinován, je určen až za běhu programu, podle toho, jaká hodnota bude proměnné přiřazena.
Slouží pro speciální typy programů. 3
V jazyce Forth jde o prvek interpretačního řetězce
24
Start
Interpreter je v modu exekučním
Ne
Ano
Ne
Slovo je ve slovníku Ano
Slovo je jméno objektu formu typu TControl
Slovo se vykoná podle jeho sémantiky
Ne
Ano
Slovo je konstanta typu variant
Slovo se dá do zásobníku jako řetězec
Ano
Slovo je ve slovníku Ano Odkaz na slovo se se uloží do pole programu
Konstanta se přidá do zásobníku
Ne
Slovo je jméno objektu formu typu TControl
Ne
Ano Slovo se dá do pole programu jako řetězec pomocí slova LIT
Slovo je konstanta typu variant
Ne
Ano Konstanta se dá do pole programu jako řetězec pomocí slova LIT
Hlášení chyby
Stop
Obrázek 5 – Postup zpracování slova v modulu jazyka P42_base.pas (zdroj: autorka)
25
Ne
Popis pro Obrázek 5 – Postup zpracování slova v modulu jazyka P42_base.pas 1. Interpret je v módu exekučním 1.1
Slovo je ve slovníku - Slovo se vykoná podle sémantiky
1.2
Slovo není ve slovníku – 1.2.1
Slovo je jméno objektu formuláře typu TControl – do zásobníku se dá index objektu
1.2.2
Slovo není jméno objektu 1.2.2.1 Slovo je konstanta typu variant. Slovo se uloží do zásobníku 1.2.2.2 Slovo není konstanta typu variant – hlášení chyby.
2. Interpret je v módu kompilačním 2.1
Slovo je ve slovníku - Odkaz na index slovo se uloží do oblasti programu
2.2
Slovo není ve slovníku – 2.2.1
Slovo je jméno objektu formuláře typu TControl – do oblasti programu se dá index objektu jako parametr systémového slova LIT (nutno zajistit, aby při spuštění kompilovaného programu byl tento index přesunut do zásobníku viz slovník )
2.2.2
Slovo není jméno objektu 2.2.2.1 Slovo je konstanta typu variant do oblasti programu se dá tato konstanta jako parametr systémového slova LIT 2.2.2.2 Slovo není konstanta typu variant – hlášení chyby.
Příklad: kompilujeme nové slovo NEW : NEW TIME ; slovo NEW uloží do uživatelského zásobníku čas, kdy bylo slovo spuštěno. Jestliže ale napíšeme : NEW [ TIME ] LITERAL ;
26
pak slovo NEW uloží do uživatelského zásobníku čas, kdy bylo předloženo ke kompilaci. Slovo TIME se totiž provedlo v módu exekučním a tento čas byl do programu slova NEW uložen slovem LITERAL jako konstanta. Aby byla konstanta vložena do programu, je nutno použít slovo LITERAL
3.7 Rozdíl v implementaci P42 proti standardnímu jazyku Forth V klasickém jazyce Forth se implementace skládá z funkční procedury innerinterpret a všechny ostatní funkce jsou standardně zařazeny jako slova ve slovníku. Procedura innerinterpret je obecně velmi malá a je zpravidla napsána ve strojovém kódu. Při implementaci jazyka P42 bylo od této koncepce upuštěno z důvodu rychlosti interpretace. Funkce, které nejsou bezprostředně potřebné pro činnost aplikace, jsou implementovány jako procedury, které nejsou zařazeny ve slovníku, např. čtení slova ze vstupního proudu nebo vyhledávání slova ve slovníku. Datové struktury Uživatelský zásobník (US) je na rozdíl od standardního jazyka Forth, který je typu word1, typu variant. Od toho se pochopitelně odvíjí zejména rozšíření vlastností slov aritmetiky a vlastnosti datových struktur např. slova VARIABLE, CONSTANT atd. Jiná slova se naopak stala zbytečná a byla ze slovníku vypuštěna. Zásobník návratových adres je v obou případech typu integer2. Slovník v jazyce Forth je navržen tak, že každé slovo obsahuje hlavičku slova a výkonný kód slova, a to buď ve strojovém kódu nebo v jazyce Forth. Slovník v jazyce P42 (viz. struktura slovníku) obsahuje pouze hlavičku slova, ve které je dále odkaz na proceduru v jazyce Pascal (CFA3) nebo odkaz do struktury programu (PFA4). Navíc je ve struktuře položka VAL, která se využívá v proměnných a konstantách. 1
word: nabývá hodnot 0.. 65 535, jde o 2 bytový typ bez znaménka
2
integer: nabývá hodnot od –2147483648 do 2147483647 , jde o 32-bitové celé číslo se znaménkem
3
CFA: zkratka pro Code Field Adress (ukazovátko do pole kódu adres)
4
PFA: zkratka pro Program Field Adress (ukazovátko do pole programu předkompilovaných slov)
27
Struktura slovníku DICT: record TQ:integer; TQ_OLD:integer; CONT:array[0..SQ_DICT] of record TYP:byte; ID:string[30]; CFA:TPROC_DIC; PFA:longint; VAL:variant; end; end;
// slovník // top slovníku // top slovníku k historii // // // // //
typ slova / C, E, I název slova odkaz na proceduru odkaz na program hodnota typu variant
V exekučním módu se text překládá do zásobníku PROG, který obsahuje hodnoty nebo ukazovátka potřebná pro interpretaci tohoto přeloženého programu. Položka TYP specifikuje jak se má hodnota VAL interpretovat. PROG:record TQ:longint; TQ_OLD:longint; PTR_PFA:longint; CONT:array[0..SQ_PROG] of record TYP:byte; VAL:variant; end; end;
//typ hodnoty //hodnota
Interpretace textu probíhá následujícím způsobem Zpracuje se jedno slovo z textu podle vývojového diagramu (Obrázek 5). Pokud nastane situace že slovo je ve slovníku a mód interpreteru je exekuční, potom se ze slovníku vezme ukazovátko (pointer) CFA, které ukazuje na kód a je buď spuštěna procedura tomuto slovu odpovídající, nebo je spuštěna posloupnost slov uložených kompilací v zásobníku PROG. Po skončení interpretace slova se dále pokračuje v interpretaci textu. Slovník a přeložený program se ukládají do samostatných zásobníků, stejně tak zásobník návratových adres tvoří samostatný zásobník a to z důvodu rozdílné struktury zásobníků. Shrnutí V této kapitole byl představen interpret jazyka P42 a ukázány rozdíly mezi P42 a standardem Forth. Důvody, proč bylo vybráno řešení přes zásobníkové jazyky se ukázalo být hlavně snadná implementace modulů P42 do vývojového prostředí a možnost navázání modulů na objekty v aplikacích Delphi.
28
4 SLOVNÍKY ZÁSOBNÍKOVÉHO JAZYKA P42 V této kapitole jsou popsány slovníky jazyka P42, vytvořené ve společnosti Sazka,a.s. Jedná se o slovník základní v modulu P42_base, slovník pro vytváření tiskových sestav v modulu P42_Vrep, slovník pro práci s databázovými objekty v modulu P42_Vdbt a slovník pro práci s teletextem v modulu P42_Vtxt. Stručný obsah modulů resp. slovníků zobrazuje Obrázek 6.
Obrázek 6 – Moduly jazyka P42 (zdroj: autorka)
Při využití modulů zásobníkových jazyků ve vývojovém prostředí Delphi je vždy nutno včlenit i modul základní, bez kterého by jiný, vybraný modul nepracoval. V základním modulu P42_base jsou předem nadefinována slova pro konstrukci slov nových, slova pro řízení vstupů a výstupů, slova pro matematické výpočty, pro práci se řetězci, pro formátování a konverzi, pro práci s časem atd. Modul pro tiskové sestavy P42_Vrep obsahuje definovaná slova pro kreslení do objektů, které mají metody toto umožňující. Jedná se o slova pro vykreslení rámečků, obdélníků, elips, víceřádkových textů s i bez rámečků s možností centrování a vertikálního
29
i horizontálního zarovnání. Do vykreslovaných objektů se dá načíst i externě umístěný text (např. v ini souboru) nebo externě umístěný obrázek. Pro práci se souborovými tabulkami a databázovými tabulkami na MS SQL serveru je používán slovník P42_Vdbt. Slova pro pohyb po tabulkách, vyhledávání a konverzi typů i kódových stran se využívají pro modifikaci databázových objektů. Pro modifikaci teletextových stran je navržen modul P42_Vtxt. Obsahuje slova pro nastavení barev textu a pozadí, pro konverzi formátů a pro vkládání textu do teletextové strany1. Veškerá slova, a to jak předdefinovaná ve slovníku, tak nadefinovaná uživatelem (např. ve skriptech), jsou case-insensitive, tzn. že použití slov není citlivé na velikosti písmen, malá a velká písmena se nerozlišují. Symboly zkratek jsou podrobně vysvětleny (viz Příloha 4).
4.1 Základní slovník P42_base Základní slovník (Příloha 5) obsahuje standardní slova jazyka Forth, přičemž je slovník rozšířen o některá slova pro práci s objekty Delphi. V tomto modulu jsou častá a obecně používaná slova.
Konstrukční slova Konstrukční slova jsou slova, při jejichž použití se vytvářejí slova nová. Může jít ale také např. o slova vhodná pro definici konstanty, proměnné, systému proměnných typu record2. nebo o definici pole.
Příkazy pro řízení, vstupy a výstupy, informace o nadřazené aplikaci Jsou to slova určená pro řízení vstupů, výstupů a pro zohlednění informací z nadřazené aplikace. Jde např. o slova, která mohou sloužit pro umístění komentáře k programu, načtení programu do nadřazené aplikace, nastavení a ukončení trasování
1
Ve spolupráci s modulem P42_Vdbt (napojení na tabulky SQL) je ve společnosti využit prakticky každých 5 minut
24 hodin denně pro automatickou modifikaci teletextu z našich aplikací. 2
Datový typ record je složený datový typ. Může být sestaven z jednoduchého typu, nebo i dříve definovaných složených,
případně indexovaných typů.
30
s výpisem zásobníku krok za krokem, výpisu stavu uživatelského zásobníku, výpisu všech nadefinovaných slov jazyka či dostupných objektů v nadřazené aplikaci, předání a zobrazení chybové hlášky apod.
Základní početní operace V této části jsou popsána slova k základním početním operacím v aritmetice (sčítání, odčítání, násobení, dělení), slova pro práci s logickými operátory a slova určená pro výpočet goniometrických funkcí sinus a kosinus. Vzhledem k tomu, že uživatelský zásobník (US) je typu variant, jsou slova pro aritmetiku rozšířena o typy, na které lze operaci provést.
Slova pro práci s řetězci Slova pro práci s řetězci slouží pro provádění operací nad řetězci a znaky. Patří sem vkládání, nahrazování a rušení znaků či částí řetězců, včetně vkládání a mazání prázdných mezer. Konverze znakových sad se dá doposud provádět mezi znakovou sadou Kamenický, Windows 1250 a Latin 2. Vzhledem k tomu, že typ variant může být řetězec, neobsahuje slovník slova pracující s řetězcem bytů v US, ale pouze s jednou položkou.
Slova pro formátování a konverze typů Nejčastější použití pro konverze datových typů spadá mezi konverze z jiných datových typů na typ string, dále konverze typu variant na typ numeric a konverze na typ Datum a/nebo Čas. Slova pro formátování nadefinují oddělovač pro tisíce a pro desetinná čísla. Pro formátování a konverze typů jsou použity standardní procedury a proměnné z jádra Delphi. Proto formátovací řetězce (masky) a oddělovače (separátory) odpovídají syntaxi Delphi
31
Slova pro práci se zásobníkem Slova jsou kompatibilní se standardem, ale pracují vždy s položkou uživatelského zásobníku typu variant, a to pouze pro typ numeric, string, date, logical a null. Zásobník můžeme např. nulovat, přehazovat pořadí prvků, duplikovat hodnoty nebo odstraňovat hodnoty na vrcholu zásobníku.
Programové konstrukce Programové konstrukce výrazně urychlují a zefektivňují vytváření programu. Jedná se o konstrukce slov pro definování podmínky a smyčky. Podmínky a smyčky umožňují ovlivňovat posloupnost vykonávání příkazů na základě jisté skutečnosti. Jde především o podmínky typu IF – ELSE - END, typu CASE - ENDCASE, konstrukce pro smyčky typu BEGIN - UNTIL, DO - LOOP a o nadefinovaná slova pro práci s cykly resp. vnořenými cykly a to o slova I a J. Tato slova nelze obecně použít v exekučním módu.
Relace Slova pro matematické relace jsou slova zobecňující vlastnosti vztahů jako je např. rovnost, větší než, menší či rovno než. Pomocí těchto operátorů porovnáváme dvě hodnoty.
Předdefinované konstanty Konstanta označuje pevně danou veličinu, která během své existence nemění svou hodnotu. Jde o nadefinovaná slova TRUE, FALSE a CRLF, které se stará o odřádkování. Jedná se o dvojici ASCII znaků a to pro CR s hodnotou 13 a znak LF s hodnotou 10.
Speciální výkonná slova Výkonná slova vykonávají specifickou činnost v programu a jsou vkládána do programu jinými slovy. Uživatel je zpravidla nevyužívá přímo, i když mu jsou dostupná. Jejich použití vyžaduje přesnou znalost funkce. Podrobná sémantika přesahuje tento popis slovníku.
32
4.2 Slovník pro vytváření tiskových sestav P42_VREP Slovník (Příloha 6) je určen pro kreslení do objektů Delphi, které mají vlastnost typu TCanvas1. Při použití se obsazují public proměnné CANVAS:TCanvas
// Plátno na které se kreslí
PAGEWIDTH:integer
// Rozměr objektu CANVAS v ose x
PAGEHEIGHT:integer
// Rozměr objektu CANVAS v ose y
Následující hodnoty jsou nepovinné pokud se nastaví ve skriptu slovem METRIKA M_HEIGHT:real v ose y
// Počáteční počet měrných jednotek na stránku
M_WIDTH:real v ose x
// Počáteční počet měrných jednotek na stránku
slovem ZOOM ZOOMX:real
// Počáteční stav zoom v ose x standardně 1
ZOMY:real
// Počáteční stav zoom v ose y standardně 1
Slovo !FONT nastavuje parametry fontu pro všechna následující slova, která pracují s fontem.
FONT:record
// Počáteční font HEIGHT:Extended; NAME:string; COLOR:TColor; STYLE:TFontStyles;
end;
Inicializace slovníku se provede public procedurou INIT Primárně je slovník určen k tisku reportů. Pro kreslení je použit objekt Delphi TPrinter. Tento slovník je využíván modulem Frm_Rep, který byl vytvořen pro zpracování tiskových sestav. Modul Frm_Rep je popsán v kapitole 5.2.3.
1
TCanvas: (plátno) vlastnost tříd na zobrazení grafiky (kreslení, vkládání bmp apod.)
33
Slova pro nastavení parametrů tisku Slova pro nastavení parametrů tisku jsou slova, která mají vliv na vzhled stránky, tj. např. šířka a výška stránky, metrika pro další nastavení (zda milimetry, pixely či jiné měřítko) apod.
Slova pro grafiku Slova pro grafiku jsou slova, která vykreslují objekty na plochu některých komponent. Vykreslovanými objekty mohou být prosté texty, texty v rámečku či texty v elipse, prázdné rámečky, elipsy a čáry. Dále je možné vložit na stránku grafický objekt (např. typu bitmapy). Některé objekty vyžadují nastavení dalších povinných či nepovinných parametrů jako např. barvu, šířku čáry, zarovnání textu.
4.3 Slovník pro práci s databázovými objekty P42_VDBT Slovník pro práci s databázovými objekty (Příloha 7) umožňuje přístup do objektových komponent typu TApolloTable a TADODataSet. TApolloTable je komponenta, která není součástí dodávky Delphi, ale je do Delphi dokoupena a doinstalována. Poskytuje mj. mechanizmus pro přístup do souborových tabulek typu FoxPro (.DBF/.FPT/.IDX/.CDX). TADODataSet je nevizuální komponenta dodávaná s Delphi, mj. umožňující přístup do databází a tabulek na SQL serveru. Pomocí uvedených slov se můžeme v tabulkách pohybovat, tabulky upravovat a v tabulkách vyhledávat. Dále slovník obsahuje slova ke konverzi mezi různými datovými typy a dále mezi nekompatibilními hodnotami stejných datových typů (datumové položky, NULL hodnoty apod.)
Slova pro modifikaci dat Slova pro modifikaci dat jsou slova pomocí nichž můžeme hodnoty tabulek modifikovat (měnit, přidávat záznamy apod.)
34
Slova pro pohyb, vyhledávání a selekci v tabulkách Slova pro pohyb, vyhledávání a selekci jsou slova pomocí nichž se můžeme v tabulkách pohybovat (posun o řádek, vyhledat začátek nebo konec tabulky, skočit na zadaný řádek), pomocí zadaného příkazu provádět příkazy jazyka SQL apod.
Slova pro konverzi Slova pro konverzi jsou slova pro převod hodnot typu variant do dalších typů. Např. datum uložené v uživatelském zásobníku je typu variant, ale do tabulky SQL se po převodu vloží jako typ DateTime. Slova nedovolí vkládat nepřípustné hodnoty. Jako příklad lze uvést hodnotu Null a rozdílné hodnoty pro minimální přípustné datum v objektech prostředí Delphi,na MS-SQL serveru a v souborových tabulkách.
4.4 Slovník pro práci s teletextem P42_VTTX Slovník (Příloha 8) je určen k modifikaci souboru teletextové stránky. Tyto stránky jsou dopředu vytvořeny v teletextovém editoru a uloženy jako šablona. Skript v jazyce P42 modifikuje tuto šablonu z kmenových dat. Práci se soubory jako načtení, uložení, kontrolní zobrazení a další zajišťuje samostatný modul, obsahující class TTX. Modul slovníku P42_VTTX je vázán s classem TTX přes public pole TTX.CURR_PG typu array[0..1023] of byte. Slova pro konverzi a vloţení textu do teletextové stránky Při práci s teletextovými stranami je nutné provést konverzi daného textu do kódu teletextu. Slova pro konverzi tyto změny umožňují.
Slova pro nastavení barev písma a barev grafických symbolů Slovy pro nastavení barev zvolíme příslušnou barvu. Máme na výběr z barev černá, červená, zelená, modrá, žlutá, bílá, purpurová (magenta), světle zelenomodrá barva (aqua).
Slova pro nastavení podkladu textu Slovy se dají navolit základní barvy podkladu textu, popřípadě slovem DOUBLETEXT dvojnvelikost textu.
35
Shrnutí Popisy slovníků uváděných v této kapitole ukazují, jaké typy slov jsou v jazyce P42 předem definovány. Typy slov jsou přehledně popsány včetně odkazů do příloh, kde jsou zdokumentovány možnosti použití včetně ukázek na příkladech.
36
5 POUŢITÍ ZÁSOBNÍKOVÉHO JAZYKA PRO VYTVÁŘENÍ VÝSTUPNÍCH SESTAV V této kapitole jsou představeny možnosti tisku výstupních sestav ve vývojovém prostředí Delphi a ukázány rozdíly mezi tiskovou sestavou typu „Seznam“ a typu „Formulář“. Podstatná část kapitoly se věnuje případové studii při nasazení modulů jazyka P42 při tisku protokolů „formulářového“ typu.
Obrázek 7 – Pouţití průvodce pro vytvoření nové výstupní sestavy
5.1 Moţnosti tisku výstupních sestav v Delphi Tiskové sestavy jsou dokumenty, které slouží pro převedení dat dostupných z informačního systému do zvolené papírové podoby většinou pomocí tiskárny. Při návrhu tiskové sestavy se dle požadavků v zadání snažíme o docílení co nejefektnějšího výstupu s přihlédnutím k přehlednosti.
Obrázek 8 – Pouţití šablony pro vytvoření nové výstupní sestavy
37
Při vytváření výstupních sestav máme v současné době v Delphi 6 na výběr z několika možností. S nákupem produktu Delphi je standardně dodáván generátor tiskových sestav QuickReport, jehož základem je rozsáhlá kolekce komponent. Jedná se o samostatný pásmový generátor, přičemž výstupní sestavy jsou navrhovány přímo ve vývojovém prostředí.
Obrázek 9 – Tisková sestava typu "Formulář"
38
Delphi s použitím návrháře formulářů jako návrháře sestav plně podporuje Unicode1, při práci se dají použít datové komponenty odvozené od třídy TDataSet2. Výstupní sestavy se dají prohlížet v režimu Preview nebo přímo tisknout na periferní zařízení. Ve verzi QuickReport Professional, kterou lze dokoupit, se pak může výstup ukládat ve formátech XML, ASCII, HTML, PDF, XL, CSV nebo WMF. Při vytváření výstupních sestav v Delphi můžeme: použít průvodce3 pro QuickReport (Obrázek 7), použít šablony4 (Obrázek 8) pro QuickReport List, QuickReport Labels nebo QuickReport Master/Detail, výstupní sestavu naprogramovat.
Obrázek 10 – Tisková sestava typu "Seznam"
Tiskové sestavy můžeme rozlišit podle způsobu používání na dva základní typy, a to na tiskové sestavy formulářové a tiskové sestavy se seznamy.
1
Unicode je jednotná tabulka znaků všech existujících abeced
2
TDataSet je základní třída pro správu dat. Obsahuje metody pro zadávání příkazů např. Open(), Close(), Insert()
atd..Potomci jsou Table, Query, Command. 3
Použití průvodce: Hlavní menu -> File -> New -> Other… -> záložka Business
4
Použití šablony: Hlavní menu -> File -> New -> Other -> záložka Form -> vybrat QuickReportList (resp.
QuickReportLabels, QuickReportMaster/Detail)
39
Tisková sestava typu "Formulář" (Obrázek 9) je napojena zpravidla na data pouze jednoho záznamu z tabulky (jedné řádky). Tisková sestava typu "Seznam" (Obrázek 10) tiskne údaje týkající se zpravidla vybraných položek z tabulky (vybraných sloupců). Ukázky sestav byly vytvořeny v generátoru tiskových sestav Quickreport nakoupených se standardní dodávkou Delphi jako její součást.
5.2 Případová studie Na následujícím příkladě si ukážeme použití modulů v reálném nasazení.
5.2.1 Popis aplikace Aplikace Výherka je provozní aplikace prvotně sloužící k výpočtu výherních částek v číselných loteriích Sportka, Šance, Euromilióny, Sazka a Mimořádná sazka. Z důvodů řešení krizových situací je navržena tak, aby se mohla spouštět i z tzv. klíčenky z jakéhokoli počítače, a aby se její instalace prováděla pouhou kopií. Business logika aplikace je sice navázána na okolní datové zdroje (databáze na SQL serveru, interface z propojených aplikací), ale je umožněn i ruční vstup. Vstup i výstup je řešen s ohledem i na možný výpadek sítě, serveru, počítače, síťového disku apod.
Autor
Bc. Marcela Turková
Autor analýzy
Bc. M. Turková Návrh algoritmu výpočtů – Bc. Marcela Turková
Rok nasazení
1995 první verze 2009 komplexně přepracováno – verze 20.01
Operační systém
Windows XP
Vývojové prostředí
Delphi 6, komponenty APOLLO (přístup k souborovým tabulkám dbf) a ADO (přístup na SQL server),
Servery
MS SQL 2000
Stručný popis
Výpočet výherních částek her Sportka, Šance, Euromilióny, Sazka, Mimořádná sazka
40
Funkcionalita křížové kontroly s výherkou na Alfě a výherkou v aplikaci Prognózy, načítání a generování textových interface mezi Sazkou a externí firmou, výpočet předpokládané částky (Jackpotu) na další losování, tvorba sad protokolů o losování, Výherní listiny, tvorba údajů pro zveřejnění o vylosovaných číslech a Jackpotu. Moduly
Vazby mezi moduly a daty viz Obrázek 11
Umístění
Síťový disk, v případě krize se dá spouštět ze zálohy na Flash médiu
Instalační postup
Bez instalace (na síťovém úložišti zajistit přístupová práva)
Tabulka 4 – Karta SW - aplikace Výherka
Obrázek 11 – Moduly v aplikaci s důrazem na tiskové moduly
Vazby mezi moduly a daty
41
Po spuštění aplikace si uživatel vybere mezi moduly, na kterých potřebuje pracovat. Moduly Sportka, Šance Euromilióny, Sazka a Mimořádná sazka si jsou co do funkcionality podobné. Pracují s lokálními tabulkami, kam průběžně data ukládají. Při ukončení práce se aktualizují tabulky na SQL serveru. Moduly na výstupu si načítají data z lokálních tabulek. Z modulů se při požadavku na tisk volá tiskový modul Frm_rep, ke kterému jsou připojeny modul jazyka P42_base (kde je mimo základního slovníku i interpret jazyka P42) a modul P42_vrep (se slovníkem pro formulářové sestavy). Tiskový modul Frm_rep si načte z disku příslušný skript pro tiskovou sestavu, příslušející k vyvolanému požadavku. V modulu se zobrazí jak skript tak i náhled tisku. Modul Frm_rep je popsán v kapitole 5.2.3
Obrázek 12 – Zpráva o rozdělení výherní jistiny Sportka a Šance
42
Tiskové protokoly v aplikaci Zpráva o rozdělení výherní jistiny1 Tyto protokoly se generují pro hry Sportka neděle, Euromilióny (Obrázek 12), Šance neděle, Sportka středa, Šance středa, Sazka a Mimořádná sazka (celkem 5 různých typů protokolů). Protokoly jsou oficiálním dokladem o rozpočítávání částky z vkladů, přenosu z minulého losování, vypočtených výhrách a přenosu do dalšího losování. Protokoly se nezveřejňují, jsou určeny pro interní potřebu společnosti, např. pro audit či k nahlédnutí pro státní dozor.
Protokol správných typů a vylosovaných čísel (Obrázek 13) pro losování ve středu, pátek a neděli pro všechny hry (celkem 5 různých typů protokolů).
Obrázek 13 – Protokol správných typů a vylosovaných čísel
1
Výherní jistina Sportky, Euromilionů a Šance je tvořena polovinou (50 %) z vkladů v daném období. Výherní jistina je
přerozdělena na výhry podle určitých algoritmů.
43
Tyto protokoly jsou oficiálním dokladem o vylosovaných číslech (v nedělním zpracování i o správných tipech hry Sazka). Protokoly se předávají (spolu se souborem na médiu v ASCII formátu) proti podpisu do externí firmy, kde se pak třídí počty výher1.
Předběţný protokol výher pro středu, pátek, neděli a mimořádná losování (Obrázek 14) Protokoly se tvoří poté, co je znám počet výher a poté co jsou vypočítány výherní částky2 (celkem 5 různých typů protokolů).
Obrázek 14 – Předběţný protokol výher pro středu, pátek, neděli
Tyto protokoly se faxují a posílají e-mailem do tiskových médií co nejdříve po zpracování losování. Jsou to protokoly předběžné, protože po uzavření systému může ještě dojít ke korekci údajů.
1 2
Postup: Třídění výher se provádí na třech nezávislých systémech, výsledky musí být shodné. Výherní částky se počítají ve dvou nezávislých systémech. Výsledky se před zveřejněním musí shodovat. V případě
neshod se výhry přepočítají ručně.
44
Protokol výher pro středu, pátek, neděli a pro mimořádná losování
Obrázek 15 – Protokol výher pro středu, pátek, neděli
Protokoly (Obrázek 15) se tvoří poté, co je znám počet výher a poté co jsou vypočítány výherní částky. Jsou oficiálním dokladem o počtu výher a o výherních částkách. Protokoly se předávají (spolu se souborem na médiu v ASCII formátu) proti podpisu do externí firmy, která zavádí výhry do svého systému (resp. načítá interface na paměťovém mediu) a aktualizuje svůj systém tak, aby na terminálech ve sběrnách byly rozpoznány výherní potvrzenky (potvrzenky s výherními čísly) a výhercům se mohly vyplatit správné výhry (celkem 4 typy protokolů).
Výherní listiny středa, neděle, mimořádné losování, Sazka a Mimořádná sazka Tyto protokoly (celkem 4 typy) jsou oficiálním dokladem s celkovým souhrnem informací o průběhu všech sázkových her v daném období(Obrázek 16) . Protokoly se předávají nebo posílají e-mailem na dispečink Sazky. Tyto protokoly jsou graficky náročné, Výherní listina středa vytvořená v Delphi v Quick Reportu obsahovala 1050 objektů, Výherní listina neděle 950 objektů. Jedna
45
výherní listina v projektu Delphi zvětšovala spustitelný exe soubor o cca 0,4MB, přitom se v programu Výherka musely spouštět i starší verze protokolů.
Obrázek 16 – Výherní listina středa a Výherní listina neděle
5.2.2 Poţadavky na výstupní sestavy formulářového typu Z analýzy potřeb uživatelů vyplynuly následující požadavky: 1. Moţnost manuálního vstupu operátora do úpravy tisků, a to bez zásahu do zdrojového kódu aplikace Při nestandardní situaci musí mít vedoucí losování přístup k datům ve výstupních sestavách a to v plném rozsahu. 2. Zachování historie protokolů Velice často dochází k obměně výstupních protokolů o losování (např. záhlaví a zápatí, rozdělení procent na výhry, změny podpisových vzorů, informace, zda se hraje o prémii), přičemž je nutno v programu zachovat historii protokolů.
46
3. Redukce velikosti tiskových sestav Výstupní sestavy obsahují mnoho grafických objektů. Některé části v sestavě se na jednom tiskovém formuláři mnohokrát opakují (viz Příloha 1). Množství tiskových sestav může být v jedné aplikaci poměrně značné, zároveň je kladen důraz na to, aby byla zachována možnost tisku i „historických“ protokolů. Jedna obsažná výstupní sestava zvýší výsledný exe soubor o cca 0,4 MB. Značným množstvím tisků zkompilovaných v projektu Delphi nám narůstal výsledný exe soubor až k 20 MB. 4. Vytvoření BMP, JPG Vytvořené protokoly se předávají dále i v elektronické formě (dispečink, hot-line, podnikový informační časopis). Protokoly jsou archivovány nejen v papírové formě, ale i elektronické. 5. Napojení různých datových zdrojů V protokolech nejde jen o otisk jedné tabulky. Výstupní sestavy obsahují údaje z různých datových zdrojů, jak z tabulek lokálních, a to typu dbf nebo z relačně provázaných tabulek v databázi na MS-SQL, tak i přímo z objektů na formuláři aplikace.
Protože jazyk P42 již byl ve společnosti implementován pro jiné účely1, nabízelo se jeho využití i pro tisk těchto protokolů. Veškeré výše popsané požadavky byly pak zohledněny v modulu P42_Vrep2.
5.2.3 Modul pro vytváření tiskových sestav Pro vytváření tiskových sestav podle požadavků uživatelů musel být do aplikace Výherka vytvořen další modul nazvaný Frm_Rep3. Modul spolupracuje s modulem P42_base a P42_Vrep. Zavolá se v aplikaci kliknutím na tlačítko pro tisk, poté se uživateli zobrazí obrazovka (viz Obrázek 17). Obrazovka obsahuje dvě záložky a několik tlačítek.
1
Jednalo se o již hotové moduly P42_base, P42_Vtxt, P42_Vdbt
2
Modul P42_Vrep byl doprogramován jako zatím poslední model.
3
Frm_rep=Formulář pro reporty. Je opakovatelně použitelný, slouží bez úprav i v jiných aplikacích v Delphi
47
Před tiskem musí být otevřeny a zaktualizovány databázové tabulky pro hry Sportka, Šance a Šťastných 10. Poté se z aplikace zavolá modul pro tisk FRM_REP.kliknutím na patřičné tlačítko.
Obrázek 17 – Obecná obrazovka pro tisk
Záloţka Data Na pravé straně obrazovky (Obrázek 18) se zobrazí náhledu tisku. Na levé straně jsou při inicializaci formuláře do komponenty typu TMemo1 načteny proměnné a jejich hodnoty. V případě neočekávaného incidentu se dají hodnoty proměnných uživatelsky měnit. Tlačítko Obnovit data slouží např. po provedené změně k uvedení dat do původního stavu. Dole vlevo je komponenta typu TMemo, do které se načítají průvodní informace ke zpracování tisku (chyby, obsazení zásobníku apod.)
1
TMemo je vizuální komponenta, umožňující úpravy textu o více řádkách
48
Veškerá data potřebná pro vytvoření tiskové sestavy se přenášejí do modulu Frm_Rep objektem Delphi typu TStringList1, jehož propojení s nadřazenou aplikací je vytvořeno při vzniku instance modulu Frm_Rep. Datová část u komponenty StringList obsahuje data z nadřazené aplikace, která budou využita ve skriptu tiskové sestavy. Všechny informace v tomto StringListu mají tvar klíč=hodnota a pro přehlednost jsou zařazeny do sekcí2.
Obrázek 18 – Obrazovka pro tisk při zobrazení karty Data Př. [čísla 1. tah] ISPO-C1=5 ISPO-C2=35 ISPO-C3=15 ISPO-C4=2 ISPO-C5=7 ISPO-C6=42 ISPO-CD=1
1
StringList: Třída typu TStringList zděděná od TStrings. Položky do Stringlistu mohou být načteny z vnějšího zdroje nebo
modifikovány (např. metody Clear, Delete and Insert) 2
Sekce je identifikátor části souboru, ohraničený hranatými závorkami
49
Názvy klíčů jsou volitelné. Hodnota klíče se pak při zpracování skriptu získá pomocí slova data@. Datová část Skript
JP=100 000Kč 'JP' data@ do TOS zásobníku se vloží 100 000Kč
Do (žluté) informační části obrazovky modulu Frm_Rep viz se přenesou informace z Datového souboru začínající znakem # Ukázka R#_CAP=Výherní listina STŘEDA Týden: 31 rok: 2009 R#_INFO-0=VÝHERNÍ LISTINA R#_INFO-1=STŘEDA R#_INFO-2=Týden: 31 rok: 2009 datum: 29.07.2009 R#_SCR=C:\Appl_D6\Sazka_TU\__Vyher_MT\vyher_MT\REP\RepVlStr.rep
Záloţka Report Po přepnutí na kartu Report (Obrázek 19) je na levé straně do komponenty typu TMemo načten skript sloužící k definici vykreslení objektů na Canvas komponenty typu TImage1. V případě požadavku na změnu tisku (např. velikosti rámečků a jejich umístění, změny razítka v zápatí, změny popisu textového pole) se pouze jednoduchým způsobem změní skript, a přitom se aplikace nemusí znova překládat. Na levé straně obrázku v červené elipse je ukázáno volání (předem nadefinovaného) slova HEADER s parametry 7 a 5. V pozici 7 milimetrů od levého okraje a 5 mm od okraje horního se na Canvasu vykreslí vše, co je nadefinováno ve slově HEADER. Obdobně se volají slova SPORTKA , SANCE, S10, FOOTER. Příloha 3 ukazuje celý skript pro tiskovou sestavu. Skript je tiskový soubor v txt formátu, ve kterém jsou nadefinovány příkazy pro vykonávání sekvencí činností za použití slov jazyka P_42. Cesta na tento soubor je uložena také v Datové části, ve StringListu pod klíčem R#_SCR R#_SCR=C:\Appl_D6\Sazka_TU\__Vyher_MT\vyher_MT\REP\RepVlStr.rep
1
TImage: Objekt pro vykreslení grafiky
50
Obrázek 19 – Obrazovka pro tisk při zobrazení karty Report
Tlačítko Print Modul pracuje s objektem Delphi TPrinter1. Při aktivaci požadavku na tisk se nastaví parametry pro slovník v modulu P42_VREP a to pro objekt TCanvas2, PageHeight3, PageWidth4. Vlastnosti objektu TPrinter (Portrait5, Landscape6) se promítnou do parametrů tisku
1
Tprinter: Objekt, který obhospodařuje tiskové úkoly v aplikaci. Má mnoho vlastností i metod
2
TCanvas: Třídu TCanvas (plátno) mohou využívat různé komponenty, například i formulář.
3
PageHeight: Udává v pixelech výšku objektu
4
PageWidth: Udává v pixelech šířku objektu
5
Portrait: Na výšku
6
Landscape: Na šířku
51
Tlačítko Preview Po stisku tlačítka Preview se v pravé části zobrazí náhled tisku. Pro vykreslení náhledu se využívá Canvas objektu TImage. Vzhledem k tomu, že modul je navržen na základní velikost formátů řady A, je tedy objekt TImage při změně velikosti formuláře vždy nastaven na poměr delší a kratší strany 1:1,41.
Tlačítko Full Preview Po stisku tlačítka Full Preview se nastaví objekt TImage na velikost Canvasu objektu TPrinter, tím bude zobrazen náhled ve skutečné velikosti, což je vhodné pro doladění drobných detailů tiskových sestav.
Tlačítko Bitmapa Po stisku tlačítka Bitmapa se otevře SaveDialog. Tento dialog pro ukládání souboru se proti standardnímu dialogu modifikován tak, že umožňuje nastavit velikost a typ BMP. Podle parametrů se vytvoří Bitmapa a uloží se na nadefinovanou cestu. Zobrazení SaveDialogu viz Obrázek 20
Pole Message - Error Vystupují zde informace při provádění průběhu zpracování skriptu, tj. chyby ve slovníku P42, eventuálně i další informace z výstupních sestav Je do něj směřován standardní výstup z jazyka P42. Do komponenty typu TMemo se načítají průvodní informace ke zpracování skriptu (chyby, obsazení zásobníku apod.)
Další moţnosti modulu FRM_VREP Při volání modulu pro tisk FRM_VREP máme na výběr dvě metody a to metodu Preview (viz popis výše) a metodu Print, která neotvírá Form s properties1 Visible, ale má nasměrovaný výstup pro tisk přímo na tiskárnu. 1
Property: vlastnost části tříd v Delphi, např. numerické, logické, výčtové hodnoty.
52
Obrázek 20 – Uloţit tiskovou sestavu jako bitmapu
Shrnutí V této kapitole byly ukázány tiskové sestavy typu „Seznam“ a typu „Formulář“. Dále byla důkladně popsána případová studie z akciové společnosti Sazka, tj. popsána aplikace Výherka, představen nový modul umožňující zpracovávat formulářové tisky přes jazyk P42.
53
6 DALŠÍ MOŢNOSTI POUŢITÍ ZÁSOBNÍKOVÉHO JAZYKA P42 V této kapitole se seznámíme s dalšími možnostmi, které se nám podařilo vyřešit právě přes moduly zásobníkového jazyka P42.
6.1 Pouţití zásobníkového jazyka k údrţbě dat v aplikacích Slovník P42_VDBF je zejména využíván k údržbě a přesunu dat z kmenových tabulek do různých výstupů jako např. různé textové soubory, tabulky pro prezentaci výsledků losování na internetu a protokoly. Vzhledem k tomu, že se struktura a obsah výstupních dat často mění, je řada těchto výstupů generována skripty v jazyce P42. To je z důvodů, aby při změně výstupů nebylo nutno přepisovat aplikace. Změna skriptů je poměrně nenáročná na čas a je jí možno realizovat i v krizových situacích např. při havárii dat dodat data manuálně.
Obrázek 21 – Teletextové stránky zobrazované v aplikaci při vyuţití jazyka P42
54
6.2 Pouţití zásobníkového jazyka pro vytváření teletextových stran Pro prezentaci výsledků číselných loterií se využívá řady teletextových stránek. Není možné modifikovat tyto stránky ručně tak, aby byla prezentace hotova dostatečně rychle. Např. teletextové stránky pro hru Keno se mění každých 5 min. Vznikla tedy potřeba, generovat tyto stránky automaticky. Protože se obsah i vzhled stránek často mění, bylo rozhodnuto, využít pro modifikaci jazyk P42 a vytvořit pro tyto účely speciální řadu slov. Každá prezentovaná teletextová stránka je nejdříve navržena teletextovým editorem (více viz [7]) a pak je jako šablona modifikována automaticky (ukázka viz. Obrázek 21) z kmenových dat. Při změně obsahu nebo vzhledu se mění pouze tato šablona a modifikační skript v jazyce P42 a není nutno měnit aplikaci, která modifikaci provádí. Ukázka teletextové strany – viz Obrázek 22.
Obrázek 22 – Internetové stránky České televize -Vylosovaná čísla hry KENO
Shrnutí
55
V této kapitole bylo ukázáno další použití jazyka P42 a to v praxi při řešení situací jako je např. údržba dat v aplikacích nebo modifikace teletextových stran. Úpravy teletextových stran po losování každých 5 minut by manuálně nebylo možné provádět.
56
ZÁVĚR Tato diplomová práce byla vytvořena jako popis celého procesu vývoje a využití nového zásobníkového programovacího jazyka P42 od zmapování problému po analýzu až po řešení. V první teoretické části bylo cílem na základě dostupné literatury popsat zásobníkové jazyky, jejich základní principy a možnosti jejich využití v praxi. Po teoretické části následuje část popisující praktické použití programovacího jazyka P42, (klonu jazyka Forth). Tato část je velmi obsáhlým tématem. Zahrnuje nejen popis implementace jazyka P42, vymezení možností použitých slov obsažených ve slovnících, ale i případovou studii nasazení softwaru se včleněným zásobníkovým jazykem v akciové společnosti Sazka., kde se pro vývoj softwaru určený pro provoz používá především metodiky agilního programování právě pro možnost pružné reakce na měnící se požadavky. V případové studii jsem popsala vlastní řešení sady problémů s tiskovými sestavami, a to s použitím zásobníkových jazyků. Protože jsem v předchozích letech spolupracovala na vývoji modulů pro práci s databázovými objekty (modul P42_Vdbt) a na slovníku pro teletext (modul P42_Vtxt), použila jsem svých předchozích zkušeností k návrhu a tvorbě modulu pro vytváření tiskových sestav Frm_Rep a dále modulu jazyka P42 (P42_Vrep), a to včetně vytvoření slov a popisu slovníku a tento modul zaimplementovala do mnou vyvinuté a nadále spravované aplikace. Aplikace včetně včleněných modulů jazyka P42 pracuje spolehlivě, prošla řadou testů, uživatelé jsou spokojeni. Jelikož při často se měnících požadavcích nebyl doposud ve společnosti čas slovník podrobně dokumentovat, ale prioritou byl rychle vyvinutý a správně fungující software, bude tato diplomová práce sloužit i jako zdroj podrobně zdokumentovaných slov ve slovnících jazyka P42.
Zhodnocení naplnění cílů práce Ve své práci jsem se především zaměřila na to, co je z mého pohledu nejdůležitější, a to na praktické použití tohoto jazyka, na detailní popis a definici slov, dále na ukázku použití jazyka P42 v reálném životě, a to na příkladu tisku výstupní sestavy a následném rozboru skriptu, pomocí kterého se výstupní tisková sestava tvoří.
57
Případová studie dokázala, že využití jazyka P42 může usnadnit práci operátorů aplikace, ale také usnadnit monotónní a obtížnou práci vývojáře při tvorbě graficky náročné výstupní sestavy.
Další moţný vývoj Jazyk P42, který v současné době obsahuje 4 moduly, používáme cca 6 let, jednotlivé moduly k dalšímu použití se dle potřeby průběžně vyvíjí a nová slova v těchto modulech se dle požadavků neustále dopisují. Moduly se dají použít pouze ve vývojovém prostředí Delphi. Do budoucna se uvažuje moduly zapouzdřit do dll knihoven k použití v jiných vývojových prostředích. Dále je v plánu rozšířit jazyk P42 i pro sestavy neformulářového typu. Systém se kontinuálně rozrůstá, přibývají další slova i moduly, stoupá i počet zaučených uživatelů, kteří jsou schopni provádět úpravy ve skriptech buď naprosto samostatně nebo na základě osobního pohovoru s programátory. V případě incidentů jsou uživatelé nasazení v provozu schopni po osobní nebo telefonní konzultaci zasahovat do skriptů a to i pod časovým tlakem ve večerních či nočních hodinách. Právě proto se domnívám, že tento systém použití zásobníkového jazyka by mohl přinést prospěch a usnadnit práci v dalších společnostech.
58
Terminologický slovník FIFO
First In First Out – platí pravidlo: první vložen, první vyjmut tzn. prvek , který byl uložen jako první, bude vybrán jako první.
LIFO
(Last In First Out – platí pravidlo: poslední vložen, první vyjmut) tzn. prvek , který byl uložen jako první, bude vybrán jako poslední.
Notace
(Notation) zápis, notace, zobrazení – řetězec charakterizující daný údaj (př. binary notation)
Infix
Jde o nejznámější zápis aritmetických výrazů, ve kterém je operátor umístěn mezi operandy se kterými bude pracovat
Prefix
Zápis aritmetických výrazů, kde každý operátor stojí před dvěma operandy ke kterým patří.
Postfix
Reversní polská logika či RPN – Reverse Polish Notation. V zápisu výrazu každý operátor následuje až po dvou operandech, ke kterým patří.
Operátor
Operace se značí pomocí znaménka operace (operátoru) a aplikuje se na proměnné a hodnoty, kterým říkáme operandy. Je to symbol nebo posloupnost znaků (př. + , AND), označující operaci, která se má vykonávat s jedním nebo více operandy (1, 102), aby vznikl výsledek Příklad operátorů podle funkce: aritmetické (+,/, mod) bitové (not, and,shl, shr) logické (not. or) řetězcové (+) množinové (+,=,in,>=) relační (=,<>,>, in) adresní (@)
Komutativní
Pro komutativní operátory není definováno pořadí vyhodnocení operandu. výsledek tedy nezáleží na pořadí operandů
Datové struktury
Uspořádání datových položek strukturovaného údaje. Datová struktura může být statická (rozsah se během výpočtu nemění) nebo dynamická (rozsah se během výpočtu mění, např. pole, matice,record)
Slovo Slovník
Program v jazyce Forth je složen ze slov, která jsou uspořádána v určitém daném pořadí, kde každé slovo je nezávislé a provádí nějakou specifickou operaci. Slova mohou být sdružena v tzv. slovníku (knihovně)
59
Syntaxe
Pravidla pro vytváření přípustných řetězců jazyka, užívaná bez ohledu na jejich význam. Přesně specifikuje, jak mají být napsány příkazy, aby se daly správně interpretovat
Sémantika
Množství axiomů, které udávají vztahy mezi operacemi. Jde o definici, která se zabývá významem nebo účinkem textu, formovaným podle sémantických pravidel
Uživatelský zásobník
Zásobník určený pro uživatele, je plně pod jeho kontrolou a provádějí se na něm veškeré operace
Zásobník návratových adres
Return Stack; Zásobník, do kterého jsou ukládány návratové adresy, počítadla cyklu, proměnné cyklu
USES
Rezervovaný příkaz (slovo) v Jazyce Object Pascal Sděluje programu, jaké moduly bude v programu používat.
Veřejné
Public - funkce a proměnné jsou přístupné v celé aplikaci
IVR
Interactive Voice Response, resp. Automatická hlasová odezva. Určeno pro komunikaci s klientem.
Case
Není citlivé na velikosti písmen, malá a velká písmena se nerozlišují.
insensitive Quick Report Samostatný pásmový generátor tiskových sestav, jehož základem je rozsáhlá kolekce komponent. Dodáván s vývojovým prostředím Delphi Properties
Vlastnosti objektu (např. v Delphi objekt TEdit má mj. vlastnosti text, font....)
CR, LF
#13#10 je dvojznak pro konec řádku na operačních systémech vycházejících z
DOS Byte
Datový typ, nabývá hodnot 0..255, jde o 8-bitový typ bez znaménka
Class
Strukturovaný datový typ nadefinovaný uživatelem. Deklarujeme ho se pomocí klíčového slova class. Uvnitř třídy jsou pak určeny jednotlivé objekty
TForm
Komponenta, která reprezentuje v aplikaci standardní okno, kde o základní class při tvoření GUI aplikací
60
TCanvas
Třídu TCanvas (plátno) mohou využívat různé komponenty, například i formulář.
TPrinter
Objekt, který obhospodařuje tiskové úkoly v aplikaci. Má mnoho vlastností i metod
TImage
Objekt pro vykreslení grafiky
Word
Datový typ. Nabývá hodnot 0.. 65 535, jde o 2 bytový typ bez znaménka
Integer
Datový typ. Jde o 32-bitové celé číslo se znaménkem, nabývá hodnot od – 2147483648 do 2147483647
Record
Složený datový typ. Může být sestaven z jednoduchého typu, nebo i dříve definovaných složených, případně indexovaných typů.
String
Jednoduchý datový typ. Řetězec znaků, z určitého pohledu se chová podobně jako pole hodnot typu charakter.
Numeric
Datový typ pro celá a desetinná čísla.
Null
Datový typ null obsahuje pouze jednu hodnotu, a to Null
Logical
Datový typ Logical/Boolean je tvořen dvěma hodnotami: true (pravda) a false (nepravda).
Variant
Datový typ není předem nadefinován, je určen až za běhu programu, podle toho, jaká hodnota bude proměnné přiřazena. Slouží pro speciální typy programů.
61
Literatura a zdroje [1]
HLAVENKA, Jiří, a kol. Výkladový slovník výpočetní techniky. Brno : Computer Press., 1997. 3. vyd. ISBN 80-7226-023-5
[2]
KNUTH, D. E. The Art of Computer Programming. Vol.2. : Seminumerical algorithms, S. l. : Addision-Wesley , 1981. ISBN 0-201-03822-6
[3]
VITOVSKÝ, Antonín. Anglicko-český výkladový slovník softwaru. Praha : AV SOFTWARE, 1996. 4.vyd. ISBN 80-901428-6-9
[4]
PECINOVSKÝ, Rudolf. Programování - seriál Forth , dostupný dne 20.10.2009 z URL: http://rudolf.pecinovsky.cz/texty/index.htm
[5]
TIŠNOVSKÝ, Pavel. Seriál Programovací jazyk Forth, dostupný dne 20.10.2009 z URL: http://www.root.cz/serialy/programovaci-jazyk-forth/
[6]
FORTH. Dostupný dne 20.10.2009 z URL:http://web.quick.cz/kopato/forth/obsah.html
[7]
Teletext manager. Dostupný dne 20.10.2009 s URL http://www.epsillon.com/index.php?Show=10_TV_gener%E1tory_c/TRF_Manager_ c/3-_Teletext_c.php&Lang=czech
[8]
ČSN ISO/IEC 15145 : 2000. Informační technologie - Programovací jazyky – Forth. Praha : Český normalizační institut 2000.
[9]
HNILICA, Radek. Forth - Programovací jazyk Forth. Dostupný dne 20.10.2009 z URL: http://www.penguin.cz/~radek/book/forth/
[10] Wikipedie. Dostupný dne 20.10.2009 z URL: http://cs.wikipedia.org/wiki/Postfixov%C3%A1_notace [11] TIŠNOVSKÝ, Pavel. Joy: radost z programování, dostupný dne 20.10.2009 z URL: http://www.root.cz/clanky/joy-radost-z-programovani [12] TIŠNOVSKÝ, Pavel. Programovací jazyk Factor , dostupný dne 20.10.2009 z URL: http://www.root.cz/clanky/joy-radost-z-programovani
62
Seznam obrázků Obrázek 1 – Princip zásobníku (zdroj: autorka) .................................................................... 11 Obrázek 2 – Grafické znázornění zpracování výrazu 100 6 10 * - 4 12 + / (zdroj: autorka) 12 Obrázek 3 – Přidání modulů jazyka P42 do projektu aplikace.............................................. 20 Obrázek 4 – Přidání modulů P42 do uses .............................................................................. 21 Obrázek 5 – Postup zpracování slova v modulu jazyka P42_base.pas (zdroj: autorka) ....... 25 Obrázek 6 – Moduly jazyka P42 (zdroj: autorka) ................................................................. 29 Obrázek 7 – Použití průvodce pro vytvoření nové výstupní sestavy .................................... 37 Obrázek 8 – Použití šablony pro vytvoření nové výstupní sestavy ....................................... 37 Obrázek 9 – Tisková sestava typu "Formulář" ...................................................................... 38 Obrázek 10 – Tisková sestava typu "Seznam" ...................................................................... 39 Obrázek 11 – Moduly v aplikaci s důrazem na tiskové moduly ........................................... 41 Obrázek 12 – Zpráva o rozdělení výherní jistiny Sportka a Šance ....................................... 42 Obrázek 13 – Protokol správných typů a vylosovaných čísel ............................................... 43 Obrázek 14 – Předběžný protokol výher pro středu, pátek, neděli........................................ 44 Obrázek 15 – Protokol výher pro středu, pátek, neděli ......................................................... 45 Obrázek 16 – Výherní listina středa a Výherní listina neděle .............................................. 46 Obrázek 17 – Obecná obrazovka pro tisk .............................................................................. 48 Obrázek 18 – Obrazovka pro tisk při zobrazení karty Data .................................................. 49 Obrázek 19 – Obrazovka pro tisk při zobrazení karty Report ............................................... 51 Obrázek 20 – Uložit tiskovou sestavu jako bitmapu ............................................................. 53 Obrázek 21 – Teletextové stránky zobrazované v aplikaci při využití jazyka P42 ............... 54 Obrázek 22 – Internetové stránky České televize -Vylosovaná čísla hry KENO ................. 55 Obrázek 23 – Okno pro trasování .......................................................................................... 81 Obrázek 24 – Použití slova ZOOM ze slovníku P42_VREP .............................................. 107 Obrázek 25 – Použití slova TEXTBOX ze slovníku P42_VREP ....................................... 109
63
Obrázek 26 – Použití slova RECTANGLE ze slovníku P42_VREP .................................. 109 Obrázek 27 – Použití slova TEXTELLIPSE ze slovníku P42_VREP ................................ 110 Obrázek 28 – Použití slova ELLIPSE ze slovníku P42_VREP........................................... 111 Obrázek 29 – Použití slova LINE ze slovníku P42_VREP ................................................. 111 Obrázek 30 – Použití slova PICTURE ze slovníku P42_VREP ......................................... 112 Obrázek 31 – Příklady použití slov ze slovníku P42_VTtx ................................................ 120
Seznam tabulek Tabulka 1 – Postup při zpracování skriptu ............................................................................ 13 Tabulka 2 – Výhody a nevýhody jazyka Forth...................................................................... 17 Tabulka 3 – Porovnání jazyka Forth a jazyka P42 ................................................................ 24 Tabulka 4 – Karta SW - aplikace Výherka ............................................................................ 41 Tabulka 5 – Použité zkratky - Zásobník ................................................................................ 75 Tabulka 6 – Použité zkratky - Kompatibilita......................................................................... 75 Tabulka 7 – Použité zkratky - Typy hodnot použitelných v US ........................................... 75 Tabulka 8 – Syntaxe .............................................................................................................. 76 Tabulka 9 – Použité zkratky – Módy spouštění .................................................................... 76
Seznam příloh Příloha 1 – Výherní listina středa .......................................................................................... 65 Příloha 2 – Datový soubor pro tisk Výherní listiny středeční ............................................... 66 Příloha 3 – Skript s popisem pro tisk Výherní listiny středeční ............................................ 68 Příloha 4 – Použité zkratky.................................................................................................... 75 Příloha 5 – Základní slovník jazyka P42 ............................................................................... 77 Příloha 6 – Slovník pro vytváření tiskových sestav P42_VREP ......................................... 106 Příloha 7 – Slovník pro práci s databázovými objekty P42_VDBT .................................... 113 Příloha 8 – Slovník pro práci s teletextem P42_VTTX ....................................................... 118
64
Příloha 1 – Výherní listina středa
65
Příloha 2 – Datový soubor pro tisk Výherní listiny středeční R#_CAP=Výherní listina STØEDA Týden: 15 rok: 2010 R#_INFO-0=VÝHERNÍ LISTINA R#_INFO-1=STØEDA R#_INFO-2=Týden: 15 rok: 2010 datum: 14.04.2010 R#_SCR=I:\Aplikace\Vyherka\Vyherka\REP\RepVlStr.rep [data výherní listina STØEDA] DRREP=I:\Aplikace\Vyherka\Vyherka\REP TYDEN=15. ROK=2010 [Bonus] 1SPO-PB=0 2SPO-PB=0 1SPO-VB=0 Kè 2SPO-VB=0 Kè SPO-ROB= 16 425 974,40 Kè SPO-SJP=41 300 000 Kè SPO-DL=14.04.2010 SPO-VKC=33 807 312 Kè SPO-NAV= 67 545 115,00 Kè [èástky na 1. tah] 1SPO-NAV= 25 271 405,30 Kè 1SPO-RO= 19 718 860,30 Kè 1SPO-JP=23 100 000 Kè [èísla 1. tah] 1SPO-C1=49 1SPO-C2=30 1SPO-C3=1 1SPO-C4=43 1SPO-C5=11 1SPO-C6=42 1SPO-CD=41 [poèet výher 1. tah] 1SPO-P1=0 1SPO-P2=1 1SPO-P3=40 1SPO-P4=1 602 1SPO-P5=32 262 [výše výher 1. tah] 1SPO-V1=0 Kè 1SPO-V2=422 591 Kè 1SPO-V3=19 016 Kè 1SPO-V4=633 Kè 1SPO-V5=104 Kè [èástky na 2. tah] 2SPO-VKC=33 807 312 Kè 2SPO-NAV= 25 847 735,30 Kè 2SPO-RO= 20 286 288,30 Kè 2SPO-JP=23 700 000 Kè [èísla 2. tah] 2SPO-C1=31 2SPO-C2=32 2SPO-C3=35 2SPO-C4=6 2SPO-C5=34 2SPO-C6=9 2SPO-CD=13 [poèet výher 2. tah] 2SPO-P1=0 2SPO-P2=1 2SPO-P3=21 2SPO-P4=1 770 2SPO-P5=32 346 [výše výher 2. tah] 2SPO-V1=0 Kè 2SPO-V2=422 591 Kè 2SPO-V3=36 222 Kè 2SPO-V4=573 Kè 2SPO-V5=104 Kè [Šance] SAN-DL=14.04.2010 SAN-VKC=2 354 620 Kè SAN-NAV=2 130 635,00 Kè SAN-C=720832 SAN-P1=0 SAN-P2=2
66
SAN-P3=27 SAN-P4=230 SAN-P5=2 244 SAN-P6=21 016 SAN-V1=0 Kè SAN-V2=50 000 Kè SAN-V3=5 000 Kè SAN-V4=500 Kè SAN-V5=50 Kè SAN-V6=20 Kè SAN-RO=1 248 115,00 Kè SAN-JP=1 620 000 Kè [Š•astných 10] 01-ST10=DT=14.04.2010;C=18,22,62, 2,33,79,39,63,69,12,45, 9,20,77,17,10,74,37,71,42;SM=160356 02-ST10=DT=13.04.2010;C=47, 3,26,48,39,43,63,17,25, 6,46, 1,27,78,56,44,57,59,10,45;SM=901457 03-ST10=DT=12.04.2010;C=30,17,61,66, 4,53,65,32,51,40, 5,80, 9, 3,27,12,20,59,43,45;SM=370411 04-ST10=DT=11.04.2010;C= 8,12,68,27,49,72,78,40, 2,15,56,29,34,37,60,35,67,55, 4,58;SM=643267 05-ST10=DT=10.04.2010;C=68,48,30,25,66,19,57,47, 6,39,27,26,36,51,31,10,65,76,74,32;SM=546056 06-ST10=DT=09.04.2010;C=16,60,33,71,75,11,69, 3,14,17, 1, 4,77,10,44,42, 9,24,57,38;SM=769216 07-ST10=DT=08.04.2010;C=28,58, 9,48, 7, 4,35, 8,40,39,33, 3,26,56,65,72,59,73,79,53;SM=114235 08-ST10=DT=07.04.2010;C=75, 4,45,70, 6, 8,30,36,25,47,43,20,59,61,44,74,27,32,78,13;SM=572396 09-ST10=DT=06.04.2010;C=25, 7,30,34,57,10,23,20,27,78,15,54,29,44,28,50, 9,55,58,60;SM=102500 10-ST10=DT=05.04.2010;C=60,56,46,40,52,50,18,76,20,31, 7,39,80, 4,41,25,32, 1,15,79;SM=572139 11-ST10=DT=04.04.2010;C=49,32,15,50, 7, 5,27,24,67,22,16,14,39, 1,69,13,70,54,33,55;SM=922141 12-ST10=DT=03.04.2010;C=66,76, 1, 7,15,74,56,59,23,60,14,55,24,44,75,13,64,73,80,20;SM=774447 13-ST10=DT=02.04.2010;C= 3,58,34,51,32,72,55,57,29,56,44,77, 8,68,19,65,35,66,21,42;SM=340496 14-ST10=DT=01.04.2010;C=60,68,25,38, 5,40,22,47,57, 4,69,62,42,49,32,58,72,13,50,78;SM=275459
67
Příloha 3 – Skript s popisem pro tisk Výherní listiny středeční ( Skript pro výherní listinu STREDA ) RECORD RW X Y DX DY ENDRECORD ( pracovní rectangle ) RECORD PW X Y ENDRECORD ( pracovní pozice ) RECORD ROW X Y Y0 DX DY C1X C2X C3X C4X C5X ENDRECORD ( Parametry radky tabulky )
( ( ( ( ( :
--------------------------------- ) Záhlaví výherni listiny --------- ) --------------------------------- ) ----Definice slova HEADER-------- ) --------------------------------- ) HEADER RW.Y ! RW.X ! 191 RW.DX ! 25 RW.DY ! RW @ 'W=1' RECTANGLE 'N=Times;H=8;S=B' !FONT 'VÝHERNÍ LISTINA' RW @ 'T=4' TEXTBOX 'N=Times;H=6;S=B' !FONT 'TYDEN' DATA@ ' SÁZKOVÝ TÝDEN ' + ' ROK ' + 'ROK' DATA@ + RW @ 'B=2' TEXTBOX ( 'N=Times;H=6;S=B' !FONT ) ( 'TYDEN' DATA@ ' SÁZKOVÝ TÝDEN ' + 'ROK' DATA@ + RW @ 'B=2' TEXTBOX )
; ( ( ( ( (
-------------------------------------------------------------------- ) Zápatí výherni listiny - vyžaduje v datech cestu na bmp loga sazky ) -------------------------------------------------------------------- ) ----Definice slova FOOTER--------------------------------------------) -------------------------------------------------------------------- )
( Ukonèení výherní listiny - vyžaduje v datech cestu na bitmapu loga sazky a text info GTexty.txt ) RECORD RFOOT X Y DX DY ENDRECORD ( Rectangel urcujici pozici FOOTERu ) : FOOTER RFOOT.Y ! RFOOT.X ! 191 RFOOT.DX ! 19 RFOOT.DY ! RFOOT @ 'W=1' RECTANGLE 'DRREP' DATA@
'\LSazka.bmp' + RFOOT.X @ 5 + RFOOT.Y @ 2 + 50 15 PICTURE
RFOOT.X @ 100 + RW.X ! RFOOT.Y @ 3 + RW.Y ! 10 RW.DX ! 12 RW.DY ! 'N=Times New Roman;H=3,5;S=N' !FONT 'adresa' 'DRREP' DATA@ '\GTexty.txt' + SECT@ RW @ 'L=0;M=?' TEXTBOX 50 RW.X +! 'info' 'DRREP' DATA@ '\GTexty.txt' + SECT@ RW @ 'L=0;M=?' TEXTBOX ; ( ---------------------------------- ) ( Vykreslení boxu a hlavièky pro hru ) ( ---------------------------------- ) RECORD HBX X Y DX DY DX1 DY1 SZ ENDRECORD ( Parametry boxu pro hru ) : HRABOX HBX.X @ HBX.Y @ HBX.DY1 @ 2 / + HBX.DX @ HBX.DY @ HBX.DY1 @ 2 / - 'W=0.5' RECTANGLE HBX.X @ HBX.DX @ HBX.DX1 @ - 2 / + HBX.Y @ HBX.DX1 @ HBX.DY1 @ RW ! RW @ 'W=0.5' RECTANGLE RW @ ( výstup rectanglu hlavièky ) ; ( ------------------------------------- ) ( ----HRA SPORTKA---------------------- ) ( ------------------------------------- ) ( ----Definice slova SPOTAH------------ ) ( slovo pro vystup jednoho tahu sportky ) ( ------------------------------------- ) ( slovo pro vystup jednoho tahu sportky ) ( Slovo pro vykresleni hodnot VSAZENO a NAVYHRY parametry: POZICE Y, KLIC VSAZENO, KLIC NAVYHRY ) : VSAZENO_A_NAVYHRY SWAP ROT HBX.X @ 1 + RW.X ! HBX.Y @ + RW.Y ! HBX.DX @ 2 / 1 - RW.DX ! 5 RW.DY ! 'N=Arial Narrow;H=3.5;S=B' !FONT 'Vsazeno:' RW @ 'W=0.5;L=1' TEXTBOX DATA@ RW @ 'R=1'TEXTBOX RW.DX @ RW.X +! 'N=Arial Narrow;H=3.5;S=B' !FONT 'Na výhry:' RW @ 'W=0.5;L=1' TEXTBOX
68
DATA@ RW @ 'R=1' TEXTBOX ; ( ------------------------SPORTKA------------------------------------------------ ) variable CT ( promena pro identifikaci dat tahu ) ( Vystup 1 radku tabulky vyher SPORTKA ) : SPO-ROW ROW.DY @ ROW.Y +! ROW.C1X @ ROW.Y @ ROW.C5X @ ROW.C1X @ - 0 'W=0.3' LINE 'N=Arial;H=3,5;S=N' !FONT CT @ SWAP + DATA@ ROW.C3X @ ROW.Y @ ROW.C4X @ ROW.C3X @ ROW.DY @ 'R=1' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT CT @ SWAP + DATA@ ROW.C4X @ ROW.Y @ ROW.C5X @ ROW.C4X @ ROW.DY @ 'R=1' TEXTBOX 'N=Times;H=4;S=B' !FONT ROW.C2X @ ROW.Y @ ROW.C3X @ ROW.C2X @ - ROW.DY '' TEXTBOX 'N=Times;H=4;S=B' !FONT ROW.C1X @ ROW.Y @ ROW.C2X @ ROW.C1X @ - ROW.DY '' TEXTBOX ;
@ @
( slovo pro vystup jednoho tahu sportky ) RECORD RTAH X Y DX DY ENDRECORD : SPO-TAHVYHRY RTAH.Y ! CT ! HBX.X @ RTAH.X ! HBX.DX @ RTAH.DX ! 0 RTAH.DY ! RTAH.X @ RW.X ! RTAH.Y @ RW.Y ! RTAH.DX @ RW.DX ! 7 RW.DY ! ( tabulka vyher ) ( nastavit posice sloupcu ) RTAH.X @ ROW.X ! RTAH.Y @ 17 + DUP ROW.Y ! ROW.Y0 ! RTAH.DX @ ROW.DX ! 5 ROW.DY ! ROW.X @ 6 + ROW.C1X ! ROW.C1X @ 10 + ROW.C2X ! ROW.C2X @ 31 + ROW.C3X ! ROW.C3X @ 17 + ROW.C4X ! ROW.C4X @ 30 + ROW.C5X ! ( Hlavicka tabulky ) ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.5' LINE 'N=Arial Narrow;H=3;S=B' !FONT 'Poøadí' ROW.C1X @ ROW.C1X @ - ROW.DY @ '' TEXTBOX 'N=Arial Narrow;H=3;S=B' !FONT 'Poèet uhodnutých èísel' ROW.C2X @ ROW.C2X @ - ROW.DY @ '' TEXTBOX 'N=Arial Narrow;H=3;S=B' !FONT 'Poèet výher' ROW.C3X @ ROW.C3X @ - ROW.DY @ '' TEXTBOX 'N=Arial Narrow;H=3;S=B' !FONT 'Výše výhry' ROW.C4X @ ROW.C4X @ - ROW.DY @ '' TEXTBOX ( Radky tabulky ) '-' 'Bonus' 'SPO-VB' ROW.C1X @ ROW.Y @ ROW.C5X @ tabulky ) 'I' '6' 'SPO-V1' 'II' '5+dodatkové' 'SPO-V2' 'III' '5' 'SPO-V3' 'IV' '4' 'SPO-V4' 'V' '3' 'SPO-V5'
'SPO-PB' SPO-ROW ROW.C1X @ - 0 'W=0.5' LINE 'SPO-P1' 'SPO-P2' 'SPO-P3' 'SPO-P4' 'SPO-P5'
ROW.C3X @
ROW.Y @ ROW.C3X @ ROW.Y @ ROW.C4X @ ROW.Y @ ROW.C5X @
( Zesilit oddeleni hlavicky
SPO-ROW SPO-ROW SPO-ROW SPO-ROW SPO-ROW
( oddelit sloupce tabulky ) ROW.DY @ ROW.Y +! ROW.C1X @ ROW.Y @ ROW.C5X @ ROW.C1X @ ROW.C2X @ ROW.Y0 @ 0 ROW.Y @ ROW.Y0 @ ROW.C3X @ ROW.Y0 @ 0 ROW.Y @ ROW.Y0 @ ROW.C4X @ ROW.Y0 @ 0 ROW.Y @ ROW.Y0 @ ( Pole pro prevod ) 'N=Arial Narrow;H=3.5;S=B' !FONT ROW.C1X @ - ROW.DY @ 'L=1' TEXTBOX 'N=Arial Narrow;H=3.5;S=B' !FONT ROW.C1X @ - ROW.DY @ 'R=1' TEXTBOX 'N=Arial Narrow;H=3.5;S=B' !FONT ROW.C3X @ - ROW.DY @ 'L=1' TEXTBOX 'N=Arial Narrow;H=3.5;S=B' !FONT ROW.C3X @ - ROW.DY @ 'R=1' TEXTBOX
ROW.Y @ ROW.C2X @
- 0 'W=0.5' LINE - 'W=0.3' LINE - 'W=0.3' LINE - 'W=0.3' LINE
'Pøevod:'
ROW.C1X @ ROW.Y @ ROW.C3X @
CT @ 'SPO-RO' + DATA@ ROW.C1X @ ROW.Y @ ROW.C3X @ 'Jackpot:'
ROW.C3X @ ROW.Y @ ROW.C5X @
CT @ 'SPO-JP' + DATA@ ROW.C3X @ ROW.Y @ ROW.C5X @
ROW.Y @ 0 ROW.DY @ 'W=0.3' LINE
ROW.DY @ ROW.Y +! ROW.C1X @ ROW.Y0 @ 0 ROW.Y @ ROW.Y0 @ - 'W=0.5' LINE ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.5' LINE
69
ROW.X @ RW.X ! ROW.Y0 @ 8 + RW.Y ! ROW.C1X @ ROW.X @ - RW.DX ! 5 RW.DY ! ( Svisla hlavicka textu tahu ) 'N=Arial;H=5;S=B' !FONT CT @ '.' + RW @ '' TEXTBOX RW.DY @ 2 + RW.Y +! 't' RW @ '' TEXTBOX RW.DY @ RW.Y +! 'a' RW @ '' TEXTBOX RW.DY @ RW.Y +! 'h' RW @ '' TEXTBOX HBX.X @ RW.X ! ROW.Y @ RW.Y ! HBX.DX @ RW.DX ! 0 RW.DY ! ; : SPORTKA HBX.Y ! HBX.X ! 94 HBX.DX ! 137 HBX.DY ! 0,5 HBX.SZ ! 70 HBX.DX1 ! 10 HBX.DY1 ! HRABOX RW ! 'N=Times;H=5;S=B' !FONT 'SPORTKA NEDÌLE' RW @ 'T=0.3' TEXTBOX 'N=Times;H=4;S=B' !FONT 'Losování dne: ' 'spo-dl' DATA@ + RW @ 'B=0.3' TEXTBOX ( Cisla ) HBX.X @ RW.X ! HBX.Y @ 10 + RW.Y ! HBX.DX @ RW.DX ! 7 RW.DY ! 'N=Arial Narrow;H=3;S=B' !FONT 'Dodatkové' RW @ 'R=1;T=1' TEXTBOX 'N=Arial Narrow;H=3;S=B' !FONT 'èíslo' RW @ 'R=1;B=0' TEXTBOX 'N=Times;H=4;S=B' !FONT 'Vylosovaná èísla' RW @ 'L=25;B=0' TEXTBOX HBX.X @ RW.X ! HBX.Y @ 17 + RW.Y ! 15 RW.DX ! 8 RW.DY ! 'N=Times;H=5;S=B' !FONT '1. tah' RW @ 'L=2;W=0' TEXTBOX 16 RW.X +! 10 RW.DX ! 'N=Times;H=7;S=B' !FONT '1SPO-C1' DATA@ RW @ 'W=0.5' TEXTBOX '1SPO-C2' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-C3' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-C4' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-C5' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-C6' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-CD' DATA@ HBX.X @ HBX.DX @ + RW.DX @ - 1 - RW.X ! RW @ 'W=0.5' TEXTBOX RW.DY @ RW.Y +! HBX.X @ RW.X ! 'N=Times;H=5;S=B' !FONT 'N=Times;H=7;S=B' !FONT 16 RW.X +! '2SPO-C1' DATA@ '2SPO-C2' DATA@ 10 RW.X '2SPO-C3' DATA@ 10 RW.X '2SPO-C4' DATA@ 10 RW.X '2SPO-C5' DATA@ 10 RW.X '2SPO-C6' DATA@ 10 RW.X '2SPO-CD' DATA@ HBX.X @
'2. tah' RW @ 'L=2;W=0' TEXTBOX RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX HBX.DX @ + RW.DX @ - 1 - RW.X ! RW @ 'W=0.5' TEXTBOX
36 'SPO-VKC' 'SPO-NAV' VSAZENO_A_NAVYHRY '1' HBX.Y @ 25 + SPO-TAHVYHRY '2' HBX.Y @ 67 + SPO-TAHVYHRY 1 RW.Y +! 5 RW.DY ! 'N=Times;H=4;S=B' !FONT 'Pøevod Bonus:' RW @ 'spo-rob' DATA@ RW 5 RW.Y +! 7 RW.DY ! 'N=Times;H=5.5;S=B' !FONT 'Superjackpot:' RW 'spo-sjp' DATA@ RW
'L=1;W=0.5' TEXTBOX @ 'R=1' TEXTBOX @ 'L=1' TEXTBOX @ 'R=1' TEXTBOX
; ( ( ( :
------------------------------------- ) ----Definice slova SPORTKA----------- ) ------------------------------------- ) SPORTKA HBX.Y ! HBX.X ! 94 HBX.DX ! 137 HBX.DY ! 0,5 HBX.SZ ! 70 HBX.DX1 ! 10 HBX.DY1 ! HRABOX RW ! 'N=Times;H=5;S=B' !FONT 'SPORTKA STØEDA' RW @ 'T=0.3' TEXTBOX 'N=Times;H=4;S=B' !FONT 'Losování dne: ' 'spo-dl' DATA@ + RW @ 'B=0.3' TEXTBOX ( Cisla ) HBX.X @ RW.X ! HBX.Y @ 10 + RW.Y ! HBX.DX @ RW.DX ! 7 RW.DY ! 'N=Arial Narrow;H=3;S=B' !FONT 'Dodatkové' RW @ 'R=1;T=1' 'N=Arial Narrow;H=3;S=B' !FONT 'èíslo' RW @ 'R=1;B=0'
70
TEXTBOX TEXTBOX
'N=Times;H=4;S=B' !FONT 'Vylosovaná èísla' RW @ 'L=25;B=0' TEXTBOX HBX.X @ RW.X ! HBX.Y @ 17 + RW.Y ! 15 RW.DX ! 8 RW.DY ! 'N=Times;H=5;S=B' !FONT '1. tah' RW @ 'L=2;W=0' TEXTBOX 16 RW.X +! 10 RW.DX ! 'N=Times;H=7;S=B' !FONT '1SPO-C1' DATA@ RW @ 'W=0.5' TEXTBOX '1SPO-C2' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-C3' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-C4' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-C5' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-C6' DATA@ 10 RW.X +! RW @ 'W=0.5' TEXTBOX '1SPO-CD' DATA@ HBX.X @ HBX.DX @ + RW.DX @ - 1 - RW.X ! RW @ 'W=0.5' TEXTBOX RW.DY @ RW.Y +! HBX.X @ RW.X ! 'N=Times;H=5;S=B' !FONT 'N=Times;H=7;S=B' !FONT 16 RW.X +! '2SPO-C1' DATA@ '2SPO-C2' DATA@ 10 RW.X '2SPO-C3' DATA@ 10 RW.X '2SPO-C4' DATA@ 10 RW.X '2SPO-C5' DATA@ 10 RW.X '2SPO-C6' DATA@ 10 RW.X '2SPO-CD' DATA@ HBX.X @
'2. tah' RW @ 'L=2;W=0' TEXTBOX RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX +! RW @ 'W=0.5' TEXTBOX HBX.DX @ + RW.DX @ - 1 - RW.X ! RW @ 'W=0.5' TEXTBOX
36 'SPO-VKC' 'SPO-NAV' VSAZENO_A_NAVYHRY '1' HBX.Y @ 25 + SPO-TAHVYHRY '2' HBX.Y @ 67 + SPO-TAHVYHRY 1 RW.Y +! 5 RW.DY ! 'N=Times;H=4;S=B' !FONT 'Pøevod Bonus:' RW @ 'spo-rob' DATA@ RW 5 RW.Y +! 7 RW.DY ! 'N=Times;H=5.5;S=B' !FONT 'Superjackpot:' RW 'spo-sjp' DATA@ RW
'L=1;W=0.5' TEXTBOX @ 'R=1' TEXTBOX @ 'L=1' TEXTBOX @ 'R=1' TEXTBOX
;
( ( ( ( ( :
------------------------------------- ) ----HRA ŠANCE------------------------ ) ------------------------------------- ) ----Definice slova SANCE------------- ) ------------------------------------- ) SANCE HBX.Y ! HBX.X ! 94 HBX.DX ! 84 HBX.DY ! 70 HBX.DX1 ! 10 HBX.DY1 ! HRABOX RW ! 'N=Times;H=5;S=B' !FONT 'ŠANCE STØEDA' RW @ 'T=0.3' TEXTBOX 'N=Times;H=4;S=B' !FONT 'Losování dne: ' 'san-dl' DATA@ + RW @ 'B=0,3' TEXTBOX 'N=Times;H=4;S=B' !FONT 'Vylosovaná èísla' HBX.X '' TEXTBOX 'N=Times;H=6;S=B' !FONT HBX.X @ 11 + RW.X ! HBX.Y @ 17 + RW.Y ! 12 RW.DX 'SAN-C' DATA@ 1 1 SUBSTR RW @ 'W=0.5' 'SAN-C' DATA@ 2 1 SUBSTR 11 RW.X +! RW @ 'W=0.5' 'SAN-C' DATA@ 3 1 SUBSTR 11 RW.X +! RW @ 'W=0.5' 'SAN-C' DATA@ 4 1 SUBSTR 11 RW.X +! RW @ 'W=0.5' 'SAN-C' DATA@ 5 1 SUBSTR 11 RW.X +! RW @ 'W=0.5' 'SAN-C' DATA@ 6 1 SUBSTR 11 RW.X +! RW @ 'W=0.5' 'N=Arial Narrow;H=3;S=B' !FONT
@ HBX.Y @ 12 + HBX.DX @ 5 ! 8 RW.DY ! TEXTBOX TEXTBOX TEXTBOX TEXTBOX TEXTBOX TEXTBOX
26 'SAN-VKC' 'SAN-NAV' VSAZENO_A_NAVYHRY HBX.X @ ROW.X ! HBX.Y @ 32 + DUP ROW.Y ! ROW.Y0 ! HBX.DX @ ROW.DX ! 5.5 ROW.DY ! ROW.X @ 39 + ROW.C1X ! ROW.C1X @ 25 + ROW.C2X ! ROW.C2X @ 30 + ROW.C3X ! ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.5' LINE 'N=Arial Narrow;H=4;S=B' !FONT '' ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ '' TEXTBOX 'N=Arial Narrow;H=3;S=B' !FONT 'Poèet výher' ROW.C1X @ ROW.Y @ ROW.C2X @ ROW.C1X @ - ROW.DY @ '' TEXTBOX
71
'N=Arial Narrow;H=3;S=B' !FONT 'Výše výhry' ROW.C2X @ ROW.Y @ ROW.C3X @ ROW.C2X @ - ROW.DY @ '' TEXTBOX ROW.DY @ ROW.Y +! ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.5' LINE 'N=Times;H=3,6;S=B' !FONT 'šestièíslí' ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'L=2' TEXTBOX 'SAN-C' DATA@ 1 1 SUBSTR ' ' + 'SAN-C' DATA@ 2 1 SUBSTR + ' ' + 'SAN-C' DATA@ 3 1 SUBSTR + ' ' + 'SAN-C' DATA@ 4 1 SUBSTR + ' ' + 'SAN-C' DATA@ 5 1 SUBSTR + ' ' + 'SAN-C' DATA@ 6 1 SUBSTR + ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'R=2' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-P1' DATA@ ROW.C1X @ ROW.Y @ ROW.C2X @ ROW.C1X @ - ROW.DY @ 'R=1' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-V1' DATA@ ROW.C2X @ ROW.Y @ ROW.C3X @ ROW.C2X @ - ROW.DY @ 'R=1' TEXTBOX ROW.DY @ ROW.Y +! ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.3' LINE 'N=Times;H=3,6;S=B' !FONT 'pìtièíslí' ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'L=2' TEXTBOX 'SAN-C' DATA@ 2 1 SUBSTR ' ' + 'SAN-C' DATA@ 3 1 SUBSTR + ' ' + 'SAN-C' DATA@ 4 1 SUBSTR + ' ' + 'SAN-C' DATA@ 5 1 SUBSTR + ' ' + 'SAN-C' DATA@ 6 1 SUBSTR + ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'R=2' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-P2' DATA@ ROW.C1X @ ROW.Y @ ROW.C2X @ ROW.C1X @ - ROW.DY @ 'R=1' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-V2' DATA@ ROW.C2X @ ROW.Y @ ROW.C3X @ ROW.C2X @ - ROW.DY @ 'R=1' TEXTBOX ROW.DY @ ROW.Y +! ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.3' LINE 'N=Times;H=3,6;S=B' !FONT 'ètyøèíslí' ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'L=2' TEXTBOX 'SAN-C' DATA@ 3 1 SUBSTR ' ' + 'SAN-C' DATA@ 4 1 SUBSTR + ' ' + 'SAN-C' DATA@ 5 1 SUBSTR + ' ' + 'SAN-C' DATA@ 6 1 SUBSTR + ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'R=2' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-P3' DATA@ ROW.C1X @ ROW.Y @ ROW.C2X @ ROW.C1X @ - ROW.DY @ 'R=1' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-V3' DATA@ ROW.C2X @ ROW.Y @ ROW.C3X @ ROW.C2X @ - ROW.DY @ 'R=1' TEXTBOX ROW.DY @ ROW.Y +! ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.3' LINE 'N=Times;H=3,6;S=B' !FONT 'trojèíslí' ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'L=2' TEXTBOX 'SAN-C' DATA@ 4 1 SUBSTR ' ' + 'SAN-C' DATA@ 5 1 SUBSTR + ' ' + 'SAN-C' DATA@ 6 1 SUBSTR + ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'R=2' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-P4' DATA@ ROW.C1X @ ROW.Y @ ROW.C2X @ ROW.C1X @ - ROW.DY @ 'R=1' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-V4' DATA@ ROW.C2X @ ROW.Y @ ROW.C3X @ ROW.C2X @ - ROW.DY @ 'R=1' TEXTBOX ROW.DY @ ROW.Y +! ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.3' LINE 'N=Times;H=3,6;S=B' !FONT 'dvojèíslí' ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'L=2' TEXTBOX 'SAN-C' DATA@ 5 1 SUBSTR ' ' + 'SAN-C' DATA@ 6 1 SUBSTR + ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'R=2' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-P5' DATA@ ROW.C1X @ ROW.Y @ ROW.C2X @ ROW.C1X @ - ROW.DY @ 'R=1' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-V5' DATA@ ROW.C2X @ ROW.Y @ ROW.C3X @ ROW.C2X @ - ROW.DY @ 'R=1' TEXTBOX ROW.DY @ ROW.Y +!
72
ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.3' LINE 'N=Times;H=3,6;S=B' !FONT 'koncové èíslo' ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'L=2' TEXTBOX 'SAN-C' DATA@ 6 1 SUBSTR ROW.X @ ROW.Y @ ROW.C1X @ ROW.X @ - ROW.DY @ 'R=2' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-P6' DATA@ ROW.C1X @ ROW.Y @ ROW.C2X @ ROW.C1X @ - ROW.DY @ 'R=1' TEXTBOX 'N=Arial;H=3,5;S=N' !FONT 'SAN-V6' DATA@ ROW.C2X @ ROW.Y @ ROW.C3X @ ROW.C2X @ - ROW.DY @ 'R=1' TEXTBOX ROW.DY @ ROW.Y +! ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.5' LINE ROW.C1X @ ROW.Y0 @ 0 ROW.Y @ ROW.Y0 @ - 'W=0.3' LINE ROW.C2X @ ROW.Y0 @ 0 ROW.Y @ ROW.Y0 @ - 'W=0.3' LINE 'N=Arial;H=3;S=B' !FONT 'PØEVOD:' ROW.X @ ROW.Y @ ROW.DX @ ROW.DY @ 'L=3' TEXTBOX 'N=Arial;H=3;S=B' !FONT 'SAN-RO' DATA@ ROW.X @ ROW.Y @ ROW.DX @ ROW.DY @ 'R=10' TEXTBOX ROW.DY @ ROW.Y +! 6 ROW.DY ! ROW.X @ ROW.Y @ ROW.DX @ 0 'W=0.5' LINE 'N=Times;H=5,5;S=B' !FONT 'JACKPOT:' ROW.X @ ROW.Y @ ROW.DX @ ROW.DY @ 'L=2,T=1' TEXTBOX 'N=Times;H=5,5;S=B' !FONT 'SAN-JP' DATA@ ROW.X @ ROW.Y @ ROW.DX @ ROW.DY @ 'R=10,T=1' TEXTBOX ;
( ------------------------------------- ) ( ----HRA Š•ASTNÝCH 10----------------- ) ( ------------------------------------- ) ( ----Definice slova ST10_1------------ ) ( ------------------------------------- ) VARIABLE DST10 ( Data pro polozku stastnych 10 ) RECORD RST10_1 X Y DX DY ENDRECORD ( Rectangle pro polozku stastnych 10 ) ( Slovo ST10_1 provede výstup 1 položky š•astných 10 volání X Y DATA ST10_1 ) : ST10_1 DST10 ! 92 13 RST10_1 ! RST10_1 @ 'W=0.4' RECTANGLE 'N=Arial Narrow;H=3,4;S=B' !FONT 'DRREP' DATA@ '\korunka.bmp' + RST10_1.X @ 1,3 + RST10_1.Y @ 2 + 4 4 PICTURE RST10_1.X @ 1,5 + RST10_1.Y @ 7 + 4 5 RW ! 61 1 DO DST10 @ 'C' ';' ATTR@ I 2 SUBSTR RW @ 'W=0.3' TEXTBOX 4.5 RW.X +! 3 +LOOP 'N=Arial;H=4;S=B' !FONT DST10 @ 'DT' ';' ATTR@ RST10_1.X @ 6 + RST10_1.Y @ 1.4 + 25 4 '' TEXTBOX 'N=Arial;H=4;S=B' !FONT 'Šance milion' RST10_1.X @ 33 + RST10_1.Y @ 1,3 + 25 4 '' TEXTBOX 'N=Arial Narrow;H=3,5;S=B' !FONT RST10_1.X @ 64 + RST10_1.Y @ 1,5 + 4 4 RW ! 7 1 DO DST10 @ 'SM' ';' ATTR@ I 1 SUBSTR RW @ 'W=0.2' TEXTELLIPSE 4.6 RW.X +! LOOP ; ( ( ( :
------------------------------------- ) ----Definice slova ST10-------------- ) ------------------------------------- ) ST10 HBX.Y ! HBX.X ! 94 HBX.DX ! 229 HBX.DY ! 70 HBX.DX1 ! 10 HBX.DY1 ! HRABOX RW ! 'N=Times;H=5;S=B' !FONT 'Š•ASTNÝCH 10' RW @ '' TEXTBOX HBX.X @ 1 + PW.X ! HBX.Y @ 12 + PW @ '01-ST10' DATA@ 15 PW.Y +! PW @ '02-ST10' DATA@ 15 PW.Y +! PW @ '03-ST10' DATA@
PW.Y ! ST10_1 ST10_1 ST10_1
73
15 15 15 15 15 15 15 15 15 15 15
PW.Y PW.Y PW.Y PW.Y PW.Y PW.Y PW.Y PW.Y PW.Y PW.Y PW.Y
+! +! +! +! +! +! +! +! +! +! +!
PW PW PW PW PW PW PW PW PW PW PW
@ @ @ @ @ @ @ @ @ @ @
'04-ST10' '05-ST10' '06-ST10' '07-ST10' '08-ST10' '09-ST10' '10-ST10' '11-ST10' '12-ST10' '13-ST10' '14-ST10'
DATA@ DATA@ DATA@ DATA@ DATA@ DATA@ DATA@ DATA@ DATA@ DATA@ DATA@
HBX.X @ RW.X ! HBX.Y @ HBX.DY @ 'N=Arial Narrow;H=3;S=B' !FONT 'Èíslo nad kterým je symbol' RW 'je výherním èíslem "KRÁLOVSKÉ 'DRREP' DATA@ '\korunka.bmp' +
ST10_1 ST10_1 ST10_1 ST10_1 ST10_1 ST10_1 ST10_1 ST10_1 ST10_1 ST10_1 ST10_1 + 2 - RW.Y ! HBX.DX @ RW.DX ! 1 RW.DY ! @ 'L=2;B=0' TEXTBOX HRY"' RW @ 'R=2;B=0' TEXTBOX RW.X @ 38 + RW.Y @ 4 - 5 5 PICTURE
; ( ( ( (
---------------------------------------MAIN---------------------------------spusteni skriptu-----------------------------------------------------
2 5 2 33 2 178 99 33 3 264 .INFO
) ) ) )
HEADER SPORTKA SANCE ST10 FOOTER
74
Příloha 4 – Pouţité zkratky
Uživatelský zásobník (US) je typu variant. Vzhledem k tomu, slova pracující s tímto zásobníkem se můžou lišit od standardu, kde uživatelský slovník je typu word. Pouţité zkratky - Zásobník US
(User Stack)
uživatelský zásobník
RS
(Return Stack)
pracovní zásobník (návratové adresy, počitadla cyklů, proměnné cyklu)
TOS
(Top Of Stack)
hodnota na vrcholu US
NOS
(Next On Stack) hodnota v US před TOS a podobně další NNOS, NNNOS atd.
Tabulka 5 – Pouţité zkratky - Zásobník
Některá slova jsou zobecněná pro typy variant např. + - * atd., jiná naopak chybí, např. slova pro práci s binární aritmetikou nebo s řetězci. V popisu slovníku je toto zohledněno příznakem kompatibility se standardem Fig Forth a to pomocí zkratek T0 až T9.
Pouţité zkratky - Kompatibilita T0
plně kompatibilní se standardem (se zohledněním, že položka US je typu variant),
T1-T8 částečně kompatibilní se standardem T9
zcela nové slovo
Tabulka 6 – Pouţité zkratky - Kompatibilita
Dále v popisu slovníku používám označení typů, které slovo může zpracovat Typy hodnot pouţitelných v uţivatelském zásobníku N
Numeric
S
String
D
Date
L
Logical
X
Null
V
Variant (může být typu N,S,D,L,X)
Tabulka 7 – Pouţité zkratky - Typy hodnot pouţitelných v US
Kombinaci více typů např. SN označíme hodnotu, která může být typu S (string) nebo N (numeric)
75
Syntaxe Syntaxi slova popisujeme stav
US před akcí -> stav US po akci
Stav US zapisujeme v pořadí
NNNOS NNOS NOS TOS
Komentář nebo poznámka
{text} nebo ( text )
Symbolika popisu syntaxe:
<word> ... tj. <word>
Tabulka 8 – Syntaxe
Obsah US je uváděn pouze pro hodnoty, které se operace účastní. Módy spouštění
C
Slova použitelná v módu kompilačním jsou označena ( jde většinou o programové konstrukce)
E
Slova použitelná v módu exekučním
S
Slova systémová, používá je kompilátor. Programátoru se nezakazuje jejich použití,
ale nedoporučuje se to, při použití je nutno přesně znát sémantiku slova I
Slova Immediate jsou spuštěna vždy jako exekuční, nikdy se nekompilují
Tabulka 9 – Pouţité zkratky – Módy spouštění
Slova nelze využít obecně v každém módu. V popisu slovníku jsou využity značky, které charakterizují, kde mohou být slova použita a jak budou spuštěna.
76
Příloha 5 – Základní slovník jazyka P42
Konstrukční slova :
T0
účel
Definice nového slova. Přepne do kompilačního módu.
syntaxe
:
význam
První slovo za : je identifikátor nového slova, definice je ukončena ; V těle nového slova můžeme použít libovolná slova ze slovníku, včetně uživatelských slov dříve definovaných.
příklad použití
: 3DUP DUP DUP ;
E
( Vytvoří nové slovo 3DUP, které po zavolání ( uloží na vrchol zásobníku 3x hodnotu, ( která byla původně v TOS )
;
T0
účel
Ukončení definice nového slova jako konstanty
syntaxe
;
význam
Ukončí definici nového slova a přepne do exekučního módu
příklad použití
: 3DUP DUP DUP ;
C
( Vytvoří nové slovo 3DUP, které po zavolání ( uloží na vrchol zásobníku 3x hodnotu, ( která byla původně v TOS )
CONSTANT
T0
účel
Definice nového slova jako konstanty.
syntaxe
CONSTANT
význam
Vytvoří se nové slovo ID. Při jeho použití se do TOS vloží hodnota V
příklad použití
E
nadefinování konstanty: 3.14 CONSTANT PI ( Vytvoří se slovo PI ) 'Marcela Turková' CONSTANT MojeJmeno ( Vytvoří se slovo MojeJmeno ) volání konstanty: PI ( Do TOS bude vložena hodnota 3,14 ) MojeJmeno ( Do TOS bude vložena hodnota Marcela Turková )
VARIABLE
T0
účel
Definice nového slova jako proměnné
syntaxe
VARIABLE
význam
Vytvoří se nové slovo ID, jeho použití předá do TOS hodnotu adresu pole, kde může být uložena hodnota V. Pro uložení hodnoty na adresu užijeme slovo ! (vykřičník) pro čtení hodnoty slovo @ (zavináč).
příklad použití
E
VARIABLE EXV ( Vytvoří se slovo EXV. ) EXV @ ( Použitím EXV @ uložíme do TOS aktuální hodnotu proměnné EXV ) 'beta' EXV ! ( Uložíme do proměnné EXV hodnotu 'beta' )
77
RECORD ENDRECORD
T9
E
účel
Definice nových slov jako systém proměnných. Rozšíření slova VARIABLE pro systém proměnných. Toto slovo bylo implementováno pro zlepšení čitelnosti programů a zmenšení nároků na rozsah kompilovaného programu
syntaxe
RECORD < IR - identifikátor recordu> < I1 -identifikátor položky> ... ENDRECORD
význam
Vytvoří se sada nových slov IR IR.I1 IR.I2 .... IR.In Uložení hodnoty z US do položky recordu IR.I1 ! - pro uložení je použito slovo ! Přečtení hodnoty z položky recordu do US IR.I1 @ - pro čtení je použito slovo @ analogicky pro ostatní položky Je možno uložit a přečíst najednou všechny hodnoty recordu použitím slova recordu IR ... IR ! hodnoty se uloží do položek ve stejném pořadí tj. hodnota v TOS bude v položce In. Přečtení všech položek IR @ ...
příklad použití
RECORD HEAD1 X Y SZ ENDRECORD 'x' 'y' 'z' 'sz' HEAD1 ! HEAD1 @ ( V US budou hodnoty 'x' 'y' 'z' 'sz' HEAD1.X @ ( do US se vloží hodnota 'x' ) 125 HEAD1.X ! HEAD1.X @ ( do US se vloží hodnota 125 ) HEAD1.Y @ ( do US se vloží hodnota 'y' )
ARRAY
T9
účel
Definice pole
syntaxe
ARRAY
význam
Vytvoří se dvě slova
)
E
ID ID.I Slovo ID předá do US adresu 0-té položky pole, kde se nachází dimenze pole. Použití slova ID umožní přečíst do US celý obsah pole nebo z US naplnit pole. .. ID ! Uloží do pole hodnoty V1 .... Vn z US. Počet je dán hodnotou n zadanou v TOS n musí být menší než dimense pole ID @ .. . Uloží do US hodnoty V1 .... Vn z pole. Počet n v TOS je počet prvků naposledy uložených do pole. Slovo ID.I předá do US adresu položky pole kde se nachází n-tá hodnota. Hodnotu přečteme slovem @ a uložíme slovem ! ID.I ! ID.I @
78
Pozn. Pole je indexováno od 0
příklad použití
5 ARRAY AX 10 ARRAY AY 1 2 3 3 AX ! 0 AX.I @ SP! 125 0 AX.I 0 AX.I @ AX @ ) AX @ AY ! AY @
( ( ( ( ! ( (
Definuje pole AX dimenze 5 ) Definuje pole AY dimenze 10 ) do pole AX uloží 3 hodnoty 1,2,3. 1 je A[0] ) Do US vloží hodnotu A[0] tj. 1 ) ( do pole s indexem 0 uloží hodnotu 125 ) Do US vloží hodnotu A[0] tj. 125 ) do US vloží 3 hodnoty z pole AX a počet tj. obsah US ( bude 1 2 3 3 ) ( 3 hodnoty z pole AX budou přesunuty do pole AY ) ( do US vloží 3 hodnoty z pole AY a počet tj. ) ( obsah US bude 1 2 3 3 )
Příkazy pro řízení, vstupy a výstupy, informace o nadřazené aplikaci [ ]
T0
účel
Vykonání skriptu v exekučním módu
syntaxe
[ <skript> ]
význam
Používá se pokud je potřeba vykonat příkazy v exekučním módu v kompilovaném slově.
příklad použití
CEI
: DTCOMPILACE [ NOW ] LITERAL ; slovo NOW se při kompilaci vykoná a hodnota data a času kompilace se uloží do programu. Volání slova DTCOMPILACE do TOS vloží toto datum a čas .
( )
T0
CEI
účel
Vložení komentáře do programu
syntaxe
( komentář )
význam
Vše mezi těmito slovy bude chápáno jako komentář. Pozor slovo ( a slovo ) jsou standardní slova a musí být oddělena mezerou nebo CRLF
příklad použití
( toto je poznamka ke kodu)
COLD
T0
účel
Studený start
syntaxe
COLD
význam
Nulují se zásobníky, restart jazyka P42
příklad použití
COLD
CE
79
INTERPRET
T1
CE
účel
Interpretuje textový řádek z US
syntaxe
<S {skript v jazyce P42} > INTERPRET
význam
Interpretace řetězce v jazyce P42. Lze použít např. k interpretaci skriptu uloženém v souboru nebo zadaném během zpracování programu slovem INPUT
příklad použití
'proveď ' INPUT INTERPRET
LOAD
T9
účel
Načtení programu
syntaxe
LOAD
význam
Program se načítá z textového souboru. Jeho cesta je typ S
příklad použití
Obsah textového souboru nacteni_1.prg [2009] ............ ............ prog1=begin ................. -program................. program=end ................... načtení programu z obsahu textového souboru podle sekce [2009] 'nacteni_1.prg' '2009' 'prog1' LOAD
.US
T0
účel
Výpis zásobníku
syntaxe
.US
význam
Vypíše obsah zásobníku US nedestruktivně do systémové komponenty LIST. Ta je definována jako objekt v aplikaci
příklad použití
5 7 9 'ALFA' .US
.INFO
T9
účel
Výpis informací o stavu zásobníku
syntaxe
.INFO
význam
Vypíše stav obsazení US, pole pro PROGRAM a pole pro SLOVNIK do systémové komponenty LIST. Ta je definována jako objekt v aplikaci
příklad použití
.INFO
TRACE_ON
T9
CE
CE
CE
CE
80
účel
Spuštění trasování
syntaxe
TRACE_ON
význam
Otevře okno, ve kterém je vypisován obsah zásobníku US. Slova jsou interpretována postupně na povel tlačítka Krok. V okně je zobrazován stav zásobníku.
příklad použití
trace_on 12 DUP * . trace_off
Obrázek 23 – Okno pro trasování
TRACE_OFF
T9
CE
účel
Ukončení trasování
syntaxe
TRACE_OFF
význam
Uzavře okno, ve kterém je vypisován obsah zásobníku US.
příklad použití
trace_on 12 DUP * . trace_off
.
T0
účel
Výpis uživatelského zásobníku
syntaxe
.
význam
Vypíše do systémové komponenty LIST obsah vrcholu uživatelského zásobníku TOS položka v TOS je zrušena. (Pro různé typy variant se provede konverze do typu String)
CE
81
příklad použití
5 7 .
.DICT
T9
účel
Výpis slovníku
syntaxe
. DICT
význam
Vypíše obsah slovníku do systémové komponenty LIST. Ta je definována v aplikaci
příklad použití
.DICT
.COMP
T9
účel
Výpis komponent typu TControl v aktivním formuláři
syntaxe
.COMP
význam
Vypíše všechny komponenty typu control v aktivním formuláři do systémové komponenty LIST definované v aplikaci
příklad použití
.COMP
.PRG
T9
účel
Vypíše obsah pole PROG
syntaxe
.PRG
význam
Vypíše obsah pole PROG do systémové komponenty LIST. Komponenta LIST je definována v aplikaci
příklad použití
.PRG
CE
CE
CE
INDEX_COMPONENT T9
CE
účel
Předání indexu komponenty v aktivním formuláři
syntaxe
INDEX_COMPONENT
význam
Předá do TOS US index komponenty typu TControl v aktivním formuláři
příklad použití
button1 INDEX_COMPONENT button1
TYP_COMP
T9
CE
účel
Předání informace o typu komponenty
syntaxe
TYP_COMP <S {Typ classu komponenty}>
82
význam
Předá do TOS US informace o typu componenty
příklad použití
Button1 TYP_COMP
MESSAGE
T9
účel
Výpis standardní zprávy s daným textem
syntaxe
<S - {Hlavička}> <S - {Zpráva}> <S - {Seznam tlačítek oddělených ;}> MESSAGE
význam
Na display vypíše standardní message box s daným textem. Box se uzavře jedním z tlačítek, pořadí tohoto tlačítka se předá do TOS US
příklad použití
'Zpráva'
FORGET
T0
účel
Výmaz uživatelsky definovaných slov od vrcholu slovníku až po zvolené slovo.
syntaxe
FORGET <S {identifikátor typu S uživatelsky definovaného slova}>
význam
Zruší všechna uživatelsky definovaná slova od vrcholu slovníku až po zvolené slovo.
příklad použití
FORGET NEW
INPUT
T9
účel
Aktivuje formulář pro vstup jedné hodnoty do TOS
syntaxe
INPUT
význam
Otevře se vstupní box pro vstup řetězce. vystupuje jako hlavička vstupního formuláře. Vložený text do boxu se předá do TOS US
příklad použití
'pokus' INPUT
CE
'Chybný kód ignorovat' 'Ok;No' MESSAGE
CE
CE
Základní početní operace MINUS
T0
CE
účel
Změna znaménka TOS
syntaxe
MINUS <-N>
význam
Změna znaménka v TOS US .
příklad použití
5.2 MINUS
-
T2
( -5.2 -> TOS )
CE
83
účel
Rozdíl hodnot typu N, D v TOS NOS
syntaxe
- { je -}
význam
Aritmetická operace rozdíl, je rozšířená i na typ D Povolené kombinace V1,V2 a typ V3 N N -> N N D -> D D N -> D D D -> D
příklad použití
5.2 0.1 31.12.2009 2 -
+
T2
účel
Součet hodnot typu N,C,D v TOS NOS
syntaxe
+
význam
Aritmetická operace součet, je rozšířená i na typ D a C Povolené kombinace V1 a V2 a typ V3 N N -> N N D -> D D N -> D D D -> D S S -> S
příklad použití
5.2 4.3 + 'Výherní' 'listina' + 31.12.2009 2 +
*
T1
účel
Součin hodnot NOS*TOS
syntaxe
*
význam
Aritmetická operace součin, je rozšířená i na typ D Povolené kombinace V1,V2 a typ V3 N N -> N N D -> D D N -> D D D -> D
příklad použití
5.2 3 *
/
T1
účel
Podíl hodnot NOS/TOS výsledek typ N
syntaxe
/
význam
Dělení dvou hodnot typu N
příklad použití
6.3 3 /
( 5.1 -> TOS ) ( 29.12.2009 -> TOS )
CE
( 9.5 -> TOS ) ( Výherní listina -> TOS ) ( 2.1.2010 -> TOS )
CE
( 15.6 -> TOS )
CE
{N3 je podíl N1/N2}>
( 2.1 ->TOS )
84
NOT
T1
účel
Unární logický operátor negace
syntaxe
NOT
význam
CE
Povolené kombinace: L -> L N -> N Pro typu N se operace negace se provede na všechny bity čísla. Nedostaneme tedy číslo s opačným znaménkem. Číslo reálné se před operací zaokrouhluje na celé, tj. 0 desetinných míst.
příklad použití
5 NOT 3 NOT false NOT
AND
T1
účel
Binární logický operátor logické and
syntaxe
AND
význam
( -6 -> TOS ) ( -4 -> TOS ) ( true -> TOS )
CE
L L -> L L N -> N N L -> N N N -> N Je-li jeden z operandů typu N a druhý L chápe se operátor L jako N a to tak, že pro true má všechny bity 1 tj. jako hodnota -1, pro false všechny bity 0 tj. hodnota 0. Operace se provede na všechny bity operandů. Čísla reálná se před operací zaokrouhlují na celá, tj. 0 desetinných míst.
příklad použití
5 true AND 3 5 AND true false AND
OR
T1
účel
Binární logický operátor logické or
syntaxe
OR
význam
Povolené kombinace typů L L -> L L N -> N N L -> N N N -> N Je-li jeden z operandů typu N a druhý L, chápe se operátor L jako N a to tak, že pro true má všechny bity 1 tj. jako hodnota -1, pro false všechny bity 0 tj. hodnota 0. Operace se provede na všechny bity operandů. Čísla reálná se před operací zaokrouhlují na celá, tj. 0 desetinných míst.
příklad použití
( 5 -> TOS ) ( 1 -> TOS ) ( false -> TOS )
CE
5 true OR-
( 1 -> TOS )
3 5 OR
( 7->TOS )
true false OR
( true->TOS )
85
XOR
T1
účel
Binární logický operátor exklusive or
syntaxe
V1> XOR
význam
Povolené kombinace typů L L -> L L N -> N N L -> N N N -> N Je-li jeden z operandů typu N a druhý L chápe se operátor L jako N a to tak, že pro true má všechny bity 1 tj. jako hodnota -1, pro false všechny bity 0 tj. hodnota 0. Operace se provede na všechny bity operandů. Čísla reálná se před operací zaokrouhlují na celá, tj. 0 desetinných míst.
příklad použití
CE
5 true XOR
( -6->TOS )
3 5 XOR
( 6->TOS )
true false XOR
( true->TOS )
SCOS
T9
CE
účel
Výpočet hodnoty cosinus
syntaxe
SCOS
význam
Výpočet hodnoty cosinus argumentu-argument je ve stupních
příklad použití
45 SCOS . (0,707106781186548 do TOS)
SSIN
T9
účel
Výpočet hodnoty sinus
syntaxe
SSIN
význam
Výpočet hodnoty sinus argumentu-argument je ve stupních
příklad použití
45 ssin . (0,707106781186548 do TOS)
CE
Slova pro práci s řetězci SUBSTR
T9
CE
účel
Substring ze stringu
syntaxe
<S {Zdrojový řetězec}> SUBSTR <S {Výsledný řetězec}>
význam
Z řetězce S kopíruje do TOS N2 znaků počínaje pozicí N1
86
příklad použití
'123456' 2 3 substr
LTRIM
T9
účel
Zruší mezery v řetězci zleva. Zdrojový řetězec v TOS, výsledný řetězec v TOS
syntaxe
LTRIM
význam
Pro odstranění úvodních mezer ze řetězce
příklad použití
'
RTRIM
T9
účel
Zruší mezery v řetězci zprava. Zdrojový řetězec v TOS, výsledný řetězec v TOS.
syntaxe
RTRIM
význam
Pro odstranění koncových mezer ze řetězce
příklad použití
'123456
TRIM
T9
účel
Zruší mezery v řetězci zleva i zprava. Zdrojový řetězec v TOS, výsledný řetězec v TOS.
syntaxe
TRIM
význam
Pro odstranění úvodních a koncových mezer ze řetězce
příklad použití
'
PADR
T9
účel
Doplnění řetězce zprava na počet znaků zvoleným řetězcem
syntaxe
<S {Zdrojový řetězec}> <S {Doplňkový řetězec}> PADR <S {Výsledný řetězec}>
význam
Slovo doplní zprava doplňkovým řetězcem zdrojový řetězec tak, aby výsledný řetězec měl délku na zadaný počet znaků
příklad použití
'X' 10 'ab' padr
PADL
T9
účel
Doplnění řetězce zleva na počet znaků zvoleným řetězcem
syntaxe
<S {Zdrojový řetězec}> <S {Doplňkový řetězec}> PADL <S {Výsledný řetězec}>
( '234'->TOS )
CE
123456' LTRIM
( '123456'->TOS )
CE
' RTRIM
( '123456'->TOS )
CE
123456
' RTRIM
( '123456'->TOS )
CE
( 'Xababababa'->TOS )
CE
87
význam
Slovo doplní zleva doplňkovým řetězcem zdrojový řetězec tak, aby výsledný řetězec měl délku na zadaný počet znaků
příklad použití
'X' 10 'ab' padl
PADC
T9
účel
Doplnění řetězce zprava i zleva na počet znaků zvoleným řetězcem
syntaxe
<S {Zdrojový řetězec}> <S {Doplňkový řetězec}> PADC <S {Výsledný řetězec}>
význam
Slovo doplní zprava i zleva doplňkovým řetězcem zdrojový řetězec tak, aby výsledný řetězec měl délku na zadaný počet znaků
příklad použití
'X' 10 'ab' padc
STUFF
T9
účel
Vložení substringu místo části stringu
syntaxe
<S {Zdrojový řetězec}> <S {Vkládaný řetězec}> STUFF <S {Výsledný řetězec}>
význam
Přepíše N2 znaků zdrojového řetězce vkládaný od pozice N1 řetězcem S
příklad použití
'abcdef' '12' 2 3 stuff
INSERT
T9
účel
Vložení řetězce do řetězce
syntaxe
<S {Zdrojový řetězec}> <S {Vkládaný řetězec}> INSERT <S {Výsledný řetězec}>
význam
Vloží do zdrojového řetězce řetězec od pozice vložení N
příklad použití
'abcdef' '12' 3 insert
STRTRAN STRREPLACE
( 'bababababX'->TOS )
CE
('ababXababa' ->TOS )
CE
( 'a12ef' ->TOS )
CE
( 'ab12cdef'->TOS )
T9
CE
účel
Nahrazení všech subřetězců v řetězci novým řetězcem
syntaxe
<S {Zdrojový řetězec}> <S {Starý subřetězec}> <S {Nový subřetězec}>STRTRAN <S {Výsledný řetězec}>
význam
Slova STRTRAN a STRREPLACE jsou ekvivalentní
příklad použití
'Jackpot na ? bude:' '?' 'pátek' STRTRAN -> TOS )
88
('Jackpot na pátek bude:'
BLANKS
T2
CE
účel
Vkládání mezer
syntaxe
BLANKS <S {výsledný řetězec}
význam
Vloží N mezer jako řetězec do TOS
příklad použití
10 BLANKS
CPCONVERT
T9
účel
Konverze kódových stránek
syntaxe
<S {vstupní řetězec}> CPCONVERT <S {výsledný řetězec}
význam
Konverze kódových stránek textu Jsou povoleny následující konverze 895 -> 1250 ( Kamenický -> 895 -> 852 ( Kamenický -> 852 -> 1250 ( Latin 2 -> 852 -> 895 ( Latin 2 -> 1250 -> 895 ( Windows 1250 1250 -> 852 ( Windows 1250 ->
příklad použití
'žluťoučký kůň' 895 1250 CPCONVERT
( '
' -> TOS )
CE
Windows 1250 ) Latin 2 ) Windows 1250 ) Kamenický ) Kamenický ) Latin 2 )
Slova pro formátování a konverze typů 1000SEPARATOR
T9
CE
účel
Separátor tisíců pro formátování
syntaxe
<S {Separátor je 1. znak v řetězci}> 1000SEPARAROR
význam
Znak používaný pro oddělení tisíců; např. znak čárky. Implicitně: standardní oddělovač nastavený v národnostním nastavení v operačním systému
příklad použití
'.' 1000SEPARATOR
DECIMALSEPARATOR T9
CE
účel
Separátor desetinné části pro formátování
syntaxe
<S {Separátor je 1. znak v řetězci}> DECIMALSEPARAROR
význam
Znak používaný pro oddělení celočíselné a desetinné části; např. znak tečky
příklad použití
',' DECIMALSEPARATOR
89
FORMAT_D
T9
CE
účel
Formátování datumové hodnoty. Slovo formátuje hodnotu datum podle formátovacího řetězce v syntaxi jazyka Pascal Delphi
syntaxe
<S{formátovací řetězec}> FORMAT_D Datum v NOS typ CNLX
význam
Pro typ S musí být ve formátu den.měsíc.rok. Jestliže takto chápaná hodnota reprezentuje neplatné datum převede se jako datum 01.01.0100. Pro typ L se také převádí jako datum 01.01.0100. Pro typ N se bere celá část jako datum a desetinná část jako čas. Pro typ X vystupuje řetězec mezer o délce formátovacího řetězce.
příklad použití
'21.1.1944' 'yymmdd' FORMAT_D
( '440121' -> TOS )
'1.2.2010' 'dd.mm.yy' FORMAT_D
( '01.02.10' -> TOS )
FORMAT_N
T9
CE
účel
Slovo formátuje číslo podle formátovacího řetězce
syntaxe
řetězec}>
<S{formátovací řetězec}> FORMAT_N <S{Výstupní
je typu CDNLX Pro typ S musí mít tvar čísla. Pokud se v čísle objeví znak, který do čísla nepatří, může být hodnota výstupu chybná. význam
příklad použití
Pro typ D je datum převedeno na číslo double a to je formátováno. Pro typ L je pro false chápáno jako -1 a pro true jako 0 Pro typ X vystupuje řetězec mezer o délce formátovacího řetězce. Masky a formátovací řetězce jsou převzaty z masek v Delphi. 256.3 '0000.00' FORMAT_N
( '0256.30' -> TOS )
256.00 '#.#' FORMAT_N
( '256' -> TOS )
TOSTRING
T9
CE
účel
Převod hodnoty variant do typu string <S>
syntaxe
TOSTRING <S {Výstup}> Pozn. pro vstupní hodnoty
význam
Typ N se převede standartně jako float číslo Typ D se převede ve standardním tvaru podle prostředí Windows Typ L se převede jako text true,false NULL se převede jako řetězec ''
příklad použití
125.25 TOSTRING
TONUMERIC
T9
{'125.25' -> TOS}
CE
90
účel
Převod hodnoty variant do typu numeric
syntaxe
TONUMERIC
význam
Pozn. pro vstupní hodnoty Typ S neplatné znaky (znaky které neodpovídají tvaru číselné hodnoty) se ignorují Typ L true je výstupní hodnota -1 pro false je výstupní hodnota 0 Typ NULL je výstupní hodnota 0
příklad použití
'125.25 Kč' TONUMERIC
TODATE
T9
účel
Převod hodnoty variant do typu date
syntaxe
TODATE
{125.25 -> TOS}
CE
Typ S řetězec musí být ve tvaru den.měsíc.rok. Jestliže takto chápaná hodnota reprezentuje neplatné datum výstup je datum 01.01.0100. význam
Typ L se převádí jako datum 01.01.0100. Typ N celá část je datum a desetinná část čas. Typ null se převádí jako datum 01.01.0100.
příklad použití
'21.1.1944' TODATE
( 21.1.1944 -> TOS )
TODATETIME T9
CE
účel
Převod hodnoty variant do typu date
syntaxe
TODATETIME Typ S řetězec musí být ve tvaru den.měsíc.rok hodina:minuta:sekunda. Jestliže takto chápaná hodnota reprezentuje neplatné datum výstup je datum 01.01.0100.
význam
Typ L se převádí jako datum 01.01.0100. Typ N celá část je datum a desetinná část čas. Typ null se převádí jako datum 01.01.0100.
příklad použití
'21.1.1944 05:45' TODATETIME
SPLITDATETIME T9
( '21.1.1944 05:45' -> TOS )
CE
účel
Rozdělí hodnotu variant na Datum a Čas typu TDateTime
syntaxe
SPLITDATETIME
význam
příklad použití
Typ S řetězec musí být ve tvaru den.měsíc.rok hodina:minuta:sekunda. Jestliže takto chápaná hodnota reprezentuje neplatné datum výstup datum 01.01.0100 a čas 00:00. Typ L se převádí jako datum 01.01.0100 a čas 00:00. Typ N celá část je datum a desetinná část čas. Typ null se převádí jako datum 01.01.0100 a čas 00:00. '2.5.2010 14:05' SPLITDATETIME
91
Speciální slova pro práci s datem a časem NEXTDTOFDAY T9
CE
účel
Nalezne jehož číslo dne je <Číslo dne> následující za
syntaxe
<Číslo dne> NEXTDTOFDAY
význam
Čísla dnů jsou 1 pro neděli až 7 pro sobotu
příklad použití
27.8.2009 1 NEXTDTOFDAY . ( v TOS bude 30.8.2009 )
DATE
T9
CE
účel
Vložení systémového datumu
syntaxe
DATE
význam
Do TOS US vloží systémové datum jako variant typ D
příklad použití
DATE
TIME
T9
účel
Vložení systémového času
syntaxe
TIME
význam
Do TOS US vloží systémový čas jako variant typ D
příklad použití
TIME
NOW
T9
účel
Vložení systémového datumu a času
syntaxe
NOW
význam
Do TOS US vloží systémové datum a čas jako variant typ D
příklad použití
NOW
CE
CE
Slova pro práci se zásobníkem NONE
T9
účel
Formální náhrada slova
syntaxe
NONE
CE
92
význam
Nevykonává nic
příklad použití
NONE
SP!
T0
účel
Nulování US
syntaxe
SP!
význam
Nuluje US
příklad použití
SP!
DUP
T0
účel
Duplikace hodnoty
syntaxe
DUP
význam
Duplikuje hodnotu TOS v US. Použití při úpravě pořadí hodnot US.
příklad použití
5 DUP
SWAP
T0
účel
Přehodí TOS a NOS v US
syntaxe
SWAP
význam
Přehodí 2 hodnoty na vrcholu US Použití při úpravě pořadí hodnot US.
příklad použití
'alfa' 'beta' SWAP
OVER
T0
účel
Obsah NOS v US přidá do TOS
syntaxe
OVER
význam
NOS v US přidá do TOS tj. zvýší počet položek v US Použití při úpravě pořadí hodnot US.
příklad použití
'alfa' 'beta' OVER
DROP
T0
účel
Odstraní hodnotu v TOS US
syntaxe
DROP
význam
Odstranění nepotřebné hodnoty z US
CE
CE
( 5 -> NOS a 5 ->TOS )
CE
Stav US bude 'beta'-> NOS a 'alfa'->TOS
CE
Stav US bude 'alfa' 'beta' 'alfa'
CE
93
příklad použití
: TISK>0 DUP 0 > if . else DROP endif ; Nové slovo TISK>0 tiskne pouze hodnoty > 0
ROT
T0
CE
účel
Rotuje s hodnotami v NNOS, NOS a TOS
syntaxe
ROT
význam
Rotace tří hodnot na vrcholu US. Použití při úpravě pořadí hodnot US.
příklad použití
1 2 3 OVER
PICK
T0
účel
Přesune N tou položku z US zpětně od vrcholu US do TOS
syntaxe
PICK
význam
N je počítáno od 0 tj. pro N=0 je PICK ekvivalentem DUP Použití při úpravě pořadí hodnot US.
příklad použití
1 2 3 4 5 2 PICK 1 2 3 4 5 0 PICK
SORT
T9
účel
Setřídí N hodnot na vrcholu US N je v TOS
syntaxe
... SORT ...
( Stav US bude 2 3 1 )
CE
( Stav US bude 1 2 3 4 5 3 ) ( Stav US bude 1 2 3 4 5 5 )
CE
Třídění US podle velikosti význam
... nesetříděna posloupnost ... setříděná posloupnost
příklad použití
5 2 4 8 4 SORT
ATTR@
T9
účel
Načtení hodnoty ze stringu podle klíče
syntaxe
<S {zdroj. řetězec}> <S {klíč}> <S {odělovač}> ATTR@
( Stav US bude 8 5 4 2 )
CE
Ve vstupním řetězci musí být uloženu hodnoty ve tvaru KLIC=HODNOTA význam
Každá taková dvojice je oddělená voleným oddělovačem. Slovo ATTR@ vyhledá dvojici podle klíče a hodnotu dá do TOS.
příklad použití
'alfa=1;beta=zrušit;gama=G' 'beta' ';' ATTR@ ( v TOS bude řetězec 'zrušit' )
Slova pro přístup k datům nadřazené aplikace
94
@
T8
CE
účel
Do TOS vloží hodnotu na adrese v TOS
syntaxe
@ ADDR není adresou v paměti, ale adresou pole hodnot. Lze ji získat voláním slova vytvořeného konstrukčním slovem VARIANT nebo RECORD nebo ARRAY. (viz popis těchto slov) .
význam
ADDR může také být jméno objektu typu TControl. Potom @ vloží do TOS hodnotu vlastnosti objektu Delphi podle typu objektu, jehož jméno bude v TOS. Hodnota která bude vložena do TOS je specifikováno typem objektu, např Text pro Tedit, Caption pro Tpanel, Cells pro TstringGrid, Checked pro CheckBox atd. Pro některé objekty jsou ještě vyžadovány další údaje např pro TstringGrid ROW a COL.
příklad použití
VARIABLE A ‘alfa’ A !
FILE@
T9
účel
Do TOS uloží celý obsah souboru
syntaxe
<S {cesta na soubor}> FILE@
význam
Přenos obsahu celého souboru do US. Použití pro tisk nebo interpretaci obsahu souboru
příklad použití
'C:\Kursaz.pid' FILE@ V TOS bude obsah souboru Kursaz.pid jako řetězec
SECT@
T9
účel
Do TOS uloží sekci ze souboru podle syntaxe ini souborů TIniFile
syntaxe
<S {sekce}> <S {cesta na soubor}> SECT@
význam
Do TOS uloží obsah sekce v souboru. Sekce jsou ve standardním tvaru souborů typu TIniFile, tj. hlavička sekce je v hranatých závorkách, sekce končí buď sekcí následující nebo koncem souboru.
příklad použití
'MAIN' 'C:\Autofile.ini' SECT@ V TOS bude obsah sekce MAIN souboru C:\AUTOFILE.ini
%
T9
účel
Vazba s nadřazenou aplikací
syntaxe
< N {Index pole parametrů}> %
A @
CE
CE
CE
95
Do TOS vloží pro N >= 0 hodnotu pole PARAMETR která je pro class public a je možno ji obsadit v jiných modulech aplikace. význam
Pro N < 0 vloží do TOS hodnotu pole systémových proměnných SYSPAR která je pro class public a je možno ji obsadit v jiných modulech aplikace. Slovo je využíváno pro komunikaci s aplikací.
příklad použití
5 % ( v TOS bude hodnota pole PARAM[5]
!
T8
účel
Do paměti uložit hodnotu pro následné využití
syntaxe
!
CE
Vloží hodnotu do ADDR podle toho co hodnota ADDR reprezentuje. ADDR není adresou v paměti, ale adresou pole hodnot. Lze ji získat voláním slova vytvořeného konstrukčním slovem VARIANT nebo RECORD nebo ARRAY. (viz popis těchto slov) . význam
ADDR může také být jméno objektu typu TControl. Potom ! vloží hodnotu do vlastnosti objektu Delphi podle typu objektu, jehož jméno bude v TOS. Hodnota která bude vložena do do objektu je specifikováno typem objektu, např Text pro Tedit, Caption pro Tpanel, Cells pro TstringGrid, Checked pro CheckBox atd. Pro některé objekty jsou ještě vyžadovány další údaje např. pro TstringGrid ROW a COL.
příklad použití
VARIABLE A 'alfa' A !
DATA@
T9
účel
Slovo pracuje s objektem DATA typu TStringList
syntaxe
<S {Klíč}> DATA@ <S {Hodnota}>
význam
Do TOS uloží hodnotu se StringList DATA podle klíče
příklad použití
'ROK' DATA@
!DATA
T9
účel
Slovo pracuje s objektem DATA typu TStringList
syntaxe
<S {Obsah DATA}> !DATA
význam
StringList DATA obsadí obsahem TOS. Předpokládá se, že obsah TOS je řetězec obsahující dvojice KLIC=HODNODA. Každá taková dvojice je oddělená znaky CR a LF (Nová řádka)
příklad použití
'ROK=2010' CRLF + 'TYDEN=01'
!KEYDATA
T9
A @
CE
<S {Hodnota z String list DATA s klíčem ROK}>
CE
!DATA
CE
96
účel
Slovo pracuje s objektem DATA typu TStringList.
syntaxe
<S {Hodnota}> <S {Klíč}> !KEYDATA
význam
Do StringList DATA uloží dvojici KLIC=HODNOTA
příklad použití
'2006' 'ROK' !KEYDATA
!RESULT
T9
účel
Předat nadřazené aplikaci hodnotu po provedení skriptu
syntaxe
!RESULT
význam
Obsah TOS uloží do speciální systémové proměnné. Public metoda INTERPRET Classu P42_Base tuto hodnotu předá řídícímu formu
příklad použití
'Error' !RESULT
>R
T9
účel
Vložit hodnotu integer z TOS do RETURN STACKU
syntaxe
>R
význam
Pokud použijeme slova >R,R> nebo R je nutno podrobně znát obsah a funkci RETURN STACKU. Kompilátor a interpret tento zásobník používá k ukládání informací o průběhu interpretace. Porušení těchto informací může vést k zásadním chybám.
příklad použití
'ROK' DATA@ >R
R>
T9
účel
Vyjmout integer z RETURN STACKU a vložit do TOS
syntaxe
R>
význam
Vyjmout hodnotu z RS pro následné použití
příklad použití
R> .
R
T9
účel
Přečte nedestruktivně poslední položku z RETURN STACKU a vloží do TOS
syntaxe
R
význam
Pokud použijeme slova >R,R> nebo R je nutno podrobně znát obsah a funkci RETURN STACKU. Kompilátor a interpret tento zásobník používá k ukládání informací o průběhu interpretace. Porušení těchto informací může vést k zásadním chybám.
CE
CE
CE
CE
97
příklad použití
R .
Programové konstrukce BREAK
T9
C
účel
Ukončí programovou konstrukci DO nebo WHILE
syntaxe
BREAK
význam
Nestandardní ukončení cyklu např. při splnění nějaké podmínky
příklad použití
10 CONSTANT TYDEN : CYKL 100 1 DO I TYDEN > IF BREAK ENDIF I . LOOP ; CYKL (Když je počitadlo cyklu větší než 10, tj. větší než konstanta TYDEN, tak se cyklus přeruší, jinak se vytiskne hodnota cyklu I)
EXIT
T9
účel
Ukončí Interpretovaný program
syntaxe
EXIT
význam
Nestandardní ukončení interpretace např. při splnění nějaké podmínky
příklad použití
: TEST 'ROK' DATA@ '2000' < IF 'ERROR' !RESULT EXIT ENDIF ;
LITERAL
T0
účel
Zkompiluje hodnotu TOS do programu pomocí výkonného slova LIT
syntaxe
LITERAL
význam
Hodnotu vloží do programu tak, ze při jeho spuštění je obnovena v TOS
příklad použití
: AAA [ TIME ] LITERAL ;
CASE OF ENDOF ENDCASE
T9
účel
Programová konstrukce přepínače
syntaxe
CASE OF ENDOF OF ENDOF .....ENDCASE
CE
CE
CI
výraz jehož výsledkem je v US logická hodnota význam
programový kód, který se vykoná je-li splněna <podmínka i>. Může být vynechán.
98
se vykoná pokud není splněna žádná podmínka. Může být vynechán. : A 'alfa' ; : B 'beta' ; : C 'gama' ;
příklad použití
: D 'delta' ; : TEST case DUP 1 = of DROP A . endof DUP 2 = of DROP B . endof DUP 3 = of DROP C . endof DROP 'Neznam' . endcase ; SP! 2 TEST vystupuje řetězec 'beta' pozn. Slova DUP v podmínce a DROP ve výkonném kodu jsou použity pro obnovení stavu US při nesplnění resp splnění podmínky.
IF ELSE ENDIF
T0
CI
účel
Programová konstrukce podmínky
syntaxe
IF ELSE ENDIF výraz jehož výsledkem je v US logická hodnota
význam
příklad použití
programový kód, který se vykoná je-li hodnota L true. programový kód, který se vykoná je-li hodnota L false. Část konstrukce ELSE je nepovinná. : TESTNAROK2000 'ROK' DATA@ '2000' = IF 'Správně' ELSE 'Chybně' ENDIF . ;
BEGIN UNTIL
T0
účel
Programová konstrukce smyčky
syntaxe
BEGIN UNTIL
význam
uloží na závěr do TOS logckou hodnotu . Tuto hodnotu testuje slovo UNTIL. Je-li TRUE pokračuje interpretace za UNTIL jinak se vrací za BEGIN
příklad použití
CI
: CYK BEGIN 1 - DUP . ' ' . DUP 0 = UNTIL ; příkaz 5 CYK potom vypíše 4 3 2 1 0
DO LOOP
T0
účel
Konstrukce cyklu
syntaxe
DO LOOP
význam
Vytvoření cyklu s krokem 1
příklad použití
: CYK 10 1
CI
DO I . LOOP ;
99
Použití CYK vypíše čísla 1 až 9
DO +LOOP
T0
CI
účel
Konstrukce cyklu
syntaxe
DO +LOOP
význam
Vytvoření cyklu s voleným krokem : CYK 10 1
příklad použití
DO I . 2 +LOOP ;
Použití CYK vypíše čísla 1 až 9 Použití CYK vypíše čísla lichá 1 až 9
I
T0
CI
účel
Slovo vyjme počitadlo cyklu nejvyšší úrovně do TOS
syntaxe
I
význam
Získat v cyklu DO LOOP nebo DO +LOOP index cyklu
příklad použití
: CYK 10 1
J
T0
účel
Slovo vyjme počitadlo cyklu 2. vnořené úrovně do TOS
syntaxe
J
význam
Počet vnořených cyklů je omezen pouze zaplněním RETURN STACKU. Na každou úroveň jsou potřebné 2 položky. Počitadlo cyklu lze získat jednoduše pouze pro 2 vnořené cykly, při větším vnoření by bylo nutno použít slova pro práci s RETURN STACKEM R R> a >R
DO I . LOOP ;
CI
: CYK2 10 5 DO 12 10 DO I . '-' . J . ' ' . LOOP LOOP ;
příklad použití
slovo CYK2 potom vypíše 10-5 11-5 10-6 11-6 10-7 11-7 10-8 11-8 109 11-9
IIF
T9
CE
účel
Slovo které lze použít místo konstrukce IF … ELSE … ENDIF i v exekučním režimu
syntaxe
IIF
Význam
Vybere podle logické hodnoty v TOS hodnotu v NOS pro false nebo v NNOS pro true. Hodnota která není vybrána je z US odstraněna
100
'A' 'B' false IIF . ( stav US je 'B' ) 'A' 'B' true IIF . ( stav US je 'A' )
příklad použití
př. v kompilačním režimu : TEST 'A' 'B' 2 PICK IIF ; SP! true TEST . ( stav US je 'A' )
ICASE IOTHERWISE IENDCASE účel
syntaxe
T9
CE
Skupina slov která lze použít místo konstrukce CASE,OF,ENDOF,ENDCASE i v exekučním režimu. ICASE ... IOTHERWISE IENDCASE je vždy dvojice hodnot integer (klíč) a variant (hodnota).
význam
Vyhledá se takový klíč, kde Ni = N a po ukončení IENDCASE je v TOS hodnota Vi. Pokud taková dvojice neexistuje, je v TOS hodnota Vx ( za slovem IOTHERWISE). Část kódu IOHERWISE je nepovinná. Pokud by tato část kódu v konstrukci nebyla a nebyl ani nalezen klíče, bude po ukončení konstrukce v TOS null. 1 icase 1 'A' -1 1.25 7 'C' iotherwise 'Error' iendcase ( v TOS je 'A' )
příklad použití
-1 icase 1 'A' -1 1.25 7 'C' iotherwise 'Error' iendcase ( v TOS je 1.25 ) 2 icase 1 'A' -1 1.25 7 'C' iotherwise 'Error' iendcase ( v TOS je 'Error' )
Relace =
T0
CE
účel
Equivalence NOS a TOS
syntaxe
=
význam
je true pokud je stejné a libovolného ale stejného typu
příklad použití
'alfa' 'beta' =
<>
T0
účel
Nonequivalence NOS a TOS
syntaxe
<>
význam
je true pokud je různé od a libovolného ale stejného typu