Rapid-Q
ČO JE RAPID-Q? ČLÁNKY PRÍKLADY DOWNLOAD ODKAZY MOJE PROGRAMY
rqlogo.png, 3 kb Programovací jazyk rapid-q som objavil niekedy v roku 2001 na počítači môjho kolegu, ktorý ho tam mal viac-menej náhodou a nikdy ho nepoužil. V tej dobe som skúšal programovať v Turbopascale, Delphi či Visual basicu, nič z toho mi však 'nesedelo'. Buď bol jazyk robustný, ťažkopádny, alebo potreboval pre svoj beh rôzne runtimy, knižnice a iné súbory, bez ktorých program nešlo spustiť.

Rapid-q toto nemal. Bol maličký (kompilátor menší než 1 mb!), rýchly a vytváral priamo EXE súbory, ktoré sa dali hneď spustiť. Nebolo treba nič inštalovať! To ma oslovilo. Postupne som sa vnáral do jazyka a zistil, že sa dajú v ňom naprogramovať nielen jednoduché programy, ale aj väčšie (viď napr. rq money). Rapid-q som si doslova zamiloval a používam ho čoraz radšej.

Rapid-q predstavil v roku 2000 William Yu. Napriek tomu, že ešte v tom istom roku predal autorské práva a jeho oficiálna stránka už zanikla, jeho program žije aj naďalej, rozvíja sa a spolu s ním aj veľká komunita nadšencov, ktorým tento program doslova učaroval.
Preto vznikli aj tieto stránky. Sú zamerané pre každého, kto sa chce venovať programovaniu. Je určený predovšetkým začiatočníkom, ale na svoje si prídu aj pokročilejší. Rapid-q totiž dokáže robiť doslova zázraky. Svojou jednoduchosťou, rýchlosťou a silou. Ak vyskúšate, dáte mi za pravdu.
  • je úplne zadarmo! môžete v ňom tvoriť ľubovoľné programy, ktoré môžete predávať (pravda, ak bude záujemca :-)),
  • je veľmi malý (1,4 mb!) spolu s knižnicami maximálne 5 Mb,
  • neinštaluje sa (stačí rozbaliť na HDD alebo USB kľúč),
  • má vlastné IDE (vývojové prostredie),
  • vyžaduje minimálne systémové požiadavky (win95 a vyššie, cca 2 mb ram),
  • podporuje platformy windows, linux, unix (solaris, hp-ux),
  • dokáže vytvárať 32-bitové GUI (graphic user interface) aplikácie, konzolové aplikácie včítane CGI (common gateway interface) aplikácií,
  • dá sa veľmi ľahko naučiť, je jednoduchý (vychádza z Q-basicu),
  • nápoveda je z veľkej časti poslovenčená (mnou), čo vám uľahčí študovanie jazyka,
  • podporuje práce s knižnicami (DLL), windows API, Directx, Direct3D, MySQL a ďalšie,
  • hneď vytvára EXE súbor bez nutnosti inštalácie programu či runtime knižníc.
Ak vás ani to nepresvedčilo, aby ste sa do programovania v rapid-q pustili, malá ukážka na záver tohto úvodu. Tu je jednoduchá 5-riadková ukážka kódu, ktorá vytvorí nové okno (prostredníctvom komponenty QForm), priradí oknu nadpis (caption), vycentruje ho na obrazovke a zobrazí ho! Stačí trochu lepšie ovládať anglický jazyk a chuť naučiť sa nové veci. Vytvorte si nový súbor (nazvite si ho napr. pokus.bas) a napíšte v ňom tento kód (prípadne ho vložte):
Create NoveOkno as QForm
    Caption = "Môj program"
    Center
    ShowModal
end create
Po skompilovaní (pozri článok o kompilovaní) tohto kódu (príkazom rc.exe pokus.bas) sa zobrazí uprostred obrazovky výsledný program. Váš prvý program je hotový ! Ak sa Vám tento program nespustil, niekde v kóde ste museli urobiť chybu. Skontrolujte si ho preto pozorne a skúste znovu. Pokusy a omyly - to je najčastejšia cesta (i keď nie vždy najrýchlejšia).

rq02.png, 11 kb


Program toho ešte veľa nevie, chýba mu menu, ďalšie ovládacie prvky (napr. tlačítka, roletky, textové polia, zaškrtávacie polia a pod.). Má však už nastavené nejaké vlastnosti (nadpis), metódy (vycentrovanie na obrazovku) a funkcie (showmodal), pričom ho možno zminimalizovať, zmaximalizovať a ukončiť. Všetky ďalšie potrebné informácie o komponente QForm sa bližšie dozviete v čiastočne slovenskom návode (v prílohe A), kde sú podrobne popísané všetky ďalšie komponenty (ovládacie prvky), ktoré môžete pri programovaní potrebovať.

Verte, programovanie už ľahšie nejde! Ak máte chuť naučiť sa rýchlo jednoduchý programovací jazyk, teraz je na to tá najvhodnejšia chvíľa! Stiahnite si kompilátor pre rapid-q a môžete sa pustiť do programovania. Stačí k tomu obyčajný poznámkový blok (nie papierový, ale súbor notepad.exe).

nech vám je slovenská online nápoveda pri tom nápomocná!

Ak budete skúšať písať riadky kódu v Rapid-Q a nebudete vedieť si dať rady, napíšte mi (e-mailom alebo do diskusného fóra). Pokiaľ budem mať čas, poradím.

Držím všetkým záujemcom palce!
Kompilácia je prevod napísaného kódu do EXE súboru. Vzniknutý program môžete potom používať vy sami, alebo ho šíriť ďalej pre iných užívateľov (internetom, na CD či inak). Samotnú kompiláciu zabezpečuje súbor rc.exe, ktorý je veľmi malý (má len 707 kb).

Predtým, ako začnete kompilovať vami vytvorený kód (zoznam príkazov), musíte ho napísať (príp. skopírovať). Už tu máte na výber, v akom programe budete samotný kód písať, čo sa ďalej prejaví na rôznych spôsoboch kompilácie. Môžete si vybrať z viacerých variant:
  • integrované vývojové prostredie rapid-q (tzv. IDE)
  • textový editor (akýkoľvek, napr. notepad.exe)
  • programátorský editor (napr. pspad, jedit, codepad, context, textpad a pod.)
Keďže tieto spôsoby nie je ľahké popísať pár vetami, každý z nich je rozpísaný v samostatnej kapitole. Na záver je podrobne popísaný spôsob, ako si nastaviť programátorský editor PSPad presne na podmienky Rapid-Q. Snáď som to popísal zrozumiteľne, ak nie, napíšte mi, v čom je problém.
IDE (angl. skr = integrated development environment) spustíte zo súboru rapidq.exe. Po jeho spustení sa zobrazí tzv. form designer (návrhár formuláru), do ktorého vkladáte z hornej grafickej ponuky potrebné komponenty (tlačítka, roletky, popisy, editovacie polia a pod.).

rq01.png


Aj keď takto vytvorený formulár vytvárate užívateľsky veľmi pohodlne a rýchlo, nemáte veľký prehľad o kóde, ktorý sa stará o tento formulár (vygenerovaním sa vytvorí kód, ktorý môžete ešte ďalej upravovať v editore kódu). Pre začiatočníka veľmi neodporúčam tento spôsob. Ľahko si síce vytvorí formulár, pri jeho obsluhe (napr. tlačítok či zoznamov) už aj tak musí pracovať s editorom kódu, tak prečo nie hneď?. Skúsenejší programátor sa zaobíde bez takéhoto návrhára formulárov, vie si rýchlo napísať potrebný kód v editore (ľubovoľnom).

Súčasťou IDE je okrem návrhára formuláru aj editor kódu (dokonca so zvýraznenou syntaxou, t. j. farebne odlišuje príkazy, komentáre a pod. pre lepšiu orientáciu v kóde). Pre začiatočníka je možno dobre začínať takouto formou, lebo odpadá starosť o kompiláciu (tú zabezpečuje samotné IDE). Písaním kódu na jednej strane získate plnú kontrolu nad vlastnosťami komponent (ako je napr. rodič, šírka, výška, farba písma a pod.), na druhej strane môžete priamo v kóde volať ich obsluhu (t. j. metódy či udalosti - napr. udalosť onclick pri tlačítku, onchange pri roletke a pod.).

