WINNEW([muuttuja],[x],[y],[leveys],[korkeus],[arvo],"t",[maski],[id-arvo],[fontti])

Selitys

WINNEW() funktiolla luodaan taulukko vektorimuuttujasta. Oheisessa esimerkissä esim. ikkunassa Test on taulukko, joka on myös eräänlainen ikkuna.
Funktion DBOHJEL2() toiminnot selitetty lopussa.

Parametrit

[otsikko] Ei käytössä. Tyhjä teksti "" tai pois.
[x] ikkunan vasen reuna pikseleissä kuvaruuden reunasta katsoen. Jos jätetään pois ohjelma käyttää nollaa.
[y] ikkunan yläreuna pikseleissä kuvaruuden yläreunasta katsoen. Jos jätetään pois ohjelma käyttää nollaa.
[leveys] ja [korkeus] ikkunan ulkomitat tai [korkeus] pikseleissä. Näissä ei ole mukana Windowsin mahdollisesti luomia kelauspalkkeja, jotka ovat lisää.
[arvo] on ikkunan erikoistyyli, kt. esimerkki ja kt. tyylit. Yleensä jätetään tyhjäksi
[maski] Ei käytössä. Nolla tai pois.
[id-arvo] Ei käytössä. Nolla tai pois.
[muuttuja]
vektori, jossa on taulukkoon tarkoitetut rivit ja sarakkeet ja niiden määritykset, otsikot ja muut lisätoiminnot.
Muuttujan ns. osoite lähetään funktiolle double() -funktolla.
Kt. esimerkki.

Palautusarvo

Funktio palauttaa ikkunapidikkeen tai nollan jos funktio epäonnistuu.

Selitys

Tällä funktiolla luodaan kuvaruutuun taulukko sille annetusta verktorista.

Esimerkki

use file2
van=setwindow()
ikku=winnew("Test",0,0,500,300)
setwindow(ikku)
/* taulukon arvot muodostavat siix 5 x 3 matriisin taulukon, jossa esillä ovat
käsillä olevan tietokannan kentät, koodi, ammatti, henkilo1, resno ja tyyppi */

table={{}}
aadd(table[1],{"koodi",,1})
aadd(table[1],{"ammatti",400})
aadd(table[1],"henkilo1")
aadd(table[1],"resno")
aadd(table[1],"tyyppi")
/* arvoissa 1. sarake on ruksattava kohta {"koodi",,1} - tarkoittaa, koodi -kentästä näytetään rasti, jos koodi-kentässä on muu kuin nolla.
Lisäksi ruksattu rivi näytetään punaisella. Mikäli tässä olisi {"koodi",,2} rivi näkyisi vastaavasti punaisella, mutta ruksattavaa kohtaa ei olisi vaan saraketta käytettäisiin muuten normaalisti. Näin käsitelty sarake pitää olla ensimmäinen sarake taulukossa.
{"ammatti",400} -tarkoittaa, että ko. sarake sisältää pistenapin ja kun sitä klikataan taulukon aliohjelma saa viestin nappain=400. */

fo1=choosefont("Arial,8",,1,1)
/* vektori koostuu kahdesta osasta {asetukset (7 kpl),taulukon arvot} : */
apu1={array(7),table}
apu1[1,1]=ikku /* 1. asetus on ikkuna, johon taulukko tulee */
apu1[1,2]=fo1 /* 2. asetus on fontti, jota käytetään taulukossa */
apu1[1,3]="ohjel"
/* 3. asetus on aliohjelma, joka saa näppäinarvon (esim. nuoli-alas on 40), hiiriklikkaus 3, hiirikakkosnappiklikkaus 2, tuplaklikkaus -3 */
apu1[1,4]={"","Ammatti","Etunimi ja;sukunimi","Palkka","Tyyppi"}
/* 4. asetus on otsikot - voi jättää myös pois. Mikäli otsikko halutaan jautuvan useampaan riviin käytetään puolipistettä ";" -rivierottimena */
apu1[1,5]=-5 /* 5. asetus on kuinka monta saraketta on tarkoitus käyttää - voi jättää myös pois, jolloin ohjelma käyttää kaikkia sarakkeita. Numero annetaan negatiivisena, jotta ohjelma tietää, että kyseeessä on tietokannasta muodostettava taulukko.
Tässä käytetään viisi saraketta. Jos taulukolla olisi useampia sarakkeita ne olisivat piilossa. */

apu1[1,6]={20,100,120,80,40}
/* 6. asetus on vektori, jossa on kerrottu sarakkeiden leveydet */
apu1[1,7]={,,,"9,999.99"}
/* 7. asetus on vektori, jossa on kerrottu sarakkeiden formatointimaskit.
Vain numeroita formatoidaan. Voi jättää pois kokonaan tai sarakekohtaisesti */

tab1=winnew(,15,5,362,150,,'t',,,double(apu1))
createbutton('|Kokeile',355,390,220,80,25,2,1)
DO WHILE .t.
   apu=getmessage()
   DO CASE
      CASE apu=256
           DO CASE
              CASE nappain=27
                   EXIT
           endcase
      CASE apu=273
           DO CASE
              CASE nappain=355
                   ? timeh()
            endcase
   ENDcase
ENDDO
deleteobject(fo1)
setwindow(van)
destroywin(ikku)
use

procedure ohjel
@ 7,0 say nappain

taulu

Erilaiset taulukko -ikkunoihin lähetettävät viestit ja kyselyt

Taulukko -ikkunoihin voi lähettää erilaisia viestejä winstatus(), sendmessage() ja postmes() -funktiolla erilaisten Windowsin omien viestien lisäksi:
(HUOM! näillä esimerkeillä viittaan ylläolevan esimerkin taulukkoon, tab1)

Yritetään mennä alimman rivin alle

Kun yritetään mennä alimman rivin alle taulukon aliohjelma saa viestin nappain=-40.

Klikataan hiirellä

Taulukon aliohjelma saa viestin nappain=3.

Klikataan hiiren kakkosnapilla

Taulukon aliohjelma saa viestin nappain=2.

Taulukko tulee aktiiviseksi

Taulukon aliohjelma saa viestin nappain=7.

Painetaan Del

Taulukon aliohjelma saa viestin nappain=46.

Taulukon koko on muuttunut

Taulukon aliohjelma saa viestin nappain=1037.

Kysytään nykyinen tietue/kortti

winstatus(tab1,num1)
Kun lähetetään oheinen kysely taulukolle funktio palauttaa numeron, joka kertoo missä tietueessa musta tai harmaa palkki on.
Palautusarvoa ei saa olla winstatus() funktiolla: ei näin num1=winstatus(tab1,num1).

Kysytään rivi ja sarake -arvot

winstatus(tab1,num1,num2)
Kun lähetetään oheinen kysely taulukolle funktio tallentaa muuttujaan num1 rivinumeron ja num2 muuttujaan sarakkeen.
Palautusarvoa ei saa olla winstatus() -funktiolle ja parametrit 2 ja 3 pitää olla tavallisia muuttujia - ei vektoreita eikä kenttiä.

Muutetaan kaikki taulukon arvot ja asetukset

postmes(tab1,1024+4,0,double(i2))
Kun lähetetään viesti 1024+4 (eli 1028), kolmas parametri on 0 ja neljäs parametri sisältää uudet arvot ja asetukset double() funktiolla annettuna ohjelma luo koko taulukon uudestaan.
Tällöin on syytä käyttää postmes() -viestifunktiota.

Erilaisia asetuksia ja tiloja

Taulukolla on sisäinen muuttuja, johon voi tallentaa erilaisia asetuksia. Tähän muuttujaan annetaan binäärinumeron osissa erilaisia asetuksia, joista taulukko käyttää ja tarkistaa.
Esim. funktiolla sendmessage(tab1,1024+4,1,1) lähetetään viesti, jossa toinen parametri on 1028 ja kolmas parametri on numero - tässä 1.
Tällöin ohjelma asettaa taulukon editointitilaan eli kenttiä voi muuttaa suoraan kirjoittamalla tai painamalla ensin Enter.
Numero on binäärisenä 00000001 eli kahdeksas osa on 1.
Mikäli halutaan, että aliohjelmalta kysytään saako muutosta tehdä lähetetään 512 eli 10000000.
Eri asetuksia voi yhdistää eli voidaan lähettää esim. 10000001 eli editointitila on asetettu ja lupaa lisäksi kysytään.
Ohessa erilaisia asetuksia:
0000000000 0 Perustila
1000000000 512 = ennen editointia lähetetään aliohjelmalle nappain=4 ja jos tapahtuu lastkey(-1) editointia ei sallita, jos taas esim. lastkey(0) editointi sallitaan.
0000000001 1 = taulukkoa saa editoida
0000000010 2 = editointi on meneillään
0010000000 128 = taulukon sarakkeissa on tapahtunut muutos, esim. leveys on muuttunut
0100000000 256 = kun painetaan näppäimistössä A-Z tai 0-9 tai jotain josta tulee edit ajetaan aliohjelma ensin
0000001000 8 = ei-päivitetä moodi päällä
0000010000 16 = alt+nappain menee taulukon aliohjelmaan. Normaalisti kun painetaan Alt+nappain viesti menee pääikkunalle. Tällä asetukselle määrätään, että viesti menee taulukon aliohjelmalle.
0001000000 64 = Kun taulukon tietoja muutetaan ohjelma lähettää aliohjelmaan viestin -5.

Huom! erilaisia asetuksia voi antaa yhdessä: esim. sendmessage(tab1,1024+4,1,1+16).

Vaihdetaan käsiteltävä tietokanta

sendmessage(tab1,1024+4,3,0)
Kun lähetetään viesti 1024+4 (eli 1028), kolmas parametri on 3 taulun sisäiseen muistiin päivittyy nykyinen tietokanta.
Tätä käytetään silloin kun taulukko on näkyville se suljetaan ja sama tai samanlainen tietokanta avataan uudestaan ilman, että taulukkoa suljettaisiin välillä.

Editoitaessa jokainen muutos lähettää viestin aliohjelmalle

sendmessage(tab1,1024+4,4,65536*610+4)
Kun lähetetään viesti 1024+4 (eli 1028), kolmas parametri on 4 jollekin sarakkeelle asetetaan seuraava toiminto:
kun sarakkeen kenttää ollaan editoimassa lähetetään viesti aliohjelmalle.
Esimerkissä sarakkeelle 4 asetetaan ko. ehto ja lähetettävä viesti on 610 (nappain=610). Neljäs parametri koostuu siis HIWORD 610 numerosta ja LOWORD 4 numerosta.

Kun editointi päättyy lähetetään viesti aliohjelmalle

sendmessage(tab1,1024+4,6,610)
Kun lähetetään viesti 1024+4 (eli 1028), kolmas parametri on 6 ohjelma lähettää viestin (nappain=neljäs parametri) aliohjelmalle, esim. 610.
Normaalisti kun editointi päättyy aliohjelma saa 13, 38 tai 40 (Enter,nuoli-ylös,nuoli-alas).

Kysytään taulukon asetukset

sendmessage(tab1,1024+4,7,double(apu1))
Kun lähetetään ylläoleva viesti 1024+4 (eli 1028), kolmas parametri on 7 muut asiat ovat kuten yllä arvo apu1 saa taulukon tämän hetkiset asetukset. Esim. apu1[1,7,4]="9,999.99". Edellytys on, että tässä esimerkissä muuttuja apu1 sisältään vektorirakenteen, joka on sopiva taulukkoasetuksiin.

Päivitä taulukon arvot kun taulukko ei ole aktiivinen

sendmessage(tab1,1024+5,2,0)
Kun lähetetään ylläoleva viesti 1024+5 (eli 1029), kolmas parametri on joku tietuenumero (tässä esim. 2) taulukko päivittyy siten, että tietue (tässä 2) tulee ylimmälle riville.
Mikäli taulukko on aktiivinen mitään ei tehdä.
Mikäli taulukko on aktiivinen ja kolmas parametri on nolla ohjelma tarkistaa ollaanko eof() tai bof() tilassa ja tarvittaessa menee ensimmäiseen tai viimeiseen tietueeseen.

Päivitä taulukon arvot

sendmessage(tab1,1024+6,2,0)
Kun lähetetään ylläoleva viesti 1024+6 (eli 1030), kolmas parametri on joku tietuenumero (tässä esim. 2) taulukko päivittyy siten, että tietue (tässä 2) tulee alimmalle riville ja musta palkki menee ensimmäiseen sarakkeeseen.
Mikäli kolmas parametri on nolla taulukko päivittyy siten, että musta palkki menee alimmalle riville ja ensimmäiseen sarakkeeseen.

