
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).

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!
* 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 ')...

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.).
$typecheck on
dim Okno as QForm
dim Tlacitko as QButton
declare sub Tlacitko_onClick
Okno.Caption = "Program s tlačítkom"
Okno.Center
Tlacitko.Parent = Okno
Tlacitko.Left = 80
Tlacitko.Top = 50
Tlacitko.Width = 150
Tlacitko.Height = 50
Tlacitko.Caption = "Koniec programu"
Tlacitko.OnClick = Tlacitko_onClick
Okno.ShowModal
Sub Tlacitko_onClick
Okno.Close
End Sub
* 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.
$typecheck on
declare sub cbxovocie_onchange
declare sub lbxzelenina_onclick
dim frmzoznamy as qform
dim lblovocie as qlabel
dim cbxovocie as qcombobox
dim lblzelenina as qlabel
dim lbxzelenina as qlistbox
dim lblvysledok as qlabel
frmzoznamy.caption = "ukážka zoznamov"
frmzoznamy.width = 180
frmzoznamy.height = 280
frmzoznamy.center
frmzoznamy.delbordericons 1, 2
lblovocie.parent = frmzoznamy
lblovocie.left = 10
lblovocie.top = 10
lblovocie.caption = "ukážka comboboxu"
cbxovocie.parent = frmzoznamy
cbxovocie.left = 10
cbxovocie.top = 30
cbxovocie.width = 150
cbxovocie.style = 2
cbxovocie.additems "čerešňa", "marhuľa", "hruška", "jablko"
cbxovocie.onchange = cbxovocie_onchange
lblzelenina.parent = frmzoznamy
lblzelenina.left = 10
lblzelenina.top = 65
lblzelenina.caption = "ukážka listboxu"
with lbxzelenina
.parent = frmzoznamy
.left = 10
.top = 80
.width = 150
.height = 110
.additems "cibuľa", "mrkva", "kaleráb", "hrach", "fazuľa"
.onclick = lbxzelenina_onclick
.color = rgb(&hcc, &hff, &h00)
.font.color = rgb(&h00, &h00, &hcc)
.font.size = 12
.font.name = "courier new"
.font.addstyles 0
end with
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)
end with
frmzoznamy.showmodal
sub cbxovocie_onchange
lblvysledok.caption = "vybrané ovocie: " + cbxovocie.item(cbxovocie.itemindex)
end sub
sub lbxzelenina_onclick
lblvysledok.caption = "poradie položky: " + _
 str$(lbxzelenina.itemindex) + chr$(10) + chr$(13) + _
 "vybraná zelenina: " + lbxzelenina.item(lbxzelenina.itemindex)
