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äliviivan
FUNCTION 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 SUB
Ohjelma 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.