










Email me
| |
Inleiding Eerste Stappen
Als u nog nooit hebt geprogrammeerd in PB/DLL dan zijn wellicht de begeleiding bij uw
eerste stapjes handig. Ikzelf heb daar toch nog de nodige moeite mee gehad, dus heb
gedacht om de weg vast wat uit te duiden aan anderen. Die kunnen mij later misschien weer
helpen met andere zaken waar ik niet uit kom. Het is geen basiscursus Basic programmeren,
dus enige kennis van de Basic, PowerBASIC for DOS wereld wordt als uitgangspunt genomen.
Ik heb de vorm gekozen van stappen plan in de vorm van lessen. Deze bladzijde is een
erg lange, maar dat heeft als voordeel dat u stap voor stpa het programma kan doorlopen
met alleen PAGE-UP en PAGE-DOWN. .. .
 | Les 1 eerste programma |
 | Les 2 een beep doen |
 | Les 3 eerste dialoogschermpje |
 | Les 4 antwoord uit een dialoogschermpje |
 | Les 5 dialoog met eigen titel |
 | Les 6 dialoog met meer knoppen |
 | Les 7 dialoog met A/R/I |
 | Les 8 dialoog en de windows API |
 | Les 9 dialoog met ja/nee en waarschuwing |
 | Les 10 dialoog met eigen constanten aangeven |
 | Les 11 dialoog modeless: een eigen dialoog maken |

Allereerst voeren we het eerste programma in nadat de Editor PBEDIT.EXE is gestart.
Selecteer FILE/NEW in het menu en type, copieer of laad:
$COMPILE EXE
FUNCTION PBMAIN() AS LONG
END FUNCTION
Download BAS Download EXE
 | De eerste instructie vertelt dat we er een executable van willen maken en geen DLL.
Wellicht wordt dit in een latere versie de standaard instelling. |
 | De volgende instructie geeft aan dat er een functie wordt aangemaakt. Deze functie met
de naam PBMAIN is de functie die vanuit Windows aangeroepen zal worden. Ook kunt u de
uitgebreidere versie met WINMAIN gebruiken. Deze heeft echter een veeltal parameters die
vaak niet worden gebruikt. Daarom volstaan we hier met PBMAIN (beschikbaar vanaf PB/DLL
versie 6). Achter de functie geven we aan hoe het resultaat naar de aanroepende instantie
wordt teruggegeven. Bij PBMAIN is dit een long integer. |
 | Meteen na de start van het programma wordt aangegeven dat het programma afgelopen is:
END FUNCTION geeft aan dat PBMAIN klaar is en controle dus terug gaat naar Windows. Het
programma doet dus helemaal niets. Daarom door naar: |
Het tweede programma doet meteen al veel meer: het laat een geluid horen! Met de
functie BEEP laat u de computer het standaard Windows geluid horen:
$COMPILE EXE
FUNCTION PBMAIN() AS LONG
BEEP
END FUNCTION
Download BAS Download EXE
 | De enige uitbreiding is nu het BEEP commando. Zoals gezegd laat dit het standaard
Windows geluid horen. |
Zo'n piepje is leuk, maar daar hebben we geen Windows compiler voor nodig. Daarom snel
door naar een eerste schermpje, window of dialoog genoemd:
$COMPILE EXE
FUNCTION PBMAIN() AS LONG
MSGBOX ("Hallo Wereld")
END FUNCTION
Download BAS Download EXE
Als resultaat krijgen we een zogenoemde MessageBox op het scherm. Hieraan is niet veel
te manipuleren, maar is vooral handig voor korte boodschappen en snelle rapportages van
waarden in programma's. Daarom is het een nuttig ding en zullen we er even wat mee spelen.
Als u bedenkt dat dit in Visual Basic ongeveer een toepassing van 1 Megabyte (inclusief
run-time bestanden) kost, dan ziet u het verschil duidelijk (want hier is het slechts 5
k).
De regel van de messagebox mag trouwens ook opgegeven worden als: MSGBOX
"Hallo Wereld". In beide gevallen gebruiken we MSGBOX als een statement. Maar we
kunnen het ook als Functie gebruiken, waardoor terugkoppeling van de gebruiker mogelijk
is. Verder ziet u dat de naam bovenaan het schermpje PowerBASIC is. Dus die willen we nog
veranderen in :
Nu gaan we eerst de MSGBOX als functie gebruiken. Dit houdt in dat een variabele gelijk
wordt gemaakt aan het resultaat van de messagebox. Die is in dit geval altijd 1, want er
is alleen een OK knop:
$COMPILE EXE
FUNCTION PBMAIN() AS LONG
LOCAL antwoord AS LONG
antwoord=MSGBOX ("Hallo Wereld")
MSGBOX("Antwoord was: "+STR$(antwoord))
END FUNCTION
Download BAS Download EXE
 | De eerste messagebox wordt gebruikt als functie en het resultaat komt in Antwoord te
