Tämän koodinpätkä luo näytön yläosaan saman tyyppisen hiirellä käytettävän menusysteemin kuin itse QBasic-editorissa. Tämän suhteellisen helposti muokattavan menusysteemin taas voi liittää omiin ohjelmiinsa. Jotta ohjelma toimisi, on – kuten aina hiiren kanssa – QBasic käynnistettävä parametrillä /L.
'QBasic-Menusysteemi
'Vaatii QBasicin käynnistämisen /L -parametrilla ja hiiren
'Tekijä Antti Laaksonen
CONST TAUSTAVARI = 7 'taustan väri
CONST TEKSTIVARI = 0 'tavallisen tekstin väri
CONST TEKSTIHVARI = 8 'himmennetyn tekstin väri
CONST TEKSTIVVARI = 7 'tekstin väri valittuna
CONST PNVARI = 15 'pikanäppäinmerkinnän väri
CONST VVARI = 0 'valitun kohdan väri
TYPE RegType
ax AS INTEGER
bx AS INTEGER
cx AS INTEGER
dx AS INTEGER
BP AS INTEGER
SI AS INTEGER
DI AS INTEGER
FLAGS AS INTEGER
END TYPE
TYPE tmenu
tyyppi AS INTEGER '0=päämenu, 1=alamenu, 2=merkittävä alamenu
teksti AS STRING * 20 'menukohdan teksti
tila AS INTEGER '0=tavallinen, 1=himmennetty, 2=näkymätön, 3=valittu
END TYPE
DIM SHARED menu(1 TO 100) AS tmenu 'kaikki menukohdat sisältävä taulukko
DIM SHARED menut%, vi%, vvi%, vai% 'menukohtien määrä, valittu menu,
'viimeksi valittu menu, ja menu,
'jonka päällä hiiri on
DIM SHARED lx%, ly% 'hiiren paikka
DIM SHARED o AS RegType
DIM SHARED i AS RegType
lukui% = 0
DO
lukui% = lukui% + 1
ON ERROR RESUME NEXT
READ menu(lukui%).tyyppi, menu(lukui%).teksti, menu(lukui%).tila
IF ERR <> 0 THEN EXIT DO
LOOP
ERR = 0
menut% = lukui% - 1
CLS
PiirraYlaMenu
x = AlustaHiiri(onko%, napit%)
IF onko% <> -1 THEN GOTO virhe
NaytaHiiri 1
DO
a = LueHiiri(n%, x%, y%)
lx% = INT(80 / 639 * x%) + 1 'lasketaan x ja y
ly% = INT(25 / 199 * y%) + 1 'tekstitilan kohtana
IF n% = 1 THEN Napsautus
PiirraAlaMenu
'Tähän väliin kirjoitetaan itse ohjelma
COLOR 7, 0
LOCATE 23, 50: PRINT "https://www.ohjelmointiputka.net"
LOOP
END
virhe:
PRINT "Hiirtä ei löytynyt!"
END
RESUME
'Menudata muodossa tyyppi, teksti, tila ks. TYPE tmenu
DATA 0, Ohjelma, 0
DATA 1, Piippaa, 0
DATA 1, Sulje, 0
DATA 0, Esimerkki, 0
DATA 1, Kohta1, 0
DATA 1, -, 0
DATA 1, Himmennetty, 1
'pelkkä - tekee väliviivanFUNCTION AlustaHiiri (onko%, napit%)
i.ax = 0
CALL INTERRUPT(&H33, i, o)
onko% = o.ax
napit% = o.bx
END FUNCTION
FUNCTION HaeMenu (nimi$)
FOR j = 1 TO menut%
IF RTRIM$(menu(j).teksti) = nimi$ THEN
HaeMenu = j
EXIT FUNCTION
END IF
NEXT
END FUNCTION
FUNCTION LueHiiri (nappi%, x%, y%)
i.ax = 3
CALL INTERRUPT(&H33, i, o)
nappi% = o.bx
x% = o.cx
y% = o.dx
END FUNCTION
SUB Napsautus
'aktivoituu, kun hiirtä painetaan
'jos valittiin joku päämenuista...
IF ly% = 1 THEN
kohta = 4
FOR j = 1 TO menut%
IF menu(j).tyyppi = 0 AND menu(j).tila <> 2 THEN
vkohta = kohta
mt$ = RTRIM$(menu(j).teksti)
kohta = kohta + LEN(mt$) + 2
IF vkohta <= lx% + 1 AND kohta >= lx% - 1 THEN
vi% = j
PiirraAlaMenu
END IF
END IF
NEXT
END IF
'tähän tulee, mitä eri valikkokomennoista tapahtuu
IF vai% <> 0 THEN
SELECT CASE vai%
CASE HaeMenu("Piippaa")
BEEP
CASE HaeMenu("Sulje")
END
END SELECT
vi% = 0
END IF
END SUB
SUB NaytaHiiri (tapa%)
i.ax = tapa%
CALL INTERRUPT(&H33, i, o)
END SUB
SUB PiirraAlaMenu
IF vi% <> vvi% THEN COLOR 0, 0: CLS : PiirraYlaMenu
kohta = 4
FOR j = 1 TO menut%
IF menu(j).tyyppi = 0 AND menu(j).tila <> 2 THEN
vkohta = kohta
mt$ = RTRIM$(menu(j).teksti)
kohta = kohta + LEN(mt$) + 2
IF j = vi% THEN
uj% = j
COLOR TEKSTIVARI, TAUSTAVARI
LOCATE 2, vkohta - 1: PRINT "┌" + STRING$(20, "Ä") + "┐"
vai% = 0
hp% = 0
FOR k = 3 TO 10
uj% = uj% + 1
IF menu(uj%).tyyppi = 0 THEN EXIT FOR
IF menu(uj%).tila <> 2 THEN
IF RTRIM$(menu(uj%).teksti) = "-" THEN
LOCATE k - kp%, vkohta - 1
PRINT "├" + STRING$(20, "Ä") + "┤"
ELSE
LOCATE k - kp%, vkohta - 1: PRINT "│";
IF menu(uj%).tila = 1 THEN
COLOR TEKSTIHVARI, TAUSTAVARI
END IF
IF ly% = k AND lx% >= vkohta AND lx% < vkohta + 20 THEN
IF menu(uj%).tila = 1 THEN
COLOR TEKSTIHVARI, TAUSTAVARI
ELSE
COLOR TEKSTIVVARI, VVARI
END IF
vai% = uj%
END IF
PRINT menu(uj%).teksti;
COLOR TEKSTIVARI, TAUSTAVARI
PRINT "│"
END IF
ELSE
kp% = kp% + 1
END IF
NEXT
LOCATE k - kp%, vkohta - 1: PRINT "└" + STRING$(20, "─") + "┘"
END IF
END IF
NEXT
vvi% = vi%
END SUB
SUB PiirraYlaMenu
LOCATE 1
COLOR TEKSTIVARI, TAUSTAVARI
PRINT STRING$(2, " ")
kohta = 3
FOR j = 1 TO menut%
IF menu(j).tyyppi = 0 AND menu(j).tila <> 2 THEN
IF menu(j).tila = 1 THEN
COLOR TEKSTIHVARI, TAUSTAVARI
ELSEIF j = vi% THEN
COLOR TEKSTIVVARI, VVARI
ELSE
COLOR TEKSTIVARI, TAUSTAVARI
END IF
LOCATE 1, kohta
mt$ = " " + RTRIM$(menu(j).teksti) + " "
PRINT mt$
kohta = kohta + LEN(mt$)
END IF
NEXT
COLOR TEKSTIHVARI, TAUSTAVARI
LOCATE 1, kohta
PRINT STRING$(80 - kohta, " ")
END SUB
SUB RajaaHiiri (xp%, xs%, yp%, ys%)
i.ax = 7
i.cx = xp%
i.dx = xs%
CALL INTERRUPT(&H33, i, o)
i.ax = 8
i.cx = yp%
i.dx = ys%
CALL INTERRUPT(&H33, i, o)
END SUBOhjelma on kirjoitettu QB 7.1:llä. Kokeilin asiaa 4.5:n kanssa ja näyttäisi siltä, ettei ohjelma tunnista komentoa ON ERROR RESUME NEXT. Voit kokeilla korvata ongelmakohdan vaikkapa seuraavasti:
DO lukui% = lukui% + 1 ON ERROR GOTO jatkavain READ menu(lukui%).tyyppi, menu(lukui%).teksti, menu(lukui%).tila jatkavain: IF ERR <> 0 THEN EXIT DO LOOP
Hmm? Milläs tuo on kirjoitettu. Quick Basic 4.5:lla ei ainakaan toiminut, vaan valitti tuota riviä:
ON ERROR RESUME NEXT
Jotain muistaakseni että Excepted GOTO.. mistähän tuo ei mahtaisi johtua?
Joo o, olis kiva jos tajuis tosta jotain kun en tajuu koko qbasiicista mitään! Eikä ne ohjeet auta kun ne on liian monimutkaisia! d:)
haluísin mäkin qb:stä jotain tajuta mutta huuh...siis mikä toi on? joku pelin alkuvalikko!? wtf? ;)
ei kannata heti aloittaa "vaikeaselkoisesta" koodista
jos ei ymmärrä kannattaa treenailla jotakin helpompia
ei hyväksi ohjelmoijaksi tulla hetkessä vaan siihen vaadin aikaa, keskittymistä sekä tahtoa ja pitää myös katsoa asioita realistisesti eli jos olet joskus kirjoittanut QB:lla se ei tarkoita että olet todella hyvä ohjelmoimaan tai että olet erityinen
hyväksi ohjelmoijaksi tulemiseen menee monia vuosia ja paljon aikaa QB:n parissa
eli kaikki jotka ovat vasta aloittaneet QB:n käytön älkää turhautuko jos ette ymmärrä jotakin pätkää ja ohjelmointi ei ole pelkästään pelintekoa varten pelintekoa en kyllä edes suosittele ellei ole kokemusta monista perus jutuista jne...
eli kaikki "aloittelijat" voivat kokeilla erilaisia koodeja
ja niiden toimivuutta näiltä sivuilta löytyy melko hyviä tutoriaaleja mistä oppii jotakin
eikä koodia kannata suoraan kopioida omalle koneellesi silloin et opi mitään itsekin kirjoittelen kaiken windowsin kautta QB:hen jotta oppisin jotakin uutta
en halua komennella ketään että miten hommat pitäisi hoitaa haluan vain kertoa mikä on minun mielestäni paras tapa
ja jos ette vielä ymmärrä yllä olevaa pätkää treenailkaa niin pitkään että ymmärrätte koska uusia ohjelmoijia tarvitaan aina eli älkää luovuttako ja älkää aloittako vaikeammasta päästä vaan ihan rauhallisesti
ja sitten kun on jonkin aikaa ohjelmoinu huomaa että pelin tekeminen ei olekaan niin simmpeliä (jos kyseessä on ensimmäinen peli txt seikkailuja ei lasketa :D )
pitää ymmärtää kielen logiikan pitää olla jokin runko kaikelle kaikki pitää suunnitella etukäteen jos haluaa hyvää jälkeä
sama ohjelmissa eli tässä taas vähän tekstiä:
kun olet jo oppinut jotain perus juttuja esim: for,sub,call,resume,do jne...
voit alkaa jo miettiä mihin näitä taitoja voi käyttää järkevästi ja gotosta kannattaa yrittää päästä eroon :)
kun olet jo miettinyt että "hei mä teen kirjoitus ohjelman"
joudut miettimään kaikki siihen liittyvät perus jutut:
runko, aliohjelmat,ulkoasu sekä käyttäjä ystävällisyyttä...
kaikesta kannattaa aluksi tehdä jokin pieni ohjelma(minun tyylini)
eli vaikka tekstin tallennuksesta pieni ohjelma
ulkoasusta pieni ohjelma (helpointa ehkä)
eli miltä ohjelma näyttää ja onko se selkeä...
ja lopuksi yhdistelet näitä pieni ohjelmia yhteen
olen pahoillani "pienestä" tekstistäni halusin tässä vähän opastaa "kollegoita" :D
joo tosta koodista:
toi on iha mukava ja helposti muokattavissa
ihan käytännöllinen mutta en tuota kyllä oman koodini sekaan lisäisi koska oma on omaa :D
siis en väitä että olisi huonoa jälkeä vaan että kaikilla on oma tyyli ja mun tyyli poikkeaa melkovarmasti tuosta paljonkin ja sitä on silloin vaikeampi hahmottaa että missä mennään?
mutta muuten hyvä esimerkki :D
miten ihmeessä saa muka ton toimmaan kun aina nää valittaa jostain mutta qbasic 1.1 joka kysyy/ei kysy pystyy käyttämään niitä?
miten ihmeessä saa muka ton toimmaan kun aina nää valittaa jostain mutta qbasic 1.1 joka kysyy/ei kysy pystyy käyttämään niitä?
Näin käytetään ON ERROR RESUME NEXTiä 4.5-versiolla:
ON ERROR GOTO erhe erhe: RESUME NEXT
Aihe on jo aika vanha, joten et voi enää vastata siihen.