HoneyLib eli Honey Library on kirjasto, joka käsittää monia paranneltuja versioita QBasicin peruskomennoista ja -funktioista, kuten PRINT, INPUT, RND, sekä myös monia uusia hyödylliksi havaitsemiani käskyjä. Tämän kirjaston funktiot voivat joidenkin mielestä olla huonosti toteutettuja, tai huonompia kuin QB:n alkuperäiset, mutta tämä kirjasto on lähinnä minulle henkilökohtainen. (sen nimi tuleekin tunnuksestani) Tarkoitan tällä siis sitä, että olen pyrkinyt korvaamaan funktioita omillani, jotka parhaiten sopivat omiin tarkoituksiini. Lisäksi tämä kirjasto voi olla välttämätön joillekin koodivinkeille, joita tulevaisuudessa lähetän. Mutta jos funktiot auttavat, niin voihan niitä toki käyttää omissakin ohjelmissa. Mutta, kuten sanoin, tämä sopii parhaiten omiin tarkoituksiini, joten neuvoisin muitakin tekemään itselleen vastaavanlaisia henkilökohtaisia apukirjastoja, ja tästä voi aivan vapaasti ottaa mallia, jos haluaa.
Minulla on tekeillä monia muitakin versioita HoneyLibistä. Tämä versio 0.95m on siis M (main) luokan kirjasto, joka käsittää perusfunktioita. Saatan myös joskus lähettää esim. grafiikkaa käsitteleviä versioita. En suosittele kääntämään tätä LIB-tiedostoksi, vaan kopioimaan funktiot omaan ohjelmaan, sillä olen havainnut, että kirjastossa voi esiintyä ongelmia, vaikka lähdekoodi toimisi moitteettomasti.
Mukana on myös esimerkkiohjelma, joka siis alkaa heti funktioiden, muuttujien ja taulukoiden määrittelyjen jälkeen. Tuo ohjelma ei enää ole funktioiden lähdekoodia, mutta siinä on esitelty kaikki käytettävät funktiot, joten siitä kannattaa ottaa mallia, ennen kuin alkaa kirjoittaa omaa ohjelmaa. Pahoittelen, ettei itse funktioiden koodia ole kommentoitu, mutta asia korjaantunee tulevaisuudessa.
Ja antakaa toki paljon kommenttia sekä parannusehdotuksia, jos keksitte. Ilmoittakaa myös, jos ilmenee ongelmia, niin neuvon, tai mahdollisesti korjailen koodia.
DECLARE FUNCTION HBlank$ () DECLARE SUB HInitialize () DECLARE FUNCTION HInput$ () DECLARE FUNCTION HInt! (HPaValue AS DOUBLE) DECLARE SUB HLocate (HPaY AS INTEGER, HPaX AS INTEGER) DECLARE SUB HPrint (HPaText AS STRING) DECLARE FUNCTION HRnd! (HPaMin AS DOUBLE, HPaMax AS DOUBLE) DECLARE FUNCTION HRound! (HPaValue AS DOUBLE, HPaCur AS DOUBLE) DECLARE SUB HScrollUp () DECLARE SUB HSetColor (HPaColor AS INTEGER) DECLARE SUB HSetScroll (HPaTop AS INTEGER, HPaLast AS INTEGER, HPaLeft AS INTEGER, HPaRight AS INTEGER) DECLARE SUB HSetSystem (Mode AS INTEGER) DECLARE SUB HSlow (HPaTime AS SINGLE) DECLARE SUB HStartTimer (HPaSlot AS INTEGER) DECLARE FUNCTION HString$ (BYVAL PaValue AS DOUBLE) DECLARE FUNCTION HTimer! (HPaSlot AS INTEGER) DECLARE SUB HWait (HPaSec AS DOUBLE) COMMON SHARED HSystem AS INTEGER COMMON SHARED HReadKey AS STRING COMMON SHARED HTime() AS DOUBLE COMMON SHARED HScroll() AS INTEGER COMMON SHARED HPrintX AS INTEGER, HPrintY AS INTEGER COMMON SHARED HColor AS INTEGER COMMON SHARED HscrlTop AS INTEGER, HScrlLast AS INTEGER, HScrlLeft AS INTEGER, HScrlRight AS INTEGER DIM HTime(1 TO 100) AS DOUBLE DIM HScroll(1 TO 25, 1 TO 80, 1 TO 2) AS INTEGER ''// HoneyLib version 0.95m // 'T?st? eteenp?in p??ohjelman koodi on vain esimerkkiohjelmaa, jonka voi 'poistaa ja korvata omallaan. CLS HInitialize 'T?ytyy kutsua joka kerta ennen kirjaston k?ytt?? 'muuten voi aiheutua ongelmia HSetSystem 1 't?ll? ei ole ihmeempi? merkityksi?, ei pakollinen HSetColor 6 't?m? on kuten COLOR HLocate 4, 16 't?m? taas kuten LOCATE HPrint "Terve, kirjoita jotain" 't?m? kuten PRINT HLocate 6, 14 a$ = HInput$ 't?m? kuin INPUT HLocate 8, 16 HPrint "Kirjoitit juuri " HPrint a$ HStartTimer 1 'K?ynnist?? kellon numero 1 HWait 1 'Odottaa 1 sekunnin HLocate 12, 10 HPrint "?sken kului" + STR$(HTimer(1)) + " sekuntia." 'HTimer-funktio palauttaa ajan, johon ?skett?in k?ynnistetty kello p??si HLocate 15, 10 HPrint STR$(HInt(5.5)) + " ja" 'HInt on kuten INT mutta py?rist?? yl?skin HPrint STR$(HRound(18, 7)) 'HRoundin ensimm?inen parametri on 'py?ristett?v? numero. Toinen parametri on 'numero, jonka tarkkutteen py?ristet??n HLocate 17, 5 HSetColor 5 FOR a = -12 TO 12 HPrint HString(a) + " " 'HString palauttaa numeerisen muuttujan HSlow 1 'merkkijonona (parempi kuin STR$) NEXT a HSetScroll 1, 25, 10, 70 'Asettaa skrollauksen koordinaatit 'yl?, ala, vasen, oikea HWait .2 'odottaa 0.2 sekuntia FOR b = 1 TO 25 HLocate 25, 1 FOR a = 1 TO 80 HSetColor INT(HRnd(5, 9)) HPrint CHR$(INT(HRnd(97, 122))) 'HRnd palauttaa luvun paremetrin 'v?lilt? NEXT a HScrollUp 'Skrollaa teksti? yl?sp?in NEXT b
FUNCTION HBlank$ HBlank$ = STRING$(80, 32) END FUNCTION SUB HInitialize HLocate 1, 1 HSetColor 7 HSetScroll 1, 25, 1, 80 END SUB FUNCTION HInput$ HTemp1 = HPrintX DO HReadKey = INPUT$(1) SELECT CASE ASC(HReadKey) CASE 13 EXIT DO CASE 8 HLocate HPrintY, HPrintX - 1 HPrint " " HLocate HPrintY, HPrintX - 1 IF HPrintX < HTemp1 THEN HPrintX = HTemp1 ELSE HTemp1$ = LEFT$(HTemp1$, LEN(HTemp1$) - 1) END IF CASE 32, 48 TO 57, 65 TO 90, 97 TO 122, 128 TO 165 HPrint HReadKey HTemp1$ = HTemp1$ + HReadKey CASE 27 IF HSystem THEN END END SELECT LOOP HInput$ = HTemp1$ END FUNCTION FUNCTION HInt (HPaValue AS DOUBLE) HTemp1 = HPaValue - INT(HPaValue) IF HTemp1 < .5 THEN HInt = INT(HPaValue) ELSE HInt = INT(HPaValue) + 1 END FUNCTION SUB HLocate (HPaY AS INTEGER, HPaX AS INTEGER) HPrintX = HPaX HPrintY = HPaY END SUB
SUB HPrint (HPaText AS STRING) DEF SEG = &HB800 FOR HLoopA = 1 TO LEN(HPaText) HTemp1 = (HPrintY - 1) * 160 + (HPrintX - 1) * 2 POKE HTemp1, ASC(MID$(HPaText, HLoopA, 1)) POKE HTemp1 + 1, HColor HPrintX = HPrintX + 1 IF HPrintX = 81 THEN HPrintX = 1 HPrintY = HPrintY + 1 IF HPrintY = 26 THEN HPrintY = 1 END IF NEXT HLoopA END SUB FUNCTION HRnd (HPaMin AS DOUBLE, HPaMax AS DOUBLE) HRnd = HPaMin + RND * (HPaMax - HPaMin + 1) END FUNCTION FUNCTION HRound (HPaValue AS DOUBLE, HPaCur AS DOUBLE) HRound = HInt(HPaValue / HPaCur) * HPaCur END FUNCTION SUB HScrollUp DEF SEG = &HB800 FOR HLoopA = HscrlTop TO HScrlLast FOR HLoopB = HScrlLeft TO HScrlRight HTemp1 = (HLoopA - 1) * 160 + (HLoopB - 1) * 2 HTemp2 = PEEK(HTemp1) HTemp3 = PEEK(HTemp1 + 1) HScroll(HLoopA, HLoopB, 1) = HTemp2 HScroll(HLoopA, HLoopB, 2) = HTemp3 NEXT HLoopB NEXT HLoopA FOR HLoopA = HscrlTop TO HScrlLast - 1 FOR HLoopB = HScrlLeft TO HScrlRight HTemp1 = (HLoopA - 1) * 160 + (HLoopB - 1) * 2 POKE HTemp1, HScroll(HLoopA + 1, HLoopB, 1) POKE HTemp1 + 1, HScroll(HLoopA + 1, HLoopB, 2) NEXT HLoopB NEXT HLoopA HLocate HScrlLast, 1 HPrint HBlank$ END SUB SUB HSetColor (HPaColor AS INTEGER) HColor = HPaColor END SUB
SUB HSetScroll (HPaTop AS INTEGER, HPaLast AS INTEGER, HPaLeft AS INTEGER, HPaRight AS INTEGER) HscrlTop = HPaTop HScrlLast = HPaLast HScrlLeft = HPaLeft HScrlRight = HPaRight END SUB SUB HSetSystem (Mode AS INTEGER) IF Mode = 0 THEN HSystem = 0 IF Mode = 1 THEN HSystem = -1 END SUB SUB HSlow (HPaTime AS SINGLE) SOUND 32767, HPaTime END SUB SUB HStartTimer (HPaSlot AS INTEGER) HTime(HPaSlot) = TIMER END SUB FUNCTION HString$ (BYVAL PaValue AS DOUBLE) Temp1$ = STR$(PaValue) IF PaValue < 0 THEN HString = MID$(Temp1$, 1, LEN(Temp1$)) ELSE HString = MID$(Temp1$, 2, LEN(Temp1$) - 1) END IF END FUNCTION FUNCTION HTimer (HPaSlot AS INTEGER) HTimer = TIMER - HTime(HPaSlot) END FUNCTION SUB HWait (HPaSec AS DOUBLE) HTemp1 = TIMER DO LOOP UNTIL TIMER - HTemp1 >= HPaSec END SUB
Ihan kivalta näyttää.
Sisennä subit:
FUNCTION HBlank$ HBlank$ = STRING$(80, 32) END FUNCTION
->
FUNCTION HBlank$ HBlank$ = STRING$(80, 32) END FUNCTION
:)
Kieltämättä näyttäisi siistimmältä, kun on vain yksi rivi tekstiä tuossa subissa. Korjaan asian, ja samalla sisennän pari muutakin subia. :) Tällaisiakin parannusehdotuksiakin otan toki vastaan, mutta sanokaa myös, jos keksitte lisäyksiä/parannuksia itse koodiin. Uudet funktio/komento-ehdotukset ovat myös tervetulleita.
binaaryä?
lainaus:
binaaryä?
Kirjastosta on aika turha/vaikea antaa binääriä.
Fisher: Lue toki kuvaus. :) En laittanut binarya (tai en olisi laittanut, vaikka olisin voinutkin) koska huomasin käännetyn kirjaston toimivan virheellisesti. (ainakin tuossa HScrollUp-funktiossa) QB:stä ajettuna kaikki kuitenkin toimii, mutta teen binaryn ehkä sitten, kun selvitän, miksi käännetty LIB-tiedosto aiheuttaa ongelmia.
aika siisti... Tosin suurin osa käskyistä on QB:n yksinkertaisia, joten niitä ei tarvitsisi laittaa omaksi kirjastoksi... Mutta ainakin HScrollUp ja HStartTimer ovat todella hyödyllisiä!
Kyllä tuo hyöryllinen voi olla. Epäilyttäviä function nimiä: HIntistä tulee mieleen hintti. Ja HSlowin vois teherä niin ku koodivinkki "Tarkka tick odotus".
Aihe on jo aika vanha, joten et voi enää vastata siihen.