staan. Dit antwoord wordt daarna in een tweede messagebox vertoond. Aangezien een
messagebox alleen strings vertoont, moet de waarde omgezet worden met de functie
STR$(). |
 | Het antwoord is 1 omdat de functie altijd netjes als OK wordt afgesloten |
 | De variabele Antwoord hebben we alleen hier (lokaal) nodig, dus ook als Local declareren |
In de helpfile van PB/DLL zien we bij de functie MSGBOX de volgende omschrijving staan:
result& = MSGBOX(txt$ [, [style&], title$])
Dus we kunnen zowel een STYLE meegeven als een titel. Laten we eerst een titel opgeven
om de messagebox niet te laten verraden dat het hier een PowerBASIC programma is:
$COMPILE EXE
FUNCTION PBMAIN() AS LONG
LOCAL antwoord AS LONG
antwoord=MSGBOX ("Hallo Wereld",,"Dit is een MessageBox")
MSGBOX("Antwoord was: "+STR$(antwoord))
END FUNCTION
Download BAS Download EXE
Als resultaat krijgen we nu een messagebox met onze eigen titel. Maar alleen maar OK
kunnen geven voldoet in veel gevallen niet! We willen meer dan alleen OK, zoals
bijvoorbeeld CANCEL of andere teksten!
Er is meer mogelijk met de message boxen, zoals bijvoorbeeld OK en CANCEL. Aangezien
hiervoor waardes meegegeven moeten worden op de plaats die in de helpfile STYLE heet, doen
we dat eens, bijvoorbeeld 1:
$COMPILE EXE
FUNCTION PBMAIN() AS LONG
LOCAL antwoord AS LONG
antwoord=MSGBOX ("Hallo Wereld",1,"Dit is een MessageBox")
MSGBOX("Antwoord was: "+STR$(antwoord))
END FUNCTION
Download BAS Download EXE
 | In plaats van een messagebox met alleen OK komt er nu één met zowel OK als
CANCEL. Ook
zult u zien dat als u CANCEL klikt de waarde van het antwoord niet meer 1 is maar dan 2! |
 | Zo zijn er nog andere waardes, die andere buttons geven: |
Andere veel gebruikte buttons bij bijvoorbeeld copieerakties op schijf en
printerafdrukken zijn ABORT, RETRY:
$COMPILE EXE
FUNCTION PBMAIN() AS LONG
LOCAL antwoord AS LONG
antwoord=MSGBOX ("Hallo Wereld",2,"Dit is een MessageBox")
MSGBOX("Antwoord was: "+STR$(antwoord))
END FUNCTION
Download BAS Download EXE
 | U ziet nu ABORT, RETRY en IGNORE en ook bij selectie ziet u de resultaten in het