Käynnistä etsintä

sendmessage(tab1,1024+7,0,0)
Kun lähetetään ylläoleva viesti 1024+7 (eli 1031) esiin tulee etsintäikkuna. Etsintä etsii kaikista tiedoston tiedoista - ei vain näkyvistä sarakkeista.

Mennään tiedoston loppuun tai alkuun

sendmessage(tab1,1024+8,0,0)
Kun lähetetään ylläoleva viesti 1024+8 (eli 1032) taulukkoon päivittyy seuraavasti:
Jos kolmas parametri on nolla mennään ensimmäiseen tietueeseen.
Jos kolmas parametri on 1 mennään viimeiseen (alimpaan) tietueeseen.

Päivitä taulukon arvot kun tietue ei ole vaihtunut

sendmessage(tab1,1024+9,0,0)
Kun lähetetään ylläoleva viesti 1024+9 (eli 1033) taulukko päivittyy. Tätä on syytä käyttää kun tietue ei ei ole vaihtunut ja musta palkki on samalla paikalla.

Päivitä taulukon arvot kun taulukon ulkomitat ovat vaihtuneet

filt={50,10,200,300} && {x-vasen,y-ylä,x-oikea,y-ala}
sendmessage(tab1,1024+10,double(filt),0)

Kun lähetetään ylläoleva viesti 1024+10 (eli 1034) taulukko päivittyy. Tätä on syytä käyttää kun tietue ei ei ole vaihtunut ja musta palkki on samalla paikalla mutta taulukon ulkomitat ovat muuttuneet.
Ulkomitat annetaan vektorissa double() -funktion sisällä.

Kysytään editointi-ikkuna

sendmessage(tab1,1024+11,0,double(apu1))
Kun lähetetään ylläoleva viesti 1024+4 (eli 1028), neljäs parametri on 7 muut asiat ovat kuten yllä arvo apu1[1] saa taulukossa mahdollisesti editoitavan ikkunan pidike-numeron.

Halutaan tietää jonkin kohdan arvo

arvo=winstatus(tab1,num1,num2)
Kun lähetetään oheinen kysely taulukolle funktio palauttaa mitä on rivin num1 sarakkeessea num2 oleva arvo.
Esim. arvo=winstatus(tab1,3,2) tallentaa arvo -muuttujaan "Merimies".

Tietokanta päivitetään aktiiviseksi tietokannaksi

sendmessage(tab1,1024+4,3,0)
Kun lähetetään viesti 1024+4 (eli 1028) taulukon sisäinen tietokantapidike päivittyy aktiiviseksi tietokannaksi.

Mennään taulukon riville

sendmessage(tab1,1024+5,3,0)
Oheinen käsky siirtää palkin taulukon riville 3. Jos taulukolla on aliohjelma se saa viestin nappain=5000.

Päivitä taulukko

sendmessage(tab1,1024+6,0,0)
Oheinen viesti käskee taulukkoa päivittämään taulukon rivit. Tätä käytetään esim. jos taulukon tietoja on jotenkin muutettu.

Kopioi sarake ylempää

dbohjel2(2009,tab1)
Oheinen viesti käskee taulukkoa kopioimaan aktiiviselle sarakkeelle tiedot ylemmän rivin sarakkeelta.

Kopioi rivi ylempää

dbohjel2(2010,tab1)
Oheinen viesti käskee taulukkoa kopioimaan aktiiviselle riville tiedot ylemmältä riville.

Poista rivi

dbohjel2(46,tab1)
Oheinen viesti käskee taulukkoa poistamaan aktiivisen rivin.

Poista valitut rivit

dbohjel2(-46,tab1)
Oheinen viesti käskee taulukkoa tuo esille maalattuja rivejä koskevia toimintoja valikossa, esim. poista valitut rivit.

Palauta maalattujen rivien tietuenumerot vektorina

dbohjel2(-1001,tab1)
Funktio palauttaa maalattujen rivien tietuenumerot vektorina.

Katso myös GETMESSAGE(), SENDMESSAGE(), POSTMES(), WINSTATUS()