Po napísaní kódu možno vytvoriť EXE program kompiláciou kódu. V IDE je to možné pomocou príkazu F5 (run), ktorý spustí proces kompilácie. V prípade, že máme v kóde chybu, v dolnej časti IDE sa táto chyba v anglickom jazyku vypíše (spolu s príslušným číslom riadku, na ktorom došlo k chybe). Vtedy sa kompilácia nedokončí. Musíme sa nastaviť na daný riadok, nájsť chybu syntaxe a opraviť. Potom spustíme kompiláciu znova. Ak kompilácia prebehne bez chyby, spustí sa vytvorený program. Nemám však dobré skúsenosti s týmto editorom (každú chvíľu mi vypínal slovenskú klávesnicu a prehadzoval ju na anglickú). Ak vám to nebude vadiť, kľudne toto IDE používajte. Je zdarma a je súčasťou základného balíka rapid-q, ktorý si môžete stiahnuť zo sekcie download.
Pozor, nie všetky textové editory sú vhodné, napr. MS Word! Takýto program nie je vhodný na písanie kódu, do súboru totiž ukladá aj iné informácie (o dokumente), ktoré kompilátor vyhodnotí ako chybové. Postačí obyčajný notepad.exe, prípadne jeho vylepšené varianty. Keď napíšete kód programu, je potrebné ho uložiť, najlepšie do adresára, v ktorom je kompilátor (rc.exe) a jeho knižnice (súbory lib). Kompiláciu si však v takomto prípade musíte vykonať sami cez príkazový riadok (napr. v Total commanderi). Ak máte teda vytvorený súbor napr. s názvom test.bas (ale prípona môže byť napr. aj txt), kompiláciu spustíte príkazom:
rc.exe test.bas
prípadne ak sa váš súbor volá test.txt
rc.exe test.txt
Ak je v syntaxe chyba, EXE súbor sa nevytvorí (kompilácia bude prerušená). V tomto prípade neuvidíte výstupný text z kompilácie, aj keď kompilácia prebehla (aspoň sčasti). Aby ste sa mohli pozrieť, na ktorom riadku a v ktorom výraze je chyba, musíte zachytiť po kompilácii túto správu do súboru (niekedy sa mu hovorí log), ktorý sa pri kompilácii vytvorí. Upravený príkaz pre kompiláciu vyzerá nasledovne (nezáleží na tom, či píšete príkaz malými alebo veľkými písmenami):
rc.exe test.bas >log.txt
Ak dôjde k chybe, pozriete sa do súboru log.txt, kde došlo v syntaxe k chybe. Ak kompilácia prebehla v poriadku, vytvorí sa nový súbor test.exe (prípadne ak existoval, tak sa prepíše!). Po spustení súboru test.exe sa zobrazí váš program.