opvolgende antwoord boxje. De bitwaarden zijn lastig te onthouden en ze worden toch veel
gebruikt. Daarom is er in een zogenoemd API bestand dat soort waarden voorzien. Zeer veel
waardes staan hierin gedefinieerd in een wat gemakkelijkere aanduiding dan een bitpatroon.
Het bestand, meegeleverd met PBDLL heet WIN32API.INC en alleen de instructie $include
"WIN32API.INC" volstaat: |
Aangeven dat het API bestand moet worden gebruikt doen we met de $INCLUDE aanwijzing
(directive). U moet in PowerBASIC bij Window/Options/Compiler voor de include files het
goede pad hebben aangegeven, want anders kan de compiler het bestand niet vinden en krijgt
u een foutmelding:
$COMPILE EXE
$INCLUDE "win32api.inc"
FUNCTION PBMAIN() AS LONG
LOCAL antwoord AS LONG
antwoord=MSGBOX ("Hallo Wereld",2,"Dit is een MessageBox")
MSGBOX("Antwoord was: "+STR$(antwoord))
END FUNCTION
Download BAS Download EXE
Het zal u ook opvallen dat de compiler wat langer bezig is, aangezien het WIN32API.INC
bestand uit meer dan tienduizend regels bestaat, zodat de tijd om het te doorlopen ook wat
tijd kost. Totale compileertijd op mijn machine (Pentium II 350 MHz is nu ongeveer
anderhalve seconde).
De waardes die voor deze functie in het include bestand WIN32API.INC staan zijn:
%MB_OK = &H0&
%MB_OKCANCEL = &H1&
%MB_ABORTRETRYIGNORE = &H2&
%MB_YESNOCANCEL = &H3&
%MB_YESNO = &H4&
%MB_RETRYCANCEL = &H5&
%MB_ICONHAND = &H10&
%MB_ICONQUESTION = &H20&
%MB_ICONEXCLAMATION = &H30&
%MB_ICONASTERISK = &H40&
%MB_ICONERROR = %MB_ICONHAND
%MB_ICONINFORMATION = %MB_ICONASTERISK
%MB_ICONSTOP = %MB_ICONHAND
%MB_ICONWARNING = %MB_ICONEXCLAMATION
Het procentteken geeft aan dat het constanten zijn en het ampersand teken met H (&H) geeft aan dat het een hexadecimale waarde is (uit
het zestientallig stelsel),: &H=0, &H1=1, &H2=2,
&H3=3, enzovoort, &H10=16, &H20=32
enzovoort.
Als we twee waardes willen gebruiken, bijvoorbeeld YESNOCANCEL en ICONSTOP dan kan dat
door deze binair op te tellen. Dit doen we meestal met de OR functie: %MB_YESNOCANCEL OR %MB_ICONSTOP (= 3 + 16 = 19)
$COMPILE EXE
$INCLUDE "win32api.inc"
FUNCTION PBMAIN() AS LONG
LOCAL antwoord AS LONG
antwoord=MSGBOX ("Hallo Wereld",%MB_YESNOCANCEL OR %MB_ICONSTOP,"Dit is een
MessageBox")
MSGBOX("Antwoord was: "+STR$(antwoord))
END FUNCTION
Download BAS Download EXE
 | Er zijn dus vele mogelijkheden: standaard Windows schermen zoals het waarschuwingsscherm
geven meteen het bijbehorende geluid, dus uw toepassing is geheel in lijn met andere
programma's. |
 | Met de voorgedefinieerde waardes uit de Windows API kunt u gemakkelijker aanduidingen
gebruiken: in plaats van waardes en patronen kunt u voortaan namen gebruiken. Niets ohudt
u trouwens tegen om hiervoor zelf namen te bedenken en in de source op te nemen, zoals
bijvoorbeeld:
%Ok=0: %OkAfbreken=1 : %OkAfbrekenOpnieuwNegeren=2: %JaNeeAfbreken=3: %JaNee=4:
%NogmalsAfbreken=5 enzovoort |
Het voorgaande een beetje verder uitgewerkt levert dan de volgende code op:
$COMPILE EXE
'$include "win32api.inc" 'niet meer nodig, dus dan maar een remark van
maken
%MBOk =0
%MBOkAfbreken =1
%MBOkAfbrekenOpnieuwNegeren =2
%MBJaNeeAfbreken =3
%MBJaNee =4
%MBNogmalsAfbreken =5
%MBKruis =16 'fout
%MBVraag =32 'vraag messagebox
%MBUitroep =48 'uitroepteken waarschuwing
%MBInfo =64 'info balloon
FUNCTION PBMAIN() AS LONG
LOCAL antwoord AS LONG
antwoord=MSGBOX ("Hallo Wereld",%MBJaNeeAfbreken OR %MBInfo,"Dit is een
MessageBox")
MSGBOX("Antwoord was: "+STR$(antwoord))
END FUNCTION
Download BAS Download
EXE
 | U kunt er bijvoorbeeld voor kiezen de eerste constantentlijst in een apart bestand te
zetten, zodat u in elk PB/DLL programma alleen maar een verwijzing hoeft op te nemen naar
dat bestand. De nederlandse termen zijn misschien handiger te onthouden dan de
engelstalige. |
 | Let er wel op dat u geen constanten dubbel definieerd. Als u een andere waarde opgeeft,
zals de compiler dit signaleren. Daarom ook verstandig om vóór de variabele de letters
MB te zetten om aan te geven dat deze bedoeld zijn voor de message box. Op een andere
plaats hebben deze constanten namelijk een andere betekenis. |
Dit was allemaal nog wat spielerei met één functie van Windows, de message box, maar
aangezien deze heel handig is èn om er een beetje in te komen heb ik die hier toch wat
uitgediept. Het volgende voorbeeld gaat al verder. Hier is de toelichting dat als
commentaar in de sourcecode zit, weggelaten en onderaan neergezet:
$COMPILE EXE
GLOBAL hDlg AS LONG
FUNCTION PBMAIN() AS LONG
LOCAL r AS LONG ' een lange integer, de snelste bij 32bit windows
DIALOG NEW 0,"Hoofd dialoogscherm",,,300,100 TO hDlg
DIALOG SHOW MODELESS hDLG
FOR r= 1 TO 100
DIALOG DOEVENTS
SLEEP(40)
NEXT r
DIALOG END hDlg
END FUNCTION |
Download BAS Download
EXE
 | DIALOG NEW 0,"Hoofd dialoogscherm",,,300,100 TO hDlg
 | Uit de HELP file:
Purpose CREATE a NEW dialog.
Syntax DIALOG NEW hParent&, title$, [x&], [y&], xx&, yy& [, style&
[, exstyle&]] TO hDlg& |
 | hParent&: die is hier 0 omdat het een eerste (hoofd)scherm
is. Dialoogschermen die vanuit dit scherm worden geopend moeten vaak het moederscherm
blokkeren, zodat de gebruiker eerst een keuze moet maken alvorens door te gaan met het
programma. Dochterschermen geven als hParent& de variabele op van hun moederscherm.
Als er een 0 wordt opgegeven, dan blokkeert het scherm geen andere schermen. |
 | GLOBAL hDlg AS LONG
hDlg (h=handle, Dlg= dialoog)
Dit wordt een waarde waarnaar steeds wordt verwezen als dit dialoog scherm wordt bedoeld.
Zie het als een volgordenummer. De variabele moet wèl worden gedeclareerd! (zie boven).
Zoals hieronder is te zien: wel definiëren, maar er wordt nog niets getoond! |
 | X-waarde van de plaats van het scherm: geen opgave gedaan, dus
default waarde nemen = gecentreerd |
 | Y-waarde: idem |
 | XX-waarde geeft de horizontale grootte aan (300 pixels in dit
geval) |
 | YY-waarde geeft de vertikale grootte aan (100 pixels)
|
|
 | DIALOG SHOW MODELESS hDLG
 | Laat nu het scherm zien, en wacht NIET op gebruikers aktie: het
programma gewoon door laten lopen. Deze mode heet MODELESS |
|
 | FOR r= 1 TO 100
DIALOG DOEVENTS
SLEEP(40)
NEXT r
 | In deze loop wordt 100 keer 40 milliseconden gewacht
(SLEEP(40)) terwijl Windows zoveel mogelijk door mag gaan. In elke loop wordt wel het
statement DIALOG DOEVENTS uitgevoerd. Dit statement zorgt ervoor dat alles wat gebeurt met
het dialoog wordt verwerkt, zowel muisclicks, toetsaanslagen als veranderende teksten.
Zodra een dialoog als MODAL (zie hierna) staat te wachten, wordt dit in principe geregeld.
|
|
Download BAS Download EXE
Download BAS Download EXE
Download BAS Download EXE
Download BAS Download EXE
Download BAS Download EXE
|