Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Menusysteemi

Sivun loppuun

Antti Laaksonen [25.02.2002 14:40:13]

#

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.

Pääohjelma

'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

Aliohjelmat

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

Antti Laaksonen [27.02.2002 18:04:13]

#

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

thefox [27.02.2002 19:20:44]

#

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?

banaanisolu [07.08.2002 22:33:32]

#

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

sLVr [13.01.2003 18:34:38]

#

haluísin mäkin qb:stä jotain tajuta mutta huuh...siis mikä toi on? joku pelin alkuvalikko!? wtf? ;)

nomic [21.06.2003 22:54:14]

#

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

Jorgga [13.07.2005 20:43:52]

#

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ä?

Jorgga [13.07.2005 20:46:40]

#

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ä?

moptim [24.12.2006 13:25:44]

#

Näin käytetään ON ERROR RESUME NEXTiä 4.5-versiolla:

ON ERROR GOTO erhe

erhe:
RESUME NEXT

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta