Programmeren in REXX/Een beetje OORexx: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
GuyDC (overleg | bijdragen)
Eerste draft
 
GuyDC (overleg | bijdragen)
Toevoegen van functies
Regel 9:
 
=Grafische schermpjes=
De nu volgende functies kunnen maken dat het programma geen opdrachtprompt meer nodig heeft. Of beter gezegd, de opdrachtprompt kan geminimaliseerd blijven. Als voor het programma een snelkoppeling wordt gemaakt kan het dus gaan lijken op een klassiek Windows programma. Indien OORexx niet ten volle wordt benut blijven de mogelijkheden echter beperkt zoals we zullen zien.
Om deze functies te kunnen gebruiken moet volgende lijn helemaal achteraan het REXX programma worden toegevoegd:
==Functies door OORexx geleverd==
OORexx levert een aantal extra functies als toevoeging op de standaardfuncties die we in het begin van het boek leerden kennen.
Deze functies moeten geactiveerd worden met:
call RxFuncAdd "InstMMFuncs","OODialog","InstMMFuncs"
call "InstMMFuncs"
Dit is de lijst die in dit functiepakket zitten:
===InfoMessage===
'''InfoMessage'''(bericht)
Een pop-up schermpje verschijnt en toont de opgegeven ''tekst''. Het schermpje heeft een OK-knop. De titel is "Information" en er is een icoontje dat duidt op een bericht.
call InfoMessage("Dit is een belangrijk bericht !")
===ErrorMessage===
Zoals een InfoMessage functie, maar met als titel "Error" en een icoontje dat op een fout wijst.
===YesNoMessage===
Zoals een InfoMessage, maar nu zijn er twee knoppen, "Yes" en "No". We kunnen desgevallend ook opgeven welke knop standaard actief is (de focus heeft).
'''YesNoMessage'''(bericht[,knop])
Het antwoord is 1 als "Yes" is gekozen, anders is het 0. Bijvoorbeeld:
if \YesNoMessage("Wil je hiermee verder gaan ?"),"No") then exit
===GetScreenSize===
'''GetScreenSize'''()
Retourneert een string waarin 4 waarden staan:
#breedte in dialoogeenheden
#hoogte in dialoogeenheden
#breedte in pixels
#hoogte in pixels
Deze waarden kunnen nuttig zijn indien we de breedte van inputvelden willen bepalen zoals we later zullen zien.
===PlaySoundFile===
'''PlaySoundFile'''(wav-bestand[,asynchroon])
Speelt de muziek (geluid) van het wav-bestand (enkel deze vorm is toegelaten, dus geen MP3). Als de parameter ''asynchroon'' als "Yes" is opgegeven speelt de muziek verder terwijl het programma loopt.
 
Willen we continu de muziek herhalen, dan gebruiken we de functie '''PlaySoundFileInLoop'''. Om die muziek dan weer te stoppen gebruiken we de functie '''StopSoundFile()'''.
===GetFileNameWindow===
'''GetFileNameWindow'''(bestand,handle,filter,open_of_save,titel,standaardextensie,multiselectie,scheiding)
Presenteert een verkenners-venstertje waarop één of meerdere bestanden kunnen gekozen worden. Het resultaat komt in een string terug.
 
Alle parameters zijn optioneel:
*'''bestand''': een vooraf geselecteerde bestandsnaam of map. Indien geen ''bestand'' is opgegeven, bepaalt het systeem in welke map men begint, meestal is dit de map die de laatste keer is gebruikt, of indien Windows er geen heeft onthouden vertrekt men in de map "Mijn Documenten". Jokers kunnen gebruikt worden in de bestandsnaam.
*'''handle''': de handle van het oproepend scherm. Dit gebruiken we normaal niet.
*'''filter''': een masker. Dit is opgebouwd uit een reeks paren die van elkaar gescheiden zijn door '00'x. Elk van de paren bestaat uit een beschrijvende tekst en een masker, weer van elkaar gescheiden door een '00'x. Standaard is de filter de volgende:
"Text files (*.txt)"'0'x"*.TXT"'0'x"All files (*.*)"'0'x"*.*"
*'''open_of_save''': kan de waarden 1 of 0 aannemen. De waarde 1 betekent "Open" en is de standaardwaarde. De waarde 0 betekent "Save as".
*'''titel''': titel van het schermpje
*'''standaardextensie''': de extensie die aan de bestandsnaam moet worden toegevoegd indien er geen extensie is opgegeven.
*'''multiselectie''': indien 1 wordt opgegeven kunnen meerdere bestanden tegelijk worden geselecteerd.
*'''scheiding''': is het teken dat tussen de bestandsnamen in het antwoord moet worden gezet. Dit is belangrijk als men verwacht dat er spaties in de namen kunnen staan.
Voorbeeld:
bestanden=FileNameDialog("D:\RexxProgrammas\*.rex",,"REXX programma's (*.rex)"'0'x"*.REX",1,,,1,"#")
===SleepMS===
Deze functie stopt de uitvoering voor een aantal milliseconden.
===WinTimer===
'''WinTimer'''(bevel,milliseconden)
Het bevel kan "Start","Stop" of "Wait" zijn. De functie activeert, stopt of wacht voor een Windows timer.
timer=WinTimer("START",300) /* 0,3 seconden */
call WinTimer "WAIT,timer /* wachten op tijdsignaal... */
stop = WinTimer("STOP",timer) /* vroegtijdig stoppen */
Standaard heeft REXX slechts één chronometer. Hiermee kunnen we meer chronometers starten.
<!--------------------------------------------------------------------------------------->
==Publieke OORexx routines==
De functies die we net zagen bestaan ook als zogenaamde publieke OORexx routines. Om deze functies te kunnen gebruiken moet volgende lijn helemaal achteraan het REXX programma worden toegevoegd:
::REQUIRES "OODPLAIN.CLS"
U zal merken dat de beschrijving dikwijls gelijklopend is aan die hierboven, doch in sommige gevallen is het mogelijk de standaardwaarden of titels van de schermpjes te kiezen, zodat ze niet steeds in het Engels blijven.
Opgepast ook, want sommige parameters moeten nu anders geschreven worden.
 
Maar er komen nu nog een reeks andere interessante functies&nbsp;- methodes zouden we moeten zeggen&nbsp;- bij:
 
Dit is de lijst van publieke routines:
==PLAY - geluid afspelen==
===PLAY - geluid afspelen===
'''Play'''(wav-bestand[,optie])
Speelt een geluidsbestand af (enkel WAV is voorzien). Met optie '''yes''' wordt het geluid asynchroon afgespeeld&nbsp;- het programma gaat verder. De optie '''loop''' laat toe het geluid asynchroon en continu te herhalen.
===INFODIALOG - een informatieschermpje===
'''InfoDialog'''(tekst)
Een schermpje met de opgegeven ''tekst'' verschijnt als pop-up. Het heeft een OK-knop.
===ERRORDIALOG - scherm met foutbericht===
'''ErrorDialog'''(foutbericht)
Het foutbericht wordt in een pop-up schermpje getoond. Er is een OK-knop en een icoontje dat duidt op een fout.
===ASKDIALOG - een eenvoudige vraag===
'''AskDialog'''(vraag[,standaardknop])
De vraag wordt in een pop-up schermpje getoond. Er is een YES-knop en een NO-knop. Men kan d.m.v. de opties "Yes" of "No" aanduiden welke knop standaard geselecteerd moet zijn, zodat een eenvoudige "Enter" voldoende is.
Regel 28 ⟶ 91:
Voorbeeld:
if AskDialog("Gaan we hier toch mee verder&nbsp;?","Yes")
===FileNameDialog - selecteren van een bestand===
'''FileNameDialog'''([selbestand][,ouder][,masker][,laden_of_bewaren][,titel][,standaardextensie][,multi][,scheiding])
Deze functie opent een scherm waarop één of meer bestanden kunnen worden geselecteerd. De namen van deze bestanden zijn het antwoord van de functie.
Regel 53 ⟶ 116:
bestand.0=i-1
end; else bestand.0=0
===InputBox - een waarde opvragen===
'''InputBox'''(vraag,titel[,standaardwaarde][,breedte])
Toont een schermpje met één inputveld. Het schermpje heeft de opgegeven ''titel'' en de ''vraag'' staat net boven het inputveld. Er zijn 2 knoppen: OK en Cancel. De functie geeft de tekst die de gebruiker invult terug, of een nullstring als Cancel-knop werd gebruikt. De ''breedte'' van het inputveld kan worden opgegeven, maar deze is in pixels, niet in karakters. Het is daarom nuttig de breedte van de gebruikte font te kennen indien men het inputveld een bepaalde lengte wil geven.
naam=InputBox("Hoe heet je ?","Een antwoord graag")
if naam<>"" then say "Je naam is" naam
===PasswordBox - een paswoord vragen===
'''PasswordBox'''(vraag,titel[,standaardwaarde][,breedte])
Deze functie gebruikt de onderliggende InputBox methode om een paswoord te vragen. Het paswoord wordt weggestopt achter sterretjes.
===IntegerBox - een getal opvragen===
'''IntegerBox'''(vraag,titel[,standaardwaarde][,breedte])
Deze functie is ook een afgeleide van de InputBox methode, en aanvaardt enkel een positief of negatief geheel getal als input.
===MultiInputBox - meerdere waarden opvragen===
'''MultiInputBox'''(vraag,titel,labels.,data.[,breedte])
Deze methode laat toe meer dan één waarde te vragen. De labels van de velden worden in een stem gezet. Het eerste element is de label voor het eerste veld, enzovoort.
De resultaten komen in een ''data.'' stem. Hiervan moeten de elementen beginnen aan nummer 101. De huidige waarde van de resultaatvelden worden op het schermpje getoond.
 
Dit is een voorbeeld:
{{25%}}
lab.1='Type fotobestanden' ; lab.2='Te analyseren disken'
lab.3='Resultaatsbestand'
addr.101=fototype ; addr.102=drives
addr.103=outputfile
dlg = '''.MultiInputBox~new'''("Geef nodige parameters",,
"Parameters", lab., addr.,250)
if '''dlg~execute''' = 1 then do
fototype=dlg~typefotobestanden
drives=dlg~teanalyserendisken ; outputfile=dlg~resultaatsbestand
end; else call exit 28,'Programma onderbroken'
Merk op dat we nu een methode moeten initialiseren en ook uitvoeren. Dit is OORexx schrijfwijze. De antwoorden van de gebruiker komen in velden die de genoemd zijn naar de labels, maar zonder spaties. Ze zijn niet hoofdlettergevoelig, maar moeten wel exact juist zijn.
 
Een alternatieve manier om bovenstaande te schrijven is de volgende:
velden="fototype drives outputfile"
res='''MultiInputBox'''("Geef de nodige parameters",,
"Parameters",,
.array~of("Type fotobestanden","Te analyseren disken","Resultaatsbestand"),,
.array~of("jpg","D E","CSV"),250)
if res \= .Nil then
do input over res
parse var velden veld velden
interpret veld"=input"
end
In dit geval werken we werkelijk met arrays. Ook het '''do''' bevel heeft een nieuwe vorm: "loop '''over''' alle elementen van de array". Dit zijn mogelijkheden die enkel door OORexx worden geboden. Indien uw programma op andere computers moet kunnen uitgevoerd worden is deze versie van REXX daar dus ook nodig.
===ListChoice - kiezen uit een lijst===
'''ListChoice'''(vraag,titel,.array~of(keuze1,keuze2,...[,breedte][,hoogte][,standaardkeuze])
Deze functie toont een selectieschermpje met de verschillende ''keuze''-mogelijkheden onder elkaar en waar de ''standaardkeuze'' al is geselecteerd als er een is opgegeven. Nu kunnen zowel breedte als hoogte van het selectieschermpje bepaald worden (in pixels).
say ListChoice("Wanneer kan je naar de tandarts komen ?",,
"Afspraakdag",,
.array~off("Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag"),,
100,100,"Woensdag")
===MultiListChoice - vele kiezen uit een lijst===
'''MultiListChoice'''(vraag,titel,.array~of(keuze1,keuze2,...[,breedte][,hoogte][,standaardkeuzes])
Dit is een variatie op de ListChoice methode. De standaardkeuzes zijn een lijst van getallen die overeenkomen met de posities in de lijst van mogelijke keuzes.
dagen=MultiListChoice("Welke dagen kan je komen ?",,
"Afspraakdag",,
.array~of("Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag"),,
100,100,"2 4")
if dagen <> .Nil then
do dag over dagen
say "Mogelijke afspraakdag=" dag
end
===CheckList - een keuze in een lijst afvlaggen===
'''CheckList'''(vraag,titel,.array~of(keuze1,keuze2,...)[,breedte][,max_in_kolom])
Deze functie presenteert een lijst waaruit één of meerdere elementen kunnen worden afgevlagd. De parameter ''max_in_kolom'' bepaalt hoeveel keuzes onder elkaar mogen komen alvorens over te gaan tot een nieuwe kolom.
 
Voorbeeld:
dagen=.array~of("Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag")
afspraken=CheckList("Welke dagen kan je komen ?","Afspraken",dagen)
if afspraken <> .Nil then do i = 1 to afspraken~items
if afspraken[i] then say "Je kan op" weekdays[i] "komen"
end
Nogmaals, merk op dat we hier werkelijk met arrays werken, en niet met stems, dit is enkel mogelijk met OORexx.
===SingleSelection - unieke keuze uit een lijst===
'''SingleSelection'''(tekst,titel,array~of(keuzes),[breedte][,max_in_kolom])
Nu presenteert de functie een lijst met radio-buttons waaruit de gebruiker één keuze kan maken.
maanden=.array~of("Jan","Feb","Mar","Apr","Mei","Jun",,
"Jul","Aug","Sep","Oct","Nov","Dec")
maand=SingleSelection("Kies je maand","Geboren in",maanden,12,,6)
say "Je bent dus geboren in de maand" maanden[maand]
<!---------------------------------------------------------------------->
=Extern functiepakket maken=
::REQUIRES PAKKET.REX
{{50%}}
{{sub}}
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.