Nevýhody obyčajného textového editora
Tento spôsob písania a kompilácie je dosť nepraktický, musíte sa prepínať medzi súborom (kódom), príkazovým riadkom a súborom log.txt. Ale pre začiatok úplne postačuje. Kód programu je plne pod vašou kontrolou. Odporúčam, ale len pre začiatok (na testovanie jednoduchých kódov). Ak hodláte písať dlhší kód (prípadne si ho rozmiestnite na viacero súborov), vyplatí sa vám prejsť na tretí spôsob písania kódu, ktorý používajú skúsenejší programátori. Spočíva v používaní programátorského editoru. Mnohé sú zdarma, podporujú češtinu i slovenčinu, tak prečo nie?
rq03.png Pri písaní v programátorskom editore má užívateľ (programátor) vysoký komfort písania, ktorý zabezpečuje napr.:
  • farebná syntax - odlišné zvýraznenie príkazov, komentárov, rezerovaných slov, textových reťazcov, číselných výrazov či pozadia, riadku a pod. pre každý programovací jazyk (napr. html, python, java, foxpro, visual basic, rapid-q a pod.) existuje v programátorskom editore tzv. šablóna, podľa ktorej farebne zvýrazňuje príslušné slová pre daný jazyk


  • projektovanie - ak pracujete na viacerých programoch, nebolo by vhodné mať ich všetky v jednom adresári. každý program si evidujete ako projekt (v samostatnom adresári), pričom nemusíte načítavať všetky dokumenty z adresára, ale len jeden projekt, ktorý sa o všetky potrebné súbory postará


  • záložky dokumentov - jednoduché prepínanie medzi viacerými súbormi (dokumentami)


  • priradenie kompilátora - v nastaveni editoru sa určí, ktorý kompilátor sa použije pre editovaný súbor, pričom kompiláciu zabezpečí samotný programátorský editor. výsledok kompilácie dokáže "zachytiť" a zobraziť v samostatnom okne (podobne ako rapid-q ide). ak kompilácia prebehla v poriadku, programátorský editor zabezpečí aj automatické spustenie kompilovaného programu.


  • možnosť používania makier - ide o tzv. automatizáciu písania či úprav textu (ktoré sa dá ľahko vyrobiť ručne, prípadne záznamom). napr. ak do kódu vyberiete kliknutím z palety farieb (ktorý ponúka programátorský editor) nejakú farbu (v tvare #9900FF), spustením príslušného makra je možné previesť tento tvar (ktorý vyhovuje html kódu) na tvar rgb(&H99, &H00, &HFF), čo zodpovedá hodnoty farby pre rapid-q kód.


  • ďalšie funkcie - napr. kontrola pravopisu, automatické párovanie zátvoriek, formátovanie textu, generátor náhodného textu (tzv. lorem ipsum), paleta farieb, pokročilé vyhľadávanie či nahradzovanie textu, pravítko, nečitateľné znaky, tabuľka ascii, kvapkadlo, konvertor a mnoho mnoho iných.
Výhody takéhoto programovania sú nesporné. Okrem toho, že celý kód máte pod kontrolou, jeho písanie vám uľahčujú horeuvedené vymoženosti. Nestaráte sa o veľa ďalších maličkostí, ktoré by vás len zdržiavali a odpútavali od písania. Takto sa venujete len a len písaniu kódu, odlaďujete ho a vylepšujete, prípadne vstavanými funkciami urýchľujete úpravy kódu.

Ja uprednostňujem písanie v programátorskom editore PSPad. Ak ho chcete vyskúšať, skúste si upraviť jeho nastavenia pre Rapid-Q podľa ďalšej kapitoly.
Pre bezproblémové písanie v tomto programátorskom editore je potrebné si ho vopred pripraviť (prepojiť s kompilátorom) a zvýrazňovačom kódu. Tu je malý návod na PSPad, ktorý ja osobne používam veľmi rád pri programovaní v jazyku rapid-q:
PSPad po nainštalovaní (príp. len rozbalení ZIP súboru) do zvoleného adresára spustite. Z menu nastavenie/nastavenie zvýrazňovačov si spustite nasledovné dialógové okno:

rq04.png

V ľavej časti okna (zoznam šablon) vyberte prvú nepriradenú (not assigned). V hornej časti okna sa prepnite do záložky filtre. Zo zoznamu Vlastné zvýrazňovače si vyberte rapid-q. Tým ste priradili zvýrazňovaču prednastavené vlastnosti rapid-q. Prepnite hornú záložku na kompilátor a vyplňte položku kompilátor podľa vašich potrieb (napr. cestu ku kompilátoru zadajte vašu, nemusí byť zhodná s mojou). Položku parametre vyplníte kliknutím pravého tlačítka myši do editovacieho okna a vyberiete z ponuky %file%. Ostatné položky vyplňte tak, ako to vidno na obrázku:

rq05.png

Tie hlavné nastavenia už máte za sebou. Posledná vec, ktorú môžete (ale nemusíte) nastaviť, je farebné zvýraznenie slov. Prepnite sa do záložky farby a ak vám prednastavené farby nevyhovujú, môžete si ich pomeniť podľa svojho gusta:

rq06.png

Keď to všetko máte správne nastavené, potvrďte tlačítkom OK všetky zmeny a môžete začať písať kód. Po jeho napísaní sa kompilácia spustí klávesovou skratkou CTRL+F9. Ale o kompilácií som toho popísal už dosť v predošlých odsekoch. Ak niečo nie je v poriadku, skúste to podľa môjho návodu ešte raz. Ak ani potom sa Vám kompilácia nespustí, napíšte do diskusného fóra (do sekcie rapid-q!), kde vám odpoviem ja, alebo niekto iný.

Veľa šťastia pri programovaní!
* 1. POUŽÍVAJTE KOMENTÁRE *
Pri písaní kódu často píšte komentáre k jednotlivým častiam kódu na vysvetlenie. Môže sa stať, že nejaký čas (mesiac, rok) necháte kód ležať bokom a potom sa k nemu vrátite. Komentáre vám veľmi uľahčia lúštenie kódu po nejakom čase. Taktiež sú ale dobré aj pre iných ľudí, ktorým kód poskytnete. Tu je ukážka kódu s komentármi:
' načítanie pôvodných údajov zo súboru
  stringlist.loadfromfile (curdir$ + "\" + nazov_suboru)

' aktualizácia názvu

  combobox.insertitem (0, "Peter")
  combobox.delitems 1

' aktualizácia sídla

  listview.insertitem (1, "Banská Bystrica")
  listview.delitems 2
* 2. POUŽÍVAJTE TABELÁTOR *
Pri písaní kódu sa často stretnete s tzv. vnáraním do funkcií (t. j. keď v jednej funkcii je vnorená druhá, v druhej tretia a pod.). Pre sprehľadnenie takéhoto kódu je zaužívané odsadenie textu od okraja pomocou klávesy TAB. Porovnajte nasledovné dva kódy z hľadiska prehľadnosti:
' prvý príklad
if okno.showmodal = 1 then
    for i = 0 to 100
        print "hello"
    next i
end if

'druhý príklad
if okno.showmodal = 1 then
for i = 0 to 100
print "hello"
next i
end if
O čo krajšie a prehľadnejšie je napísaný prvý kód oproti druhému?
* 3. POUŽÍVAJTE ODDEĽOVAČ PODPROGRAMOV A FUNKCIÍ *
Jednotlivé časti programu (podprogramy), oddeľujte od seba, hlavne ak sú dlhšie. Vizuálne si tým veľmi uľahčíte ich vyhľadávanie. Aj keď niektoré programátorské editory disponujú funkciami ako prieskumník kódu (napr. PSPad), je vhodné oddeliť viaceré susediace podprogramy čiarou (vo forme komentára), napr.:
' #######################
' použité komponenty
' #######################
with frmOkno
    (zoznam vlastností)
end with
' -----------------------
with btnOK
    (zoznam vlastností)
end with


' #######################
' podprogramy
' #######################
sub podprogram1
    (zoznam prikazov)
end sub
' -----------------------
sub podprogram2
    (zoznam prikazov)
end sub
' -----------------------
* 4. PÍŠTE KÓD POSTUPNE *
Keď začnete písať nejaký kód programu, vždy sa riaďte zásadou - menej je niekedy viac. Stačí napísať pár riadkov programu a potom si ich radšej kompiláciou otestujte. Ak je kompilácia v poriadku, môžete písať ďalšie riadky. Znova kompilácia, znova písanie. Takto by to malo fungovať.
Ide o to, že ak si napíšete veľmi dlhý kus kódu a bude tam chyba, je veľká pravdepodobnosť, že ju (aspoň menej skúsení programátori) budete dlho hľadať, resp. ak ju aj nájdete, nebudete si s ňou vedieť rady.
* 5 * KÓD ZAČNITE PÍSAŤ KONTROLOU SYNTAXE *
Prv, ako spustíte prvú kompiláciu vášho kódu, uistite sa, že máte medzi prvými riadkami zapnutú kontrolu syntaxe príkazom
$typecheck on
Ja tento príkaz mám vždy na prvom riadku. Ušetril mi veľa času. Že prečo?

Pri kompilácii prebieha kontrola syntaxe, ktorá vám vypíše v prípade chyby aj číslo riadku, aj bližší popis chyby. Ak nemáte zapnutú kontrolu sytaxe príkazom $typecheck on, môže sa stať, že kompilácia programu prebehne v poriadku, ale váš program sa pri spustení zosype (resp. po nejakom čase). Ak máte tento príkaz na začiatku kódu, váš program bude havarovať len vo veľmi výnimočnom prípade (napr. ak sa odkážete na položku zoznamu, ktorá neexistuje). Kontrola syntaxe vás vždy upozorní napr. na nedeklarované premenné, chybnú syntax či iné budúce problematické výrazy. Silne odporúčam používať!

Visual Basic používa podobný príkaz Option Explicit, v Rapid-Q je zabudovaný tiež, ale s dolárom na začiatku:
$option explicit
Je úplne jedno, ktorú kontrolu syntaxu zapnete, dôležité je, že jedna z nich je zapnutá!
* 6. POUŽÍVAJTE NÁPOVEDU K RAPID-Q *
Ak si s niečím neviete rady, stačí siahnuť po nápovede k rapid-q. William Yu napísal túto nápovedu najmä pre začiatočníkov skutočne geniálne, úvodné kapitoly sú prehľadné, zrozumiteľné a použiteľné (čo sa o mojom preklade už nedá povedať). Prečítajte si minimálne raz celú dokumentáciu (preložených je všetkých 15 kapitol), ale pomoc neskôr hľadajte najmä v Prílohe A, kde nájdete zoznam všetkých komponent, ich vlastností, metód a udalostí s jednoduchými príkladmi. Ak ste tu nenašli odpoveď na vašu otázku, môžete napísať priamo mne, prípadne skúste sa poobzerať po internetovom fóre na rapid-q (adresa v odkazoch). viac hláv = viac rozumu.
* 7. POUŽÍVAJTE PROGRAMÁTORSKÝ EDITOR *
O spôsoboch písania kódu som už písal v predošlom článku. Písanie kódu v programátorskom editore, nabitom rôznymi funkciami, je oveľa ľahšie ako napr. v obyčajnom notepade. Niet nad prehľadnosť kódu (vďaka projektom, záložkám, farebnej syntaxe, automatickému dopĺňaniu zátvoriek), rýchlu úpravu textu (pomocou prednastavených šablón či formátovania), ale aj rôzne doplnkové funkcie (napr. paleta farieb, zoznam ASCII kódov, konvertor výrazov, kvapkadlo, prieskumník kódu a mnoho iných). Existujú programátorské editory, ktoré sú zdarma, ale kvalitou sa vyrovnajú tým plateným. Tak prečo si nimi neuľahčiť písanie kódu?
* 8. ZÁLOHUJTE SI SVOJE ZDROJOVÉ KÓDY *
Je dobré robiť si raz začas zálohu svojich zdrojových kódov (napr. na CD, USB kľúč, FDD a pod.). Ak máte svoje zdrojové kódy len na pevnom disku, môže sa stať, že sa tento poškodí (hovorím z vlastnej skúsenosti) a môžete prísť o všetky údaje na disku. Ak ste robili na nejakom programe týždne alebo mesiace, bola by to veľká strata. Preto silne odporúčam aj túto činnosť - napr. raz za týždeň si urobiť zálohu svojich údajov (nielen zdrojových kódov). Ušetríte si veľa roboty v prípade poškodenia disku!
* 9. POUŽÍVAJTE NÁZVY KOMPONENT INTELIGENTNE *
Zdrojový kód odhalí začiatočníka pomerne ľahko - podľa názvu komponentu. Ak potrebuje použiť komponent QLabel, nazve ho napr. nadpis, label či label1. Ak potrebuje tlačítko, nazve ho napr. button, tlacitko1, tlac alebo zatvor. Nič viac. Programátor - začiatočník totiž vôbec neuvažuje nad tým, že raz v kóde bude mať možno viac komponentov typu qlabel či qbutton, ktoré sa mu raz budú pliesť navzájom. To isté sa týka názvu podprogramov a funkcií. Ak má tlačítko funkciu tlače, tlačítko nazve tlac a podprogram tlacenie. Áno, ide to aj takto (najmä pri neveľkom kóde), ale raz budete možno písať väčší kód a tam už môže nastať problém.

Prečo si nespraviť s názvami poriadok hneď na začiatku? Odporúčam programátormi a dlhoročnými skúsenosťami overenú metódu, ktorá je rýchla, spoľahlivá a prehľadná pri pomenúvaní. Fígeľ spočíva v tom, že si prvé tri znaky rezervujete pre typ komponenty. Napr. ak ide o komponent QButton, prvé tri znaky jeho názvu bude tvoriť skratka btn, pre QForm frm, pre QLabel lbl a pod. K tymto trom pismenam si potom môžete priradiť vlastné názvy (bez dĺžňov a mäkčeňov), napr. btnTlac, btnKoniec, lblFirma, lblSidlo, frmOkno a pod. Aj veľkosť písmen (malých i veľkých) napomáha k prehľadnosti (napr. ediSidloFirmy = komponent QEdit s názvom sídla firmy).

Výhodou takto pomenovaných komponent je ich zrozumiteľnosť aj pre iných, resp. pre nás, ak sa ku kódu vraciame po dlhom čase. Keďže každý z týchto komponentov má nejaké metódy či udalosti, ktoré obsluhujú podprogramy, názvy podprogramov by mali vychádzať z týchto metód a udalostí. napr. z názvov podprogramov frmOkno_onShow, frmOkno_onClose, frmOkno_onResize sa dá ľahko zistiť, že ide o tri podprogramy pre jeden a ten istý komponent frmOkno (pričom jeden podprogram sa spúšťa pri otvorení okna, druhý pri zatvorení a tretí pri zmene jeho veľkosti). Používanie malých a veľkých písmen je aj tu veľkou pomocou (napr. lviZoznam_OnDblClick = dvojité kliknutie na komponent QListView s názvom zoznam).
* 10. NAUČTE SA POUŽÍVAŤ CHYBOVÉ HLÁSENIE KOMPILÁCIE *
Výsledok každej kompilácie sa zobrazí na obrazovke (ak používate napr. programátorský editor, ktorý zachytáva toto hlásenie). Ak kompilácia v rapid-q prebehla v poriadku, zobrazí sa správa (log), podobná tejto:
rapid-q compiler beta by william yu copyright 1999-2000
compiling d:\programy\rady.bas to d:\programy\rady.exe

compiling as gui application (l3)
number of statements: 3 compile time: 0.030000
numeric variables: 0
string variables: 0
resource data: 0
bytes global data: 25
bytes sub data: 0

process completed, exit code 0.
execution time: 00:00.121

Ak spravíte v kóde chybu, hlásenie o chybe vás presne upozorní, kde v kóde ku chybe došlo. V kóde som napr. namiesto slova caption schválne napísal slovo capton. Po kompilácií sa zobrazila nasledovná správa (pre ľahšiu orientáciu som na začiatok každého riadku správy pridal číslo riadku):
(1.) rapid-q compiler beta by william yu copyright 1999-2000
(2.) compiling d:\programy\rady.bas to d:\programy\rady.exe
(3.)
(4.) line 5: error: member capton not part of class frmokno
(5.) rady.bas: in main section
(6.) rady.bas: frmokno.capton = "hlavné okno"
(7.) rady.bas:
^-- error
(8.) file in error: d:\programy\rady.bas
(9.)
(10.) process completed, exit code 1.
(11.) execution time: 00:00.100
Na chybu nás upozorňuje hneď viacero odkazov:
  • 4. riadok správy určuje chybné číslo riadku (line 5). Takže chybu v kóde mám na 5. riadku.
  • slovný popis chyby je v tom istom riadku za slovom error:. Aj programátorovi, ktorý nie je zbehlý v angličtine, je zrejmé, že sa jedná o chybu vo výraze capton. Keďže v kóde mám na tomto riadku príkaz frmokno.capton = "hlavné okno" (viď 6. riadok správy), ľahko sa dovtípim, kde je chyba.
  • 5. a 8. riadok správy ma odkazujú na chybný súbor, v tomto prípade rady.bas. Je to pre prípad, že máte kód napísaný vo viacerých súboroch, na ktoré sa behom kompilácie odkazujete.
  • ak som ani teraz nepochopil, kde v kóde mám chybu, 6. a 7. riadok správy mi to graficky znázorňujú (6. riadok je prepis chybného kódu, 7. riadok má ukazovateľ v tvare šípky (tu na ukážke červený na žltom podklade), ktorý smeruje na chybný výraz v 6. riadku).

Z takto zrozumiteľnej správy by ste mali ľahšie prísť na chybu vo vašom kóde. Môže sa však stať, že ani napriek týmto "signálom" neviete nájsť chybu a kód sa vám zdá správny (aj keď to už piaty krát kontrolujete). Vtedy pomôže kontrola niekoho iného (kto sa v rapid-q vyzná). Môže sa totiž stať, že nevidíte pre oči. :-)
* okno s tlačítkom *
Jednoduchý program, v ktorom sa vytvorí hlavné okno (QForm) a obyčajné tlačítko (QButton). Tlačítku určíme nadpis KONIEC a priradíme mu udalosť OnClick, ktorá sa spustí pri kliknutí myšou na tento komponent. Zelenou farbou sú napísané poznámky (komentáre), šedou farbou samotný kód. Kód vyzerá dlhý len zdanlivo, v skutočnosti je to len 16! riadkov kódu, zvyšok sú komentáre (to sú tie riadky označené na začiatku apostrofom ')...

priklad01.png, 3 kB


Komentáre sa pri kompilácii neberú do úvahy, slúžia len pre programátora pre objasnenie časti kódu, prípadne pre akékoľvek iné doplnkové informcie (napr. čo ešte treba s kódom urobiť a pod.).
' ZAČIATOK KÓDU

' Prvý príkaz $TYPECHECK ON slúži na kontrolu syntaxe (správnosti príkazov). Nie je nevyhnutný, ale veľmi pomáha, lebo poukazuje na prípadnú chybu v programe.

$typecheck on

' Najprv je potrebné definovať ovládacie prvky (komponenty), ktoré použijeme. V našom príklade to bude okno (Okno) a tlačítko (Tlacitko). Dobrý programátor si už dopredu správne nazve všetky komponenty tak, aby aj pri ich väčšom počte vždy vedel, o aký komponent ide. Viac o správnom pomenovaní jednotlivých komponentov v ďalšom článku "Desatoro programátora"...
' VYVARUJTE SA POUŽÍVAŤ V NÁZVOCH DĹŽNE A MÄKČENE!
' Každý komponent je deklarovaný príkazom DIM, pričom je samostatný v novom riadku. Ak chcete ušetriť miesto, môžete písať jednotlivé komponenty za sebou oddelené čiarkou, napr.: dim Okno as QForm, Tlacitko as QButton

dim Okno as QForm
dim Tlacitko as QButton

' Aby program už niečo vedel, deklarujem v úvode podprogramy, ktoré sa spustia v príhodný okamih. Kvôli prehľadnosti píšem názov každého podprogramu tak, aby bolo vždy jasné, ku ktorému ovládaciemu prvku patrí (napr. Tlacitko_onClick značí, že sa podprogram týka tlačítka (Tlacitko), pričom udalosť nastane pri kliknutí na okno (onClick). Obidva názvy pre lepšiu prehľadnosť oddeľujem podčiarnikom.

declare sub Tlacitko_onClick

' V ďalšom riadku upresníme vlastnosti ovládacích prvkov (komponent). Začneme napr. formulárom:

Okno.Caption = "Program s tlačítkom" ' priradenie nadpisu oknu
Okno.Center ' vycentrovanie okna na stred obrazovky

' teraz sa môžeme venovať vlastnostiam tlačítka. každý komponent (a teda aj tlačítko) musí mať priradeného nejakého rodiča (rodič = Parent), t. j. na ktorom komponente sa má objaviť

Tlacitko.Parent = Okno
Tlacitko.Left = 80 ' umiestnenie tlačítka naľavo od kraja
Tlacitko.Top = 50 ' umiestnenie tlačítka hore od kraja
Tlacitko.Width = 150 ' nastavenie šírky tlačítka
Tlacitko.Height = 50 ' nastavenie výšky tlačítka
Tlacitko.Caption = "Koniec programu" ' priradenie názvu tlačítka
Tlacitko.OnClick = Tlacitko_onClick ' zavesenie podprogramu na tlačítko, ktorý sa spustí po kliknutí na tlačítko

Okno.ShowModal ' zobrazenie hlavného okna

' -----------------------
' podprogram, ktorý sa spustí, akonáhle je stlačené tlačítko
' -----------------------

Sub Tlacitko_onClick
    Okno.Close
End Sub

' KONIEC KÓDU
* okno so zoznamom *
Opäť jednoduchý program, v ktorom sa vytvorí hlavné okno, dva zoznamy (combobox je rozbaľovací zoznam, tzv. roletka, listbox je rozvinutý zoznam) a tri textové polia (popis = label). Po kliknutí na ľubovoľný prvok zoznamu je tento načítaný do popisu na spodku okna.

priklad02.png, 3 kb
$typecheck on ' zapnutie kontroly syntaxe

' deklarácia podprogramov k tlačítkam combobox a listbox
' -------------------------------
declare sub cbxovocie_onchange
declare sub lbxzelenina_onclick

' deklarácia ovládacích prvkov
' -----------------------------
dim frmzoznamy as qform ' hlavné okno (form)
dim lblovocie as qlabel ' textový popis (label) k listboxu
dim cbxovocie as qcombobox ' rozbaľovací zoznam (combobox)
dim lblzelenina as qlabel ' textový popis ku comboboxu
dim lbxzelenina as qlistbox ' roztvorený zoznam (listbox)
dim lblvysledok as qlabel ' popis výsledku (na spodku formulára)

' nastavenie okna frmzoznamy
' ----------------------------------
    frmzoznamy.caption = "ukážka zoznamov"
    frmzoznamy.width = 180
    frmzoznamy.height = 280
    frmzoznamy.center
    frmzoznamy.delbordericons 1, 2
' hodnota 1 a 2 značí "vypnutie mini- a maximalizačného tlačítka v hornej lište okna"

' nastavenie popisu lblovocie
' ----------------------------------
    lblovocie.parent = frmzoznamy
    lblovocie.left = 10
    lblovocie.top = 10
    lblovocie.caption = "ukážka comboboxu"

' nastavenie comboboxu cbxovocie
' ----------------------------------
    cbxovocie.parent = frmzoznamy
    cbxovocie.left = 10
    cbxovocie.top = 30
    cbxovocie.width = 150
    cbxovocie.style = 2 ' hodnota 2 zabezpečí, že sa do zoznamu nedá písať
    cbxovocie.additems "čerešňa", "marhuľa", "hruška", "jablko" ' naplnenie zoznamu
    cbxovocie.onchange = cbxovocie_onchange ' udalosť po zmene položky spustí podprogram

' nastavenie labelu (popisu) lblzelenina
' ----------------------------------

    lblzelenina.parent = frmzoznamy
    lblzelenina.left = 10
    lblzelenina.top = 65
    lblzelenina.caption = "ukážka listboxu"

' nastavenie listboxu lbxzelenina (pomocou with a end with je možné skrátiť zápis)
' ----------------------------------
with lbxzelenina
    .parent = frmzoznamy
    .left = 10
    .top = 80
    .width = 150
    .height = 110
    .additems "cibuľa", "mrkva", "kaleráb", "hrach", "fazuľa"' naplnenie zoznamu položkami
    .onclick = lbxzelenina_onclick' udalosť po kliknutí na položku zoznamu
    .color = rgb(&hcc, &hff, &h00)' žltá farba listboxu (t.j. pozadia)
    .font.color = rgb(&h00, &h00, &hcc) ' modrá farba písma
    .font.size = 12 ' veľkosť písma
    .font.name = "courier new" ' názov písma
    .font.addstyles 0 ' 0 = tučné písmo, 1 = šikmé písmo, 2 = podčiarknuté
end with

' nastavenie popisu lbxvysledok
' ----------------------------------
with lblvysledok
    .parent = frmzoznamy
    .left = 10: .top = 200
    .caption = "čakám na kliknutie do zoznamu" + chr$(10) + chr$(13) + "potom sa môj text zmení"
    .font.color = rgb(&hcc, &h00, &h00) ' červená farba písma
end with

frmzoznamy.showmodal ' zobrazenie hlavného okna

' ----------------------------------

sub cbxovocie_onchange
    lblvysledok.caption = "vybrané ovocie: " + cbxovocie.item(cbxovocie.itemindex)
' itemindex je číslo položky v zozname, item = položka
end sub

' ----------------------------------
sub lbxzelenina_onclick
    lblvysledok.caption = "poradie položky: " + _
         str$(lbxzelenina.itemindex) + chr$(10) + chr$(13) + _
         "vybraná zelenina: " + lbxzelenina.item(lbxzelenina.itemindex)
' chr$(10) + chr$(13) zabezpečujú koniec riadku a prechod textu na nový riadok, itemindex je číslo položky v zozname
end sub
' koniec kódu
* okno s menu *
V treťom príklade je ukážka práce s menu. Obyčajné textové menu predstavuje v každom programe nenahraditeľný prvok, ktorým užívateľ zadáva príkazy, resp. obsluhuje program. Na hlavné okno QForm "sa zavesí" hlavné menu (neviditeľný komponent QMainMenu). Na tento neviditeľný komponent sa potom ďalej "vešajú" už viditeľné podmenu QMenuItem. Pri kliknutí na každé podmenu sa dá nastaviť spustenie udalosti (tzv. obsluha - po anglicky "handle").

V menu je použitá aj tzv. pauza (oddeľovač dvoch menu), v našom prípade oddeľuje menu Otvoriť a Koniec, pričom je dosiahnutá cez Caption = "-".

priklad03.png, 3 kb
' začiatok kódu
$typecheck on ' zapnutie kontroly syntaxe

' deklarácia komponent
dim frmprogram as qform ' hlavné okno
dim redprogram as qrichedit ' textové pole
dim mnuprogram as qmainmenu ' hlavné menu
dim mnusubor as qmenuitem ' prvé podmenu
dim mnuotvorit as qmenuitem ' druhé podmenu
dim mnupauza as qmenuitem ' druhé podmenu
dim mnukoniec as qmenuitem ' druhé podmenu

' deklarácia podprogramov
declare sub mnuotvorit_onclick ' ak užívateľ stlačí menu otvoriť
declare sub mnukoniec_onclick ' ak užívateľ stlačí menu koniec
declare sub frmprogram_onclose (action as integer) ' pri zatvorení hlavného okna

' vlastnosti okna
with frmprogram
    .caption = "ukážka práce s menu"
    .center
    .onclose = frmprogram_onclose
end with

' vlastnosti textového poľa
with redprogram
    .parent = frmprogram
    .font.name = "courier new"
    .align = 5 ' (zarovnanie 5 = na celú plochu rodiča - viď rapidq.inc pre ostatné zarovnania)
end with

' hlavné menu
mnuprogram.parent = frmprogram
mnuprogram.additems mnusubor

' prvé podmenu
mnusubor.caption = "&súbor"
mnusubor.additems mnuotvorit, mnupauza, mnukoniec

' druhé podmenu
with mnuotvorit
    .caption = "&otvoriť" ' nadpis
    .shortcut = "ctrl+o" ' klávesová skratka
    .onclick = mnuotvorit_onclick ' udalosť pri spustení
end with

mnupauza.caption = "-" ' oddeľovač menu má nadpis "-"

with mnukoniec
    .caption = "&koniec"
    .shortcut = "esc"
    .onclick = mnukoniec_onclick
end with

frmprogram.showmodal

' -----------------------------
sub mnuotvorit_onclick
    dim opendialog as qopendialog ' komponent pre otvorenie súboru
    opendialog.initialdir = curdir$ ' nastavenie súčasného (aktuálneho) adresára pri otvorení
    opendialog.filter = "textový súbor (*.txt)|*.txt" ' filter zabezpečí zobrazenie len textových súborov. spustí sa otváracie okno, kde užívateľ môže vybrať ľubovoľný súbor.
    ' ak je textový súbor vybraný
    if opendialog.execute then
        ' jeho obsah sa načíta do textového poľa redprogram
        redprogram.loadfromfile (opendialog.filename)
    end if
end sub

' -----------------------------
sub mnukoniec_onclick
    ' ukončenie programu
    frmprogram.close
end sub

' -----------------------------
sub frmprogram_onclose
' keď sa zatvára hlavné okno, užívateľ má možnosť ešte ovlpyvniť uzatvorenie. ak odpovie na otázku "ukončiť program?" tlačítkom ok, program sa ukončí. ak odpovie cancel (= storno), okno sa nezavrie (cez premennú action = 0)
    if messagebox ("ukončiť program?", "pozor!", 1) <> 1 then action = 0
end sub
* kúzla s qlistview *
Tento 100-riadkový kód ukazuje nádherné varianty zobrazenia komponentu QListView, ktoré sa dajú využiť pri programovaní v Rapid-Q. V príklade som použil ešte komponenty QForm (hlavné okno), QLabel (popis), QComboBox (rozbaľovacia roletka), QDirTree (zoznam adresárov v počítači) a 2x QImageList (pre uchovanie ikon). Tento príklad na rozdiel od predošlých už ako tak plní funkciu jednoduchého programu, lebo zobrazuje všetky súbory (v komponente QListView) z vyznačeného adresára QDirTree. Z ponuky zobrazenia si môžete vybrať veľké ikony, malé ikony, zoznam a tabuľku.

priklad04.png, 14 kb


Pre úplnú kompiláciu ešte budete potrebovať jeden grafický súbor (nazval som ho file.ico), ktorý si môžete vyrobiť podľa svojich predstáv v nejakom grafickom prehliadači. Mal by mať rozmer 15 x 15 pixelov a mal by byť uložený v tom istom adresári ako súbor, ktorý budete kompilovať.
Pre tých lenivejších je možnosť stiahnuť si môj (kliknite pravým tlačítkom myši na obrázok a dajte príkaz uložiť obrázok ako). file.ico, 1 kB

' začiatok kódu
$typecheck on ' zapnutie kontroly syntaxe

$Resource ico_file as "file.ico" ' zahrnutie obrázku ikony do programu

' ------------------------ deklarácia ovládacích prvkov (komponent)

    dim frmPriklad as QForm
    dim lviPriklad as QListView
    dim lblPriklad as QLabel
    dim cbxPriklad as QComboBox
    dim dirPriklad as QDirTree
    dim ImageList1 as QImageList
    dim ImageList2 as QImageList

' -------------------------- deklarácia podprogramov
    declare sub dirPriklad_onChange
    declare sub cbxPriklad_onChange

' -------------------------- vlastnosti použitých komponent
with frmPriklad
    .caption = "Kúzla s QListView"
    .width = 640
    .height = 480
    .center
    .onshow = dirPriklad_onChange
end with

with lblPriklad
    .parent = frmPriklad
    .left = 410
    .top = 10
    .caption = "Zobraziť súbory ako:"
end with

with cbxPriklad
    .parent = frmPriklad
    .left = 520
    .width = 100
    .top = 7
    .style = 2
    .addItems "veľké ikony", "malé ikony", "zoznam", "tabuľka"
    .itemIndex = 3 ' 4. položka zoznamu (číslovanie od 0 do 3)
    .onChange = cbxPriklad_onChange
end with

with lviPriklad
    .parent = frmPriklad
    .width = 400
    .align = 3 ' zarovnanie automaticky vľavo na formulár
    .viewstyle = 3 ' 3 = vsReport (typu Zoznam alebo tabuľka)
    .addcolumns "Súbor", "Veľkosť", "Dátum", "Čas" ' stĺpce pri ViewStyle = 3
    .column(0).width = 160 ' šírka 1. stĺpca
    .column(1).width = 80 ' šírka 2. stĺpca
    .column(2).width = 70 ' šírka 3. stĺpca
    .column(3).width = 50 ' šírka 4. stĺpca
    .gridlines = 1 ' true
    .rowselect = 1 ' true
    .LargeImages = ImageList1 ' použitie ikony súboru (32 x 32 pixelov)
    .SmallImages = ImageList2 ' použitie ikony súboru (16 x 16 pixelov)
end with

with ImageList1
    .Height = 32
    .Width = 32
    .AddICOHandle ico_file
End With

with ImageList2
    .Height = 15
    .Width = 15
    .AddICOHandle ico_file
End With

with dirPriklad
    .parent = frmPriklad
    .left = 410
    .top = 40
    .width = 210
    .height = 390
    .directory = "C:\"
    .onChange = dirPriklad_onChange
end with

frmPriklad.ShowModal

' --------------------------
Sub cbxPriklad_onChange
    ' zmena pohľadu QListView (viď RapidQ.INC pre štýly)
    lviPriklad.ViewStyle = cbxPriklad.ItemIndex
End Sub

' --------------------------
Sub dirPriklad_onChange
    dim subor as String
    ' deklarácia premennej SUBOR (pre načítanie textu)
    lviPriklad.Clear ' vymazanie obsahu lviPriklad
    ' načítanie všetkých súborov
    subor = Dir$(dirPriklad.directory + "*.*", 0)
    while subor <> "" ' pokiaľ je názov súboru načítaný (t. j. nie je prázdny text)
        lviPriklad.AddItems FileRec.FileName ' pridanie položky do zoznamu
        lviPriklad.AddSubItem (lviPriklad.ItemCount - 1, Str$(FileRec.Size))         ' pridanie podpoložky Veľkosť
        lviPriklad.AddSubItem (lviPriklad.ItemCount - 1, FileRec.Date) ' pridanie podpoložky Dátum
        lviPriklad.AddSubItem (lviPriklad.ItemCount - 1, FileRec.Time) ' pridanie podpoložky Čas
        subor = Dir$ ' Načítanie ďalšieho súboru v poradí
    wend
End Sub

' KONIEC KÓDU
* komponent qform *
Pri programovaní sa menej skúsený programátor len málo sústredí na hlavné okno (QForm), oveľa viac času venuje ostatným komponentom, ktoré "vešia" na hlavné okno. Ak ešte k tomu nebodaj používa tzv IDE (integrované vývojové prostredie), v ktorom graficky veľmi rýchlo vytvorí návrh (dizajn) nového okna so všetkými komponentmi, veľmi rýchlo zabudne na ošetrenie ďalších vlastnosti, metód a udalostí, ktoré si QForm zaslúži. Viem o čom hovorím, stačí si pozrieť v nápovede o komponente QForm (nájdete ju v Prílohe A nápovedy), čo všetko sa dá "obyčajnému" oknu nastaviť. Hádam žiadny iný komponent nemá toľko vlastností a udalostí ako práve QForm. V nasledujúcom príklade s dvomi komponentami (QForm a QStatusBar) vám niekoľko hlavných predstavím. Verím, že vám príklad umožní pochopiť fungovanie okna a rozšíri možnosti jeho použitia vo vašom programe. Celý príklad nemá viac ako 100 riadkov.

priklad05.png, 3 kb

V príklade je aj návod na ošetrenie menšej chyby kompilátora pri minimalizácii okna (funkciou SetWindowLong), bez ktorej sa okno minimalizuje nie do lišty, ale do ľavého dolného okraja plochy obrazovky.

' začiatok kódu
$typecheck on ' zapnutie kontroly syntaxe

' deklarácia podprogramu, ktorých opravuje minimalizáciu okna

declare Function SetWindowLong LIB "User32" ALIAS "SetWindowLongA" _
    (hwnd AS Long, nIndex AS Long, dwNewLong AS Long) AS LONG

' deklarácia podprogramov okna
    declare sub frmHlavny_onShow
    declare sub frmHlavny_onClose (Action as Integer)
    declare sub frmHlavny_onPaint
    declare sub frmHlavny_onMouseMove (X as Integer, Y as Integer, Shift as Integer)

' použité komponenty (v tomto príklade iba dva!)
    dim frmHlavny as QForm, stbHlavny as QStatusBar

with stbHlavny
    .parent = frmHlavny
    .sizegrip = 0 ' zabránenie zmene veľkosti stavového riadku
    .addpanels " Toto je stavový riadok ", "Pozícia kurzora myši:", "" ' rozdelenie na tri panely
    .panel(0).width = 230
    .panel(1).width = 230
end with

' nastavenie základných vlastností, metód a udalostí okna (viď prílohu A, časť QForm)
with frmHlavny
    .width = 640 ' šírka okna
    .height = 480 ' výška okna
    .delbordericons 2 ' zneprístupnenie maximalizačného tlačítka
    ' pozri RapidQ.INC pre ďalšie nastavenia QForm (časť Border Icons)
    .borderstyle = 1 ' jednoduchý okraj bez možnosti zmeny veľkosti okna
    ' pozri RapidQ.INC pre ďalšie nastavenia QForm (časť Border Styles)
    .cursor = -21 ' kurzor myši v tvare ruky
    ' pozri RapidQ.INC pre ďalšie nastavenia kurzoru (časť CURSORS Variables)
    .caption = "Ukážka práce s formulárom" ' nadpis okna
    .color = rgb(&H99, &H33, &H33) ' farba pozadia
    .font.name = "Courier New" ' názov písma na formulári
    .font.size = 10 ' veľkosť písma na formulári
    .font.addstyles 0 ' vytučnenie písma (zrušiť sa dá príkazom DelStyles 0)
    ' pozri RapidQ.INC pre ďalšie nastavenia písma QFont (časť QFONT Variables)
    .hint = "Toto je bublinková nápoveda formulára" ' text bublinkovej nápovedy
    .showHint = 1 ' povolenie zobrazenia bublinkovej nápovedy

' udalosti okna
    .onShow = frmHlavny_onShow ' udalosť, ktorá sa spustí tesne pred zobrazením okna
    .onClose = frmHlavny_onClose ' udalosť, ktorá sa spustí tesne pred zatvorením okna
    .onPaint = frmHlavny_onPaint ' udalosť, ktorá sa spustí pri prekreslení okna
    .onMouseMove = frmHlavny_onMouseMove ' udalosť, ktorá sa spustí pri kliknutí na okno

' metódy okna
    .center ' vycentrovanie okna je odporúčané uvádzať vždy po určení výšky a šírky okna
    SetWindowLong frmHlavny.handle, -8, 0 ' použitie opravy minimalizácie okna
    SetWindowLong application.handle, -8, .handle ' musí byť na konci vlastností okna
    .showmodal ' zobrazenie okna
end with

' ------------------------
Sub frmHlavny_onShow
    ' môžete pridávať ľubovoľný kód pred spustením hlavného formulára, napr. zistenie veľkosti obrazovky
    frmHlavny.Caption = frmHlavny.Caption + " - rozlíšenie obrazovky " + _
    str$(screen.width) + " x " + str$(screen.height) + " pixelov."
    ' šírka a výška obrazovky je vrátená v tvare čísla (integer), ktoré je potrebné ešte previesť na textový reťazec, aby mohlo byť zobrazené. prevod zabezpečuje funkcia str$(číslo), v našom prípade str$(screen.width)
End Sub

' ------------------------
Sub frmHlavny_onClose
    dim temp as byte
    ' funkcia MessageBox zobrazí dialógové okno s textom a tlačítkami (viď prílohu C, časť "Ďalšie detailné kľúčové slová", heslo MessageBox) &H4 = YESNO tlačítka, &H20 = ICONQUESTION (obrázok otáznika)
    temp = MessageBox ("Chcete zatvoriť okno?", "VÝZVA", &H4 + &H20)
    If temp <> 6 then Action = 0
End Sub

' ------------------------
Sub frmHlavny_onPaint
    ' vykreslenie štvoruholníka v okne
    frmHlavny.Rectangle (200, 100, 250, 200, rgb(&HFF, &HFF, &HFF))
    ' vypísanie textu do okna
    frmHlavny.TextOut (40, 80, "Rapid-Q ?", rgb(&HFF, &HFF, &HFF), -1)
    frmHlavny.TextOut (70, 220, "Rapid-Q !", rgb(&HFF, &HFF, &H00), -1)
    ' vykreslenie kruhu s výplňou čiernou (ak chcete prázdnu, dajte -1 namiesto 0)
    frmHlavny.Circle (150, 250, 400, 400, rgb(&HFF, &HFF, &H00), 0)
    ' vykreslenie štvoruholníka so zaoblenými rohmi
    frmHlavny.RoundRect (480, 50, 600, 350, 10, 10, rgb(&HFF, &HCC, &H00))
End Sub

' ------------------------
Sub frmHlavny_onMouseMove
    dim X as integer, Y as integer
    frmHlavny.PSet(X, Y, rgb(&HFF, &HFF, &H00)) ' metóda PSet na kreslenie v okne
    stbHlavny.panel(2).Caption = " X = " + str$(X) + ", Y = " + str$(Y)     ' zobrazenie koordinátov kurzoru myši v status bare (opäť sú integer X a integer Y prevedené na stringy - textové reťazce)
End Sub

' KONIEC KÓDU
* hlavolam *
Tento príklad som chcel pôvodne zaradiť medzi PROGRAMY, ale vzhľadom na skutočnosť, že je veľmi malý a jednoduchý, nakoniec som ho zaradil medzi PRÍKLADY. Je to skutočne malý program len so 4 (!) druhmi komponent: QForm (hlavné okno), QMainMenu + QMenuItem (obslužné menu) a QCoolBtn (cool tlačítka). Hlavolam je plne funkčný, má menej ako 250 riadkov kódu!

priklad06.png, 3 kb

Na rozdiel od iných príkladov tento používa už aj VLASTNÚ IKONU v ľavom hornom rohu, môžete si ju stiahnuť odtiaľto ikona.ico, 0 kB (dajte príkaz Uložiť obrázok ako), alebo sami vyrobiť (musí mať rozmery 32x32 pixelov, 16-farebnú paletu, vtedy má potrebnú veľkosť 766 bytov!).
Namiesto grafického stvárnenia hracích kameňov (kruhov) som použil menšiu fintu - písmo Wingdings, kde sa namiesto písmena "l" zobrazí plný kruh. Verím, že Vám tento príklad pomôže ako dobrá ukážka pri Vašom programovaní...

' začiatok kódu
$typecheck on ' zapnutie kontroly syntaxe

    Application.Title = "Hlavolam"
    $option icon "ikona.ico"
    const crlf = chr$(13) + chr$(10)

' ----------------------------------
' Komponenty a udalosti
' ----------------------------------


    Dim I as byte
    Dim frmEnigma as QForm
    Dim btnEnigma(0 to 8) as QCoolBtn
    Dim mnuEnigma as QMainMenu
    Dim MnuEnigmaProgram as QMenuItem
    Dim mnuZnova as QMenuItem
    Dim mnuPravidla as QMenuItem
    Dim mnuRiesenie as QMenuItem
    Dim mnuEnigmaPauza1 as QMenuItem
    Dim mnuOEnigme as QMenuItem
    Dim mnuEnigmaPauza2 as QMenuItem
    Dim mnuEnigmaKoniec as QMenuItem

    Declare sub btnEnigma_onClick (Sender as QCoolBtn)
    Declare Sub frmEnigma_OnShow
    Declare Sub Controll
    Declare Sub mnuZnovu_OnClick
    Declare Sub mnuPravidla_OnClick
    Declare Sub mnuRiesenie_OnClick
    Declare Sub mnuOEnigme_OnClick
    Declare Sub mnuEnigmaKoniec_OnClick

' ------------------------------
' Components
' ------------------------------

With frmEnigma
    .Caption = "Hlavolam / Enigma"
    .Width = 375: .Height = 100
    .BorderStyle = 1 ' pevný
    .DelBorderIcons 1, 2
    .Color = rgb(&H00, &H00, &HFF)
    .OnShow = frmEnigma_OnShow
    .Center
End With

For I = 0 to 8
    btnEnigma(I).Parent = frmEnigma
    btnEnigma(I).Top = 4
    btnEnigma(I).width = 40
    btnEnigma(I).Height = 40
    btnEnigma(I).Left = 5 + (I * 40)
    btnEnigma(I).Flat = 1
    btnEnigma(I).OnClick = btnEnigma_onClick
    btnEnigma(I).Font.Name = "Wingdings"
    btnEnigma(I).Font.Size = 40
    btnEnigma(I).Font.AddStyles 0
Next I

' ------------------------------
' Menu
' ------------------------------

    mnuEnigma.Parent = frmEnigma
    mnuEnigma.AddItems MnuEnigmaProgram
    MnuEnigmaProgram.Caption = "Program"
    MnuEnigmaProgram.AddItems mnuZnova, mnuPravidla, mnuRiesenie, mnuEnigmaPauza1, _
    mnuOEnigme, mnuEnigmaPauza2, mnuEnigmaKoniec

with mnuZnova
    .Caption = "&Znova"
    .ShortCut = "F5"
    .OnClick = mnuZnovu_OnClick
end With

with mnuPravidla
    .Caption = "&Pravidlá"
    .ShortCut = "F6"
    .OnClick = mnuPravidla_OnClick
end With

with mnuRiesenie
    .Caption = "&Riešenie"
    .ShortCut = "F7"
    .OnClick = mnuRiesenie_OnClick
end With

mnuEnigmaPauza1.caption = "-"

with mnuOEnigme
    .Caption = "&O programe"
    .ShortCut = "F8"
    .OnClick = mnuOEnigme_OnClick
end With

mnuEnigmaPauza2.caption = "-"

with mnuEnigmaKoniec
    .Caption = "&Koniec / Exit"
    .ShortCut = "Esc"
    .OnClick = mnuEnigmaKoniec_OnClick
end With

frmEnigma.ShowModal

' -------------------------
' Subs
' -------------------------

Sub frmEnigma_OnShow
    For I = 0 to 8
        btnEnigma(I).Hint = Str$(I)
        btnEnigma(I).Caption = "l"
        btnEnigma(I).Visible = 1
        If I < 4 then
            btnEnigma(I).Tag = 1 ' Tag 1 = zlta gula
            btnEnigma(I).Font.Color = rgb(&HFF, &HFF, &H00)
        End If
        If I > 4 then
            btnEnigma(I).Tag = 2 ' Tag 2 = cervena gula
            btnEnigma(I).Font.Color = rgb(&HCC, &H00, &H33)
        End If
    Next

    btnEnigma(4).Tag = 0 ' Tag 0 = ziadna gula
    btnEnigma(4).Visible = 0
End Sub ' -----------------------------

Sub btnEnigma_onClick
    Select Case Sender.Tag
    Case 1 ' Ak je zlta gula
        Select Case Sender.Hint
        Case "7"
        If btnEnigma(Val(Sender.Hint) + 1).Tag = 0 then
            Sender.Tag = 0
            Sender.Visible = 0
            btnEnigma(Val(Sender.Hint) + 1).Visible = 1
            btnEnigma(Val(Sender.Hint) + 1).Tag = 1
            btnEnigma(Val(Sender.Hint) + 1).Font.Color = rgb(&HFF, &HFF, &H00)
        End If

        Case < 7 ' od 0 do 6
            If btnEnigma(Val(Sender.Hint) + 1).Tag = 0 then
                Sender.Tag = 0
                Sender.Visible = 0
                btnEnigma(Val(Sender.Hint) + 1).Visible = 1
                btnEnigma(Val(Sender.Hint) + 1).Tag = 1
                btnEnigma(Val(Sender.Hint) + 1).Font.Color = rgb(&HFF, &HFF, &H00)
            ElseIf btnEnigma(Val(Sender.Hint) + 1).Tag = 2 and btnEnigma(Val(Sender.Hint) + 2).Tag = 0 then
                Sender.Tag = 0
                Sender.Visible = 0
                btnEnigma(Val(Sender.Hint) + 2).Visible = 1
                btnEnigma(Val(Sender.Hint) + 2).Tag = 1
                btnEnigma(Val(Sender.Hint) + 2).Font.Color = rgb(&HFF, &HFF, &H00)
            End If
End Select

    Case 2 ' Ak je červena gula
    Select Case Sender.Hint
        Case "0"
            If btnEnigma(Val(Sender.Hint) - 1).Tag = 0 then
                Sender.Tag = 0
                Sender.Visible = 0
                btnEnigma(Val(Sender.Hint) - 1).Visible = 1
                btnEnigma(Val(Sender.Hint) - 1).Tag = 2
                btnEnigma(Val(Sender.Hint) - 1).Font.Color = rgb(&HCC, &H00, &H33)
            End If
        Case Else ' od 0 do 6
            If btnEnigma(Val(Sender.Hint) - 1).Tag = 0 then
                Sender.Tag = 0
                Sender.Visible = 0
                btnEnigma(Val(Sender.Hint) - 1).Visible = 1
                btnEnigma(Val(Sender.Hint) - 1).Tag = 2
                btnEnigma(Val(Sender.Hint) - 1).Font.Color = rgb(&HCC, &H00, &H33)
            ElseIf btnEnigma(Val(Sender.Hint) - 1).Tag = 1 and btnEnigma(Val(Sender.Hint) - 2).Tag = 0 then
                Sender.Tag = 0
                Sender.Visible = 0
                btnEnigma(Val(Sender.Hint) - 2).Visible = 1
                btnEnigma(Val(Sender.Hint) - 2).Tag = 2
                btnEnigma(Val(Sender.Hint) - 2).Font.Color = rgb(&HCC, &H00, &H33)
            End If
       End Select
   End Select
   Controll
End Sub

' ---------------------------------
Sub Controll
    Dim Temp as Byte
    Temp = 0
    For I = 0 to 3
        If btnEnigma(I).Tag <> 2 then Temp++
    Next

    If btnEnigma(4).Tag <> 0 then Temp++

For I = 5 to 8
        If btnEnigma(I).Tag <> 1 then Temp++
    Next

    If Temp = 0 then ShowMessage "Gratulujem! Úloha je vyriešená!"
End sub

' ---------------------------------
Sub mnuZnovu_OnClick
    If MessageDlg ("Odznova ?", 3, 1 or 2, 0) = 7 then Exit Sub
    frmEnigma_OnShow
End Sub

' ---------------------------------
Sub mnuPravidla_OnClick
    ShowMessage "Cieľom hlavolamu je vymeniť pozície žltých a červených gulí. Žlté gule sa pohybujú len smerom doprava, červené len doľava. Guľa môže prejsť na vedľajšie voľné pole, alebo preskočiť guľu opačnej farby, ak je hneď za ňou voľné pole. Krok späť nie je možný, preto celý hlavolam je potrebné riešiť odznovu."
End Sub

' ---------------------------------
Sub mnuRiesenie_OnClick
    If MessageDlg ("Určite chcete vedieť riešenie?", 3, 1 or 2, 0) = 7 then Exit Sub
    ShowMessage "Sú dve riešenia - podľa toho, či prvá ťahá žltá (Ž) alebo červená (Č)." + crlf + _
"Ak Ž, riešenie je nasledovné:" + crlf + _
"Ž - ČČ - ŽŽŽ - ČČČČ - ŽŽŽŽ - ČČČČ - ŽŽŽ - ČČ - Ž" + crlf + _
"Ak Č guľa ťahá prvá, riešenie je také isté, len farby sú prehodené..."
    End Sub

' ---------------------------------
Sub mnuEnigmaKoniec_OnClick
    frmEnigma.Close
End Sub

' ---------------------------------
Sub mnuOEnigme_OnClick
    ShowMessage "Program: Hlavolam" + Chr$(13) + _
    "Verzia: 1.0 (freeware)" + Chr$(13) + Chr$(13) + _
    "Autor: Slavomir Svetlik" + Chr$(13) + _
    "(c) august 2004"
End Sub

' KONIEC KÓDU
* List in QListBox *
How do you show your data (eg. from UDT, database, text file etc)? How do you create your own table (grid)? I'd like to introduce to you my way, how I find a very simply, but nice way to show data in table. In the beginning (when I started with Rapid-Q), I used QStringGrid, later QListView. Both were (and are) very good, but recently I found another (much more faster and much more beuatiful) way, how to appear data (records) in simple table. I just use basic component QListBox. Maybe you are surprised, maybe not. If yes, I hope, my example gives you a new view, how to show your data. So, let's go to 1. step.

I took a little database of 10 presidents of USA (from Wikipedia), wrote it to QStringList (source of data, but you might have your own UDT, TXT file or database like me - I often use small and fast SQLite database). All fields in records are separate by | separator (you can choose your own). Take a look at first simple table "made in QListBox".

qlistbox1.png, 10 kB

And here is short code (29 lines), how you can create it:

$option explicit
dim frm as QForm, lbx as QListBox, slt as QStringList

with slt
    .additems "George Washington|April 30, 1789|No party"
    .additems "John Adams|March 4, 1797|Federalist"
    .additems "Thomas Jefferson|March 4, 1801|Democratic-Republican"
    .additems "James Madison|March 4, 1809|Democratic-Republican"
    .additems "James Monroe|March 4, 1817|Democratic-Republican"
    .additems "John Quincy Adams|March 4, 1825|Democratic-Republican"
    .additems "Andrew Jackson|March 4, 1829|Democratic"
    .additems "Martin Van Buren|March 4, 1837|Democratic"
    .additems "William Henry Harrison|March 4, 1841|Whig"
    .additems "John Tyler|April 4, 1841|Whig / No party"
    .additems "...|...|..."
end with

with lbx
.parent = frm
.align = 5 ' client all
.text = slt.text ' pass text from source to ListBox
end with

with frm
.width = 500: .height = 300
.caption = "List of presidents of the USA"
.center
.showmodal
end with

Up | Down | Top | Bottom I hear your voice - "but this is not table yet"! Ok, let's change this awful list to wonderful table. First of all - we must change lbStandard style of QListBox to lbOwnerDrawFixed. If you make it, Rapid-Q lost all control over QListBox, but this controll is full in your hands! To perfect appear all fields I use a new subroutine (in my example SUB lbx_onDrawItem in red color), where I locate all text data and lines to places, where I want, witch color with, etc... So, this is a result of this story (compare it with previous picture):

qlistbox2.png, 11 kB

And here is a little longer code (less then 100 lines), how you can create it:

$option explicit
dim frm as QForm, lbx as QListBox, slt as QStringList

declare sub lbx_onDrawItem (Index%, State%, R AS QRect)
declare sub frm_onResize
with slt
    .additems "George Washington|April 30, 1789|No party"
    .additems "John Adams|March 4, 1797|Federalist"
    .additems "Thomas Jefferson|March 4, 1801|Democratic-Republican"
    .additems "James Madison|March 4, 1809|Democratic-Republican"
    .additems "James Monroe|March 4, 1817|Democratic-Republican"
    .additems "John Quincy Adams|March 4, 1825|Democratic-Republican"
    .additems "Andrew Jackson|March 4, 1829|Democratic"
    .additems "Martin Van Buren|March 4, 1837|Democratic"
    .additems "William Henry Harrison|March 4, 1841|Whig"
    .additems "John Tyler|April 4, 1841|Whig / No party"
    .additems "...|...|..."
end with

with lbx
    .parent = frm
    .align = 5 ' client all
    .text = slt.text ' pass text from StringList to ListBox
    .font.color = "Tahoma"
    .multiselect = 1
    .style = 1 ' lbOwnerDrawFixed
    .OnDrawItem = lbx_onDrawItem
    .ItemHeight = 18
end with

with frm
    .width = 500: .height = 300
    .caption = "List of presidents of the USA"
    .center
    .onResize = frm_onResize
    .showmodal
end with

' -------------------------------------------------------------
Sub lbx_onDrawItem
    DefStr SomeText
    DefInt ColorF, ColorB ' ColorF = ForeGroung, ColorB = BackGround

    ' ########################################## FILLING ROW
    Select Case State%
        Case 0 ' selected item
            ColorF = rgb(255,255,255) ' white
            ColorB = rgb(0,0,102) ' blue
        Case Else
            ColorF = rgb(0,0,102) ' blue
            ColorB = Iif(Index% MOD 2 = 0, rgb(255,255,255), rgb(240,230,140)) ' white or khaki
    End Select

         lbx.FillRect (R.Left, R.Top, R.Right, R.Bottom, ColorB)

    ' ########################################## BORDERS AND LINES
    ' top border
    lbx.line (R.Left, R.Top, R.Right, R.Top, rgb(125,125,125))
    ' left border
    lbx.line (R.Left, R.Top, R.Left, R.Bottom, rgb(125,125,125))
    ' bottom border (only on last record)
    If Index% = lbx.ItemCount - 1 then _
        lbx.line (R.Left, R.Bottom, R.Right, R.Bottom, rgb(125,125,125))
    ' right border
    lbx.line (R.Right-1, R.Top, R.Right-1, R.Bottom, rgb(125,125,125))
    ' lines between fields
     lbx.line (R.Left + 40, R.Top, R.Left + 40, R.Bottom, rgb(125,125,125))
     lbx.line (R.Left + frm.width /2 - 60, R.Top, R.Left + frm.width /2 - 60, R.Bottom, rgb(125,125,125))
    lbx.line (R.Left + frm.width /2 + 60, R.Top, R.Left + frm.width /2 + 60, R.Bottom, rgb(125,125,125))

    ' ########################################## TEXT
    ' number of record
    lbx.TextOut (R.Left + 30 - lbx.TextWidth(str$(Index%+1)+"."), _
        R.Top + 3, str$(Index%+1)+".", ColorF, -1)

    ' get the first item (president's name)
    SomeText = Field$(lbx.Item(Index%), "|", 1)
    lbx.TextOut (R.Left + 50, R.Top + 3, SomeText, ColorF, -1)

    ' get the second item (date) - align to the right!
    SomeText = Field$(lbx.Item(Index%), "|", 2)
    lbx.TextOut (R.Left + frm.width / 2 + 50 - lbx.TextWidth(SomeText), _
        R.Top + 3, SomeText, ColorF, -1)

    ' get the third item (party)
    SomeText = Field$(lbx.Item(Index%), "|", 3)
    lbx.TextOut (R.Left + frm.width / 2 + 70, R.Top + 3, SomeText, ColorF, -1)
End Sub

' -----------------------------------------------------------------------
Sub frm_onResize
    lbx.Repaint
end sub

Up | Down | Top | Bottom I hope, you understand all code. If no, wrote me on the forum.
I didn't use other QListBox subroutines in my code (like OnClick or OnDblClick), it wasn't a target of my report (you can handle it yourself). I didn't use QHeader for text headers, it wasn't my target too. And, last thing I didn't use, is RAPIDQ.INC file like resource. I never use it, I like pure code. You can copy and paste my code without errors...

However, if you (or user) need to work with cell(s), QStringGrid is better. But if you (or user) can work with entire rows / records (like in this example), I think, this is very nice way to show them. Isn't it?
popis: pôvodný kompilátor - autor william yu (verzia 1.0 beta z roku 2000)
obsah: kompilátor pre ms windows (rc.exe), integrované vývojové prostredie (rapidq.exe), knižnice (*.lib) a pomocné súbory.
súbor: rqbeta.zip (1,2 mb, anglicky)



popis: nový kompilátor - autor paul ludgate (verzia 1.09 z roku 2007)
obsah: upravený kompilátor pre ms windows (rc.exe) a upravené knižnice (*.lib), opravujúce niektoré chyby pôvodného kompilátora. ich zoznam je v súbore info.txt.
súbor: snakedile.zip (3,1 mb, anglicky)



popis: príklady použitia viacerých komponent - autor william yu (z roku 2000)
obsah: veľmi dobre spracované ukážky použitia vizuálnych i nevizuálnych komponentov, viaceré triky a návody. veľmi dobré na pochopenie viacerých vlastností, metód a udalostí komponent.
súbor: examples.zip (0,53 mb, anglicky)



popis: kompilátor pre linux - autor william yu (z roku 2000)
obsah: knižnice pre kompiláciu, príklady použitia viacerých komponent včítane ukážok hier.
súbor: rqbeta.tgz (0,73 mb, anglicky)



popis: mysql knižnica - autor william yu (z roku 2000)
obsah: knižnica pre prácu programu rapid-q s populárnou databázou mysql, popis a ukážka práce s databázou.
súbor:
verzia pre ms windows rqlibsql.zip (0,62 mb, anglicky)
verzia pre linux rqlibsql.tgz (0,57 mb, anglicky)



popis: slovenská dokumentácia - autor ja (z roku 2005)
obsah: preklad z originálu som si robil viac-menej pre seba, nie je celkom kompletná. poslovenčené sú všetky hlavné kapitoly a niektoré (dá sa povedať hlavné) komponenty, ktoré som najčastejšie používal. je možné, že pri preklade došlo k chybe (nie som zbehlý v angličtine), preto sa za prípadné omyly vopred ospravedlňujem.
súbor: rapidq_slovak_help.zip (0,35 mb, slovensko-anglicky)
diskusná skupina rapid-q na yahoo
celosvetové fórum nadšencov a používateľov rapid-q z celého sveta. pôvodne ju založil sám william yu, teraz sa komunita stará sama o seba, členovia si vo fóre pomáhajú navzájom, v sekcii files sa nachádza množstvo príkladov, komponent, dokumentácie a pod. denne sú vždy nejaké príspevky, skupina sa pomaly rozrastá.



kópia pôvodných stránok williama yu
Pôvodné stránky williama yu už neexistujú, zanikli tuším v roku 2005. prezieraví nadšenci celý portál skopírovali, takže teraz si môžete prezrieť williamove stránky v tej istej podobe. pre mňa majú tieto stránky zvláštnu príchuť, v roku 2001 som ich často navštevoval, keď som lúskal prvé programy v rapid-q.



Ďalšie webové stránky výborných programátorov, ktoré sa venujú Rapid-Q a na ktorých môžete nájsť obrovské množstvo príkladov, vylepšení a nápadov pre svoju tvorbu (uvádzam ich v abecednom poradí):

  • Andrew Shelkovenko (anglicky)
  • Burkley's Bravado (anglicky)
  • Jacques Phillip (anglicky)
  • John Kelly (anglicky)
  • Warriant (česky)
  • Wikipedia (anglicky)
  • Od roku 2001, kedy som začal v Rapid-Q programovať, som napísal viacero programov. Niektoré len pre svoju potrebu, iné na objednávku. Viaceré mám doteraz rozrobené, ale vzhľadom na nedostatok času sa im budem venovať možno až na dôchodku :).
    Takže z tých, ktoré sú dokončené a stoja za uverejnenie, uvádzam nasledovné tri:

    RQ MONEY
    rqmoney.png, 13 kB

    VIAC O PROGRAME
    RQ KULI
    rqkuli.png, 25 kB

    VIAC O PROGRAME
    RQ KAMERKA
    rqkamerka.png, 61 kB

    VIAC O PROGRAME