Home Eerste begin 2 - Dialogen

Omhoog
Les 1 PBDLL
Les 2 PBDLL
Les 3 PBDLL
Les 4 PBDLL
Les 5 PBDLL
Les 6 PBDLL
Les 7 PBDLL
Les 8 PBDLL
Les 9 PBDLL
Les 10 PBDLL
Les 11 PBDLL

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

 

Download lessen 1-11 (source)
Download lessen 1-11 (executables)
Download lessen 1-11 (beide)

Les 1

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:

 

Les 2

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.

 

Les 3

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 :

 

Les 4

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

 

Les 5

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!

 

Les 6

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:

 

Les 7

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:

 

Les 8

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

 

Les 9

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

 

Les 10

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.

 

Les 11

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

 

Bezoek het PB forum in het Nederlands en/of teken mijn gastenboek.

Datum laatste aanpassing:
29 december 2003 03:41:58

Email mij voor reacties,
aanvullingen en correcties