end sub
* 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 = "-".
$typecheck on
dim frmprogram as qform
dim redprogram as qrichedit
dim mnuprogram as qmainmenu
dim mnusubor as qmenuitem
dim mnuotvorit as qmenuitem
dim mnupauza as qmenuitem
dim mnukoniec as qmenuitem
declare sub mnuotvorit_onclick
declare sub mnukoniec_onclick
declare sub frmprogram_onclose (action as integer)
with frmprogram
.caption = "ukážka práce s menu"
.center
.onclose = frmprogram_onclose
end with
with redprogram
.parent = frmprogram
.font.name = "courier new"
.align = 5
end with
mnuprogram.parent = frmprogram
mnuprogram.additems mnusubor
mnusubor.caption = "&súbor"
mnusubor.additems mnuotvorit, mnupauza, mnukoniec
with mnuotvorit
.caption = "&otvoriť"
.shortcut = "ctrl+o"
.onclick = mnuotvorit_onclick
end with
mnupauza.caption = "-"
with mnukoniec
.caption = "&koniec"
.shortcut = "esc"
.onclick = mnukoniec_onclick
end with
frmprogram.showmodal
sub mnuotvorit_onclick
dim opendialog as qopendialog
opendialog.initialdir = curdir$
opendialog.filter = "textový súbor (*.txt)|*.txt"
if opendialog.execute then
redprogram.loadfromfile (opendialog.filename)
end if
end sub
sub mnukoniec_onclick
frmprogram.close
end sub
sub frmprogram_onclose
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.

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).
$typecheck on
$Resource ico_file as "file.ico"
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
declare sub dirPriklad_onChange
declare sub cbxPriklad_onChange
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
.viewstyle = 3
.addcolumns "Súbor", "Veľkosť", "Dátum", "Čas"
.column(0).width = 160
.column(1).width = 80
.column(2).width = 70
.column(3).width = 50
.gridlines = 1
.rowselect = 1
.LargeImages = ImageList1
.SmallImages = ImageList2
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
lviPriklad.ViewStyle = cbxPriklad.ItemIndex
End Sub
Sub dirPriklad_onChange
dim subor as String
lviPriklad.Clear
subor = Dir$(dirPriklad.directory + "*.*", 0)
while subor <> ""
lviPriklad.AddItems FileRec.FileName
lviPriklad.AddSubItem (lviPriklad.ItemCount - 1, Str$(FileRec.Size))
lviPriklad.AddSubItem (lviPriklad.ItemCount - 1, FileRec.Date)
lviPriklad.AddSubItem (lviPriklad.ItemCount - 1, FileRec.Time)
subor = Dir$ ' Načítanie ďalšieho súboru v poradí
wend
End Sub
* 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.

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.
$typecheck on
declare Function SetWindowLong LIB "User32" ALIAS "SetWindowLongA" _
(hwnd AS Long, nIndex AS Long, dwNewLong AS Long) AS LONG
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)
dim frmHlavny as QForm, stbHlavny as QStatusBar
with stbHlavny
.parent = frmHlavny
.sizegrip = 0
.addpanels " Toto je stavový riadok ", "Pozícia kurzora myši:", ""
.panel(0).width = 230
.panel(1).width = 230
end with
with frmHlavny
.width = 640
.height = 480
.delbordericons 2
.borderstyle = 1
.cursor = -21
.caption = "Ukážka práce s formulárom"
.color = rgb(&H99, &H33, &H33)
.font.name = "Courier New"
.font.size = 10
.font.addstyles 0
.hint = "Toto je bublinková nápoveda formulára"
.showHint = 1
.onShow = frmHlavny_onShow
.onClose = frmHlavny_onClose
.onPaint = frmHlavny_onPaint
.onMouseMove = frmHlavny_onMouseMove
.center
SetWindowLong frmHlavny.handle, -8, 0
SetWindowLong application.handle, -8, .handle
.showmodal
end with
Sub frmHlavny_onShow
frmHlavny.Caption = frmHlavny.Caption + " - rozlíšenie obrazovky " + _
str$(screen.width) + " x " + str$(screen.height) + " pixelov."
End Sub
Sub frmHlavny_onClose
dim temp as byte
temp = MessageBox ("Chcete zatvoriť okno?", "VÝZVA", &H4 + &H20)
If temp <> 6 then Action = 0
End Sub
Sub frmHlavny_onPaint
frmHlavny.Rectangle (200, 100, 250, 200, rgb(&HFF, &HFF, &HFF))
frmHlavny.TextOut (40, 80, "Rapid-Q ?", rgb(&HFF, &HFF, &HFF), -1)
frmHlavny.TextOut (70, 220, "Rapid-Q !", rgb(&HFF, &HFF, &H00), -1)
frmHlavny.Circle (150, 250, 400, 400, rgb(&HFF, &HFF, &H00), 0)
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))
stbHlavny.panel(2).Caption = " X = " + str$(X) + ", Y = " + str$(Y)
End Sub
* 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!

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

(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í...
$typecheck on
Application.Title = "Hlavolam"
$option icon "ikona.ico"
const crlf = chr$(13) + chr$(10)
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
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
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
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
btnEnigma(I).Font.Color = rgb(&HFF, &HFF, &H00)
End If
If I > 4 then
btnEnigma(I).Tag = 2
btnEnigma(I).Font.Color = rgb(&HCC, &H00, &H33)
End If
Next
btnEnigma(4).Tag = 0
btnEnigma(4).Visible = 0
End Sub
Sub btnEnigma_onClick
Select Case Sender.Tag
Case 1
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
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
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
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
* 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".

And here is short code (29 lines), how you can create it:
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):

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
.text = slt.text
.font.color = "Tahoma"
.multiselect = 1
.style = 1
.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
Select Case State%
Case 0
ColorF = rgb(255,255,255)
ColorB = rgb(0,0,102)
Case Else
ColorF = rgb(0,0,102)
ColorB = Iif(Index% MOD 2 = 0, rgb(255,255,255), rgb(240,230,140))
End Select
lbx.FillRect (R.Left, R.Top, R.Right, R.Bottom, ColorB)
lbx.line (R.Left, R.Top, R.Right, R.Top, rgb(125,125,125))
lbx.line (R.Left, R.Top, R.Left, R.Bottom, rgb(125,125,125))
If Index% = lbx.ItemCount - 1 then _
lbx.line (R.Left, R.Bottom, R.Right, R.Bottom, rgb(125,125,125))
lbx.line (R.Right-1, R.Top, R.Right-1, R.Bottom, rgb(125,125,125))
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))
lbx.TextOut (R.Left + 30 - lbx.TextWidth(str$(Index%+1)+"."), _
R.Top + 3, str$(Index%+1)+".", ColorF, -1)
SomeText = Field$(lbx.Item(Index%), "|", 1)
lbx.TextOut (R.Left + 50, R.Top + 3, SomeText, ColorF, -1)
SomeText = Field$(lbx.Item(Index%), "|", 2)
lbx.TextOut (R.Left + frm.width / 2 + 50 - lbx.TextWidth(SomeText), _
R.Top + 3, SomeText, ColorF, -1)
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)
' 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.