Visual Dialogscript Tutorial

Voorgeschiedenis

Nadat mij enkele keren was gevraagd door vrienden hoe ik nu eigenlijk programma's maak met Visual Dialogscript (VDS), dacht ik na over hoe ik het hen het makkelijkste kon leren zonder ze eerst zelf aan te hoeven laten knoeien. Deze tutorial is daaruit dus voortgekomen. Ik hoop dat hij een beetje te begrijpen is, want ik probeer alles zo stap-voor-stap mogelijk uit te leggen.

Wat gaan we doen?

Met deze tutorial is het de bedoeling om een (zo goed als) volwaardige kopie van het programma "Kladblok" te maken, welke standaard al in Windows zit. Deze tutorial kun je met zowel VDS 4 als VDS 5 gebruiken, maar ik ga er hier vanuit dat je VDS 5 heb. Hieronder zie je een plaatje van hoe het er allemaal uit moet gaan zien.

Wat kun je allemaal leren van deze tutorial?

Deze tutorial legt de beginselen van VDS uit. Zo maak je een dialoog, leer je tekstbestanden openen en opslaan en leer je om te gaan met zogenaamde "Events" (gebeurtenissen). Je hebt hiervoor helemaal geen kennis van programmeren nodig, je hoeft zelfs nog nooit een website of iets dergelijks gemaakt te hebben. Zodra je deze tutorial hebt doorgenomen en hebt uitgeprobeerd, kun je zo goed als meteen aan de slag met het maken van een programma naar keuze, omdat je ook leert hoe je de help functie efficiënt kunt gebruiken.

Het begin

Start om te beginnen VDS eens op. Zoals je ziet, krijg je altijd standaard een leeg scherm. Klik dan ook op het menu "File", "New" en dan "Project". Je krijgt dan een vel voor je neus waar enkele groene lijnen op staan die beginnen met een hekje. Regels die beginnen met een hekje worden door VDS niet gezien als programmacode, dus dat is ideaal om teksten bij stukken programmeercode te zetten, om zo later nog eens terug te kunnen kijken wat het ook al weer precies doet. Voor nu kun je deze regels dus gewoon verwijderen.

Okee, nu het scherm echt leeg is, gaan we beginnen met het maken van het venster. Zorg dat de cursor ergens bovenaan in het witte vak staat, en druk op F2. Hiermee start je de "Dialog Editor" of "Eigenschappen Bewerker". De Dialog Editor heeft drie schermpjes, het hoofd scherm (links), het scherm met de beschikbare elementen (rechts onder) en het dialoog dat we zelf aan kunnen passen en dat nu "Nieuw Dialoog" heet.

screenshot2.png (18041 bytes)

Met behulp van bovenstaande schermpjes kun je je programma vorm geven. Maak om te beginnen het dialoog ongeveer 300 pixels breed en 250 pixels hoog. De titel van het venster kun je simpel veranderen door achter "Titel:" de nieuwe naam te zetten, in dit geval "Kladblok" (zonder aanhalingstekens). Ten slotte geven we ons venster nog de stijlen "RESIZABLE" en "SAVEPOS". De eerste zorgt, zoals de naam al zegt, ervoor dat het venster in grootte veranderd kan worden. De tweede zorgt dat de positie van het venster altijd weer hetzelfde wordt als de laatste keer dat het programma is gebruikt.

Nu we het hoofd scherm hebben, moeten we nog een menu toevoegen met de functies en een tekstvak waar men ik kan gaan typen. We beginnen met het menu, door op het "Elementen" scherm te kiezen voor het tweede icoontje op de onderste rij. Zodra je deze hebt aangeklikt en over ons dialoog heen gaat, zie je dat de muisaanwijzer is veranderd. Dit houdt in dat je dus een element hebt geselecteerd om te plaatsen. Klik op ons dialoog en type als naam in "Bestand". Dit zorgt er dus voor dat de naam van het menu, je raadt het nooit, Bestand wordt...

Okee, we hebben een menu, maar nu moeten er nog dingen in komen te staan. Zoals je ziet is bij het hoofdscherm van de Dialog Editor wat veranderd. Zo zijn alle tekstvakken met "Boven", "Links", enzovoorts weg en staan daarvoor in de plaats heel veel vakjes met als tekst "Items:". In deze vakjes kun je alle dingen invoeren die we in ons menu willen hebben. We beginnen met "Nieuw", "Openen", "Opslaan", "Opslaan Als", "-", "Afdrukken", "-" en "Afsluiten". De streepjes zorgen ervoor dat er later een horizontale streep op die plek komt te staan, om de menu items te scheiden.

Het volgende dat we moeten maken, is het tekstvak. In VDS wordt eigenlijk niet echt gesproken van "Tekstvak" of "Inputvak", zoals je in andere programmeertalen misschien wel eens bent tegengekomen, maar van een "Edit". Het icoontje hiervoor bij de "Elementen" is screenshot3.png (18041 bytes). Klik hem aan, klik op ons dialoog en geef als naam "TEKST" op. Zodra je op OK hebt geklikt, zie je dat de vier hoeken zwarte puntjes hebben. Door op deze puntjes te klikken, kun je de edit vergroten of verkleinen. Als je op de edit zelf klikt, en de muisknop ingedrukt houdt, kun je hem verplaatsen. Maak de edit nu net zo groot als het dialoog (met de muis of door de eigenschappen te bewerken met de "Dialog Editor" zelf). Klik nu eens voor de grap op het play knopje van de Dialog Editor. Hiermee kun je testen of een dialoog er wel precies zo uitziet als jij wilt, en je kunt het in een later stadia bijvoorbeeld gebruiken om te kijken welke zogenaamde "Events" je moet gebruiken.

Zoals je misschien gezien hebt nadat je op het play (screenshot4.png (18041 bytes)) knopje hebt geklikt en de boel hebt uitgeprobeerd, is dat het lettertype standaard "Times New Roman" is, dat je geen tabs en enters kunt gebruiken, en dat er geen scroll-balken komen als de tekst te lang is. Dat is allemaal weer simpel op te lossen door "Styles" of stijlen te gebruiken. Klik bij de elementen op het "Style" icoontje rechts onderin en klik op je dialoog. Geef hem als naam "STIJL1". Nu kun je instellen hoe de teksten eruit moeten komen te zien. Kies voor nu als lettertype "Verdana" en als grootte 10. Klik daarna op de edit en kies als stijl "STIJL1". Hierdoor wordt de gemaakte stijl op het edit element toegepast. Om te zorgen dat je de edit kunt scrollen en dergelijke, moet je ook nog de volgende stijlen instellen: "MULTI", "TABS" en "SCROLL". Klik daarna bij de Dialog Editor op OK. Hierdoor wordt de programmeercode gegenereerd en in VDS zelf gezet. Het moet er ongeveer zo uitzien. De regels met de hekjes heb ik zelf toegevoegd, om het geheel nog even te verduidelijken (deze worden natuurlijk niet uitgevoerd):

    # Maak het hoofd scherm.
    DIALOG CREATE,Kladblok,-1,0,300,250,RESIZABLE,SAVEPOS
    # Voeg een "STYLE" toe welke gebruikt kan worden om bijvoorbeeld het lettertype van elementen
    # te veranderen.
    DIALOG
ADD,STYLE,STIJL1,Verdana,10
    # Voeg het "Bestand" menu toe.
    DIALOG
ADD,MENU,Bestand,Nieuw,Openen,Opslaan,Opslaan Als,-,Afdrukken,-,Afsluiten
    # En ten slotte een editvak om de tekst in te openen en te bewerken.
    DIALOG
ADD,EDIT,TEKST,0,0,300,250,,,MULTI,TABS,SCROLL,STIJL1
    # Met de volgende regel laat je het dialog zien.
    DIALOG
SHOW

Zodra deze code in de IDE (Integrated Development Environments, ofwel de "editor") staat, kun je het draaien door op de play (screenshot4.png (18041 bytes)) knop te drukken. Zoals je ziet is het scherm maar héél even zichtbaar, en sluit het zich meteen af. Hiermee zijn we bij een nieuw punt gekomen. VDS draait een programma namelijk standaard van boven naar beneden, regel voor regel, en zodra er niets meer staat wordt het afgesloten. Hoe kunnen we dit voorkomen? Simpel, door tegen VDS te zeggen dat hij moet wachten met het uitvoeren van het script, totdat er iets gebeurt (een Event). Dit kun je doen met het commando wait event. Als je dit letterlijk vertaald, staat er dan ook "wacht op een gebeurtenis". Alleen komen we dan aan bij probleem nummer twee: hoe kun je ervoor zorgen dat het script weet welke gebeurtenis heeft plaatsgevonden, en hoe deze hiermee om moet gaan? Dit is op te lossen met zogenaamde "labels". Met labels zie je stukken programmacode groeperen, zeg maar van een etiket voorzien. Je kunt labels maken door gewoon een dubbele punt neer te zetten, met daarachter de naam (:MijnLabel). Je kunt een label oproepen door simpelweg het goto commando te gebruiken, met daarachter de naam van de label: goto MijnLabel

Gebeurtenissen met ons script

Nu we weten hoe we labels kunnen maken en gebruiken, moeten we iets weten over functie's. Terwijl je met een commando enkel dingen kunt uitvoeren zonder de resultaten terug te krijgen, kan dit met een functie wel. Iedere functie begint met een apenstaartje, dan de naam van de functie en daarna twee haakjes. Tussen deze haakjes staan soms parameters welke de functie precies 'vertellen' wat het moet doen. De functie om bijvoorbeeld de naam van de laatste gebeurtenis te krijgen, is @event(). We zouden dus onder de code van het dialoog, dit neer kunnen zetten om te zorgen dat alle gebeurtenissen opgevangen kunnen worden:

    :Evloop
   
# Wacht tot er een event (gebeurtenis) is. Ga, zodra deze er is, naar het bijbehorende
    # label.
    wait
event
    goto @event()

Als je de bovenstaande code weer draait met de IDE, zul je zien dat het venster gewoon open blijft staan. Zodra je echter het programma wilt afsluiten, op een van de menu items klikt of als je het venster van grootte veranderd (resized), wil het programma naar het bijbehorende label wat er nog niet is. Hierdoor krijg je dus een foutmelding. We zullen dus voor ieder event een label moeten maken, om zo te zorgen dat de goede programmeercode steeds wordt uitgevoerd. Gelukkig staat er bij de foutmelding ook welk label er nog niet is, dus zullen we die gelijk maar even maken. 

De eerst keer dat je een foutmelding krijgt, zal waarschijnlijk gaan om het "RESIZE" label. Dit wordt standaard als eerste gedaan na het maken van een dialoog, aangezien je zou kunnen zeggen dat vanuit niets opeens een dialoog is gemaakt, dus hij is van grootte veranderd. Om deze foutmelding de volgende keer te voorkomen, plus om te zorgen dat de edit netjes meebeweegt, gebruiken we het dialog setpos commando. Om de grootte van het dialoog te weten te komen, gebruiken we de @dlgpos() functie. Om achter de parameters te komen die we nodig hebben, kun je de muiscursor halverwege de naam van de functie of van het commando zetten en op Ctrl+F1 drukken. Als je dit bij dialog doet, zul je zien dat je een hele grote pagina te zien krijgt. Aangezien wij enkel info hoeven over dialog setpos, moeten we daar even naar zoeken:

        DIALOG SETPOS, <name>,<top>,<left>,<width>,<height>  

We moeten dus de parameters "name", "top", "left", "width" en "height" opgeven. "Name" is de naam van het element waarvan we de grootte willen veranderen, dus in dit geval "TEKST". De "top" en "left" posities blijven gewoon 0, want we willen dat de edit netjes links bovenin blijft. De "width" en "height" parameters daarentegen zijn wat lastiger, omdat deze rekening moeten houden met de grootte van de dialoog zelf. Deze grootte kunnen we dus zoals al eerder gezegd achterhalen met de @dlgpos() functie. Als je bij het helpbestand kijkt, zie je dit staan:

        @DLGPOS(<element_name>, <flags>)  

Omdat we de grootte willen weten van het hoofddialoog, hoeven we bij "element name" niets op te geven. Bij "flags" moeten we opgeven waarvan we de positie willen weten, in dit geval de "w" van "width" (breedte) en de "h" van "height" (hoogte). Als we dit allemaal samenvoegen en van een label voorzien, krijgen we dit:

    :Resize
    # Als het scherm van formaat wordt veranderd, moet het editvak natuurlijk meeveranderen. Daarom gebruiken
    # we het "dialog setpos" commando, met als "width" en "height" parameters de breedte en hoogte van het
    # programma zelf. Dit kan gedaan worden door "@dlgpos()" te gebruiken zonder een naam voor het element op
   
# te geven. De tweede parameter moet aangeven wat we willen ontvangen, "w" voor "width" en "h" voor "height".

    dialog
setpos,TEKST,0,0,@dlgpos(,W),@dlgpos(,H)
    goto
Evloop 

De laatste regel, goto Evloop, zorgt ervoor dat we weer netjes terug gaan naar ons label die op gebeurtenissen wacht. Start nu eens ons programma op met de play knop en je zult zien dat de edit steeds netjes van grootte veranderd als je de dialoog vergroot of verkleint. Sluit het dialoog nu af door op het kruisje te klikken en je zult ons tweede probleem zien. De label "CLOSE" mist. Als je deze maakt en de regel eronder goto Evloop neerzet, zul je zien dat je het programma niet meer af kunt sluiten, omdat het in een loop zit. Daar moeten we iets aan doen. Indien je een programma wilt stoppen, zul je het stop commando moeten gebruiken. Maar wat als de gebruiker nu eens het programma per ongeluk afsluit? Het is beter om even te vragen of de gebruiker écht het programma af wil sluiten, wat we met de @ask() functie gaan doen, in samenwerking met een "if-else-end" voorwaarde. De @ask() functie geeft een popup weer waar de gebruiker voor ja of nee kan kiezen. Indien voor "ja" wordt gekozen, geeft de functie een "1" terug, als voor "nee" wordt gekozen blijft de functie leeg. Als we dit samenvoegen met de if-else-end functie, zul je zien dat indien de @ask() functie een "1" (ja) teruggeeft, de code tussen if en else wordt gedraaid, terwijl in het geval van niets (nee) de code tussen else en end wordt gedraaid (indien dat er is). Ons "CLOSE" label zal er dus zo uit gaan zien:

   :Close
   #
Indien de gebruiker bij een "@ask()" bericht op ja klikt, is "if" waar, als de gebruiker op nee klikt,
   # is "if" uiteraard onwaar en zal de code bij "else" uitgevoerd worden.

   if @ask(
Weet je zeker dat je dit wilt afsluiten?)
     # Stop
het programma.
     stop
   else
     #
Ga terug naar de "Event Loop".
     goto
Evloop
   end

Probeer het nog maar eens uit. Netjes hè? Alleen is er nog één probleempje: als je via het menu voor "Afsluiten" kiest, krijg je weer een foutmelding dat de "AFSLUITENMENU" label mist. Aangezien deze hetzelfde moet doen als wanneer iemand op het kruisje klikt, kun je gewoon het label maken en doorverwijzen naar de "CLOSE" label met het goto commando:

   :AfsluitenMENU
   #
Als iemand voor afsluiten kiest, is dit hetzelfde als het klikken op het kruisje van het scherm. Daarom
   # sturen we dit event door naar :Close.

   goto
Close

De tekstverwerkingsfuncties

Okee, onze simpele tekstverwerker werkt nu al grotendeels. Je kunt hem opstarten, vergroten en verkleinen en je kunt hem afsluiten. Nu moeten we dus nog ervoor zorgen dat de gebruiker een bestand kan openen en opslaan, dat er een nieuw bestand gemaakt kan worden en dat het bestand afgedrukt kan worden. We beginnen met het openen. Hieronder volgt de code, met uitleg over de gebruikte commando's en functies.

   :OpenenMENU
   #
Laat de gebruiker een bestandsnaam kiezen om te open dmv. de @filedlg functie. Zet de bestandsnaam in de 
   # variabele "%%Bestandsnaam" zodat we deze later kunnen gebruiken om het bestand weer op te slaan.
    %%Bestandsnaam = @filedlg(*.txt,Kies een bestand om te openen)

   #
Kijk of er een bestandsnaam is opgegeven. Zo ja, open deze, zo nee, waarschuw de gebruiker. Dit is
   # hetzelfde als met de @ask() functie, als de variabele leeg is (doordat de gebruiker op Annuleren heeft
   # geklikt, wordt de code tussen else en end uitgevoerd, als de variabele een bestandsnaam
   # bevat, wordt de code tussen if en else uitgevoerd.
   if %%Bestandsnaam
      #
Maak een lijst waarin een bestand ingeladen kan worden.
      list
create,1
      #
Laad het bestand met het "list loadfile" commando in de list.
  
    list
loadfile,1,%%Bestandsnaam
      #
Geef de edit de inhoud van "list 1".
      dialog
set,TEKST,@text(1)
      #
Zorg dat de titel van het programma de naam van het bestand bevat door "dialog title" te gebruiken.
      dialog
title,Kladblok - @name(%%Bestandsnaam).txt
      #
Sluit tenslotte de list af, zodat deze weer opnieuw gebruikt kan gaan worden.
  
    list
close,1
   else
      #
Geef een bericht weer dat er geen bestand is geselecteerd.
      warn
Je hebt geen bestand geselecteerd.
   end
   goto
Evloop

In bovenstaande code staan een paar dingen die nog extra toegelicht moeten worden. Ten eerste zijn dat variabelen. Variabelen beginnen altijd met een procentteken. Als je VDS wat langer gebruikt, zul je zien dat sommige variabelen één procentteken hebben en andere twee. Dit ligt aan het soort variabele en heeft vooral te maken met API functies, waar we nu nog niet op ingaan. Variabelen met één procentteken kunnen maar één letter of cijfer erachter bevatten, terwijl variabelen met twee procenttekens een hele lap tekst als naam kunnen hebben. Je kunt variabelen een waarde geven door simpelweg %%Bestandsnaam = (waarde) te gebruiken. Om een variabele met een commando te gebruiken, moet je deze gewoon neer zetten waar je hem wilt hebben. VDS vult dan vanzelf de waarde van de variabele in zodra het bij de betreffende regel is met uitvoeren. Het maakt overigens niet uit of je variabelen met of zonder hoofdletters doet. Je kunt ze zelfs door elkaar gebruiken. Zo is hetzelfde %%Bestandsnaam als %%BestandsNaam en als %%BESTANDSNAAM.

Een tweede punt is het list commando. Een list (lijst) is eigenlijk gewoon een variabele die speciaal voor teksten gebruikt kan worden. De reden hiervoor is dat een list een tekst splitst op de regeleindes. Meer hierover later. Het enigste dat je nog wel moet weten hierover is dat het met VDS alleen mogelijk is om tekstbestanden te laden, op te slaan en af te drukken door middel van een list

Als de gebruiker een bestand heeft geopend, moet hij natuurlijk ook weer een nieuw bestand kunnen maken. Hiervoor hebben we immers het menu-item "Nieuw" gemaakt. Zodra iemand hierop klikt moeten we er voor zorgen dat de edit leeggemaakt wordt, dat de %%Bestandsnaam variabele weer leeg wordt en dat de titel van ons programma weer gewoon "Kladblok" wordt.

    :NieuwMENU
    #
Leeg de edit met het "dialog clear" commando.
    dialog
clear,TEKST
    #
Leeg de "bestandsnaam" variabel.
    %%Bestandsnaam =
    #
Zet de titel van het dialoog terug op "Kladblok".
    dialog
title,Kladblok
    goto
Evloop

Ik denk dat bovenstaande programmacode wel voor zich spreekt. Misschien is het je opgevallen dat ik namen van labels vaak van zowel hoofd als kleine letters voorzie. Hierbij is hetzelfde aan de hand als met variabelen, het maakt VDS dus niets uit of je nu hoofd of kleine letters gebruikt. Persoonlijk zou ik altijd netjes de naam van het element (Nieuw in dit geval) als 'zinsbegin' met één hoofdletter en de rest kleine letters typen, en de naam van het soort event (MENU) als hoofdletters. Commando's en functies typ ik altijd met kleine letters, aangezien het dan wat begrijpelijker en 'rustiger' oogt voor andere mensen die er nog gebruik van moeten maken.

Nu we bestanden kunnen openen en een nieuw bestand kunnen aanmaken, is het tijd om te zorgen dat we ook kunnen opslaan. Opslaan is eigenlijk gewoon een soort van omgedraaide versie van openen, dus we kunnen gelijk beginnen:

    :OpslaanMENU
    #
Als %%Bestandsnaam leeg is, betekent dat dat het bestand nog nooit is opgeslagen of
    # geopend. Stuur de gebruiker daarom door naar "Opslaan Als", zodat er een bestandsnaam opgegeven moet worden.

    if @not(
%%Bestandsnaam)
       goto
Opslaan AlsMENU
    end

    #
Maak een list.
    list
create,1
    #
"Assign" (draag over) de inhoud van de edit aan de list.
    list
assign,1,@dlgtext(TEKST)
    #
Sla de list op.
    list
savefile,1,%%Bestandsnaam
    #
Sluit de list weer netjes af.
    list
close,1
    #
In het geval een bestand onder een andere bestandsnaam is opgeslagen, moet de titel
    # van het venster netjes mee veranderen.

    dialog
title,Kladblok - @name(%%Bestandsnaam).txt
    goto
Evloop

Het meeste hierboven zal wel te volgen zijn. Indien je niet precies weet wat een bepaald commando of een bepaalde functie doet, kun je gewoon de cursor halverwege het woord zetten en weer op Ctrl+F1 drukken voor de helpfunctie. Daar staat precies uitgelegd wat er gebeurd en welke parameters nodig zijn.

    :Opslaan AlsMENU
    #
Laat de gebruiker een bestandsnaam uitkiezen.
    %%Bestandsnaam = @filedlg(*.txt,,,SAVE)
    #
Als er geen bestandsnaam is opgegeven, ga dan terug naar de "Event loop".
    if @not(
%%Bestandsnaam)
      goto
Evloop
    end
    #
Ga naar "OpslaanMENU", zodat het bestand opgeslagen kan worden.
    goto
OpslaanMENU

De @filedlg() functie is eigenlijk een afkorting voor "file dialog", wat wil zeggen dat het een dialoog voor bestanden maakt. Als je de helpfunctie bekijkt, zie je dat de eerste parameter op moet geven om wat voor soort bestanden het gaat. Met de tweede en derde parameter kun je respectievelijk de titel van het dialoog en een voorlopige bestandsnaam opgeven, iets dat we beide nu niet nodig hebben. De vierde parameter daarentegen, kun je gebruiken om te zorgen dat het een speciaal dialoog wordt om bestanden op te slaan (met SAVE), of om te zorgen dat je meerdere bestanden kunt selecteren als je iets wilt openen (met de MULTI parameter).

Bestanden uitprinten

Zoals beloofd zou er ook nog een functie in het programma komen om de tekst te kunnen afdrukken. Hiervoor gebruiken we het list print commando.

    :AfdrukkenMENU
    #
Maak een list.
    list
create,1
    #
Voeg de inhoud van de edit toe.
    list
assign,1,@dlgtext(TEKST)
    #
Print de tekst van "list 1" als Verdana, grootte 10.
    list
print,1,Verdana,10
    #
En sluit de list weer.
    list
close,1
    goto
Evloop

Bovenstaande code behoeft verder denk ik geen uitleg, dus dat zal ik dan ook niet doen. Ik geef nog wel even wat tips om te zorgen dat het programma er nét even iets professioneler uit ziet en hoe je het kunt compileren naar een .exe bestand. Ten eerste kun je de titel van info en warn popups veranderen met het title commando. Dit title commando is net even anders als het dialog title commando, wat enkel de titel van een 'echt' dialoog gemaakt met de Dialog Editor veranderd. Je zou dus dit bovenaan je programma kunnen zetten:

    title Kladblok

Natuurlijk wil je wel je programma kunnen versturen naar andere mensen, zodat ook zij het kunnen gebruiken. Hiervoor moet je onderaan in de VDS IDE klikken op het tabblad "Project Manager". Daar zul je een edit zien staan met als naam "Target:". Hier kun je opgeven waar je programma moet komen te staan. Met de "Icon:" edit kun je het icoontje van je programma veranderen. Als je dan op F12 drukt, of via "File" en dan "Compile Project" kiest, wordt je programmacode omgezet in een .exe bestand dat je zonder VDS kunt openen. Let wel even op dat als je het .exe bestand naar mensen stuurt die geen VDS hebben, je ook de "vdsrun50.dll" moet meesturen, welke standaard in je "Visual Dialogscript\redist" map staat (of even zoeken met de zoekfunctie van Windows).

Het resultaat

Hieronder staat voor het overzicht nog een keer alle code welke in deze tutorial is behandeld. Regel voor regel staat uitgelegd wat het precies doet, dus als je snel even iets wilt weten hoef je niet gelijk deze hele tutorial weer door te lezen. Ik hoop dat alles een beetje duidelijk was, maar ik ga er wel van uit dat dit makkelijk door te lezen was. VDS leer je namelijk niet, je doet het gewoon!

Sjoerd van der Hoorn

 

 

    title Kladblok

    # Maak het hoofd scherm.
    DIALOG CREATE,Kladblok,-1,0,300,250,RESIZABLE,SAVEPOS
    # Voeg een "STYLE" toe welke gebruikt kan worden om bijvoorbeeld het lettertype van elementen
    # te veranderen.
    DIALOG
ADD,STYLE,STIJL1,Verdana,10
    # Voeg het "Bestand" menu toe.
    DIALOG
ADD,MENU,Bestand,Nieuw,Openen,Opslaan,Opslaan Als,-,Afdrukken,-,Afsluiten
    # En ten slotte een editvak om de tekst in te openen en te bewerken.
    DIALOG
ADD,EDIT,TEKST,0,0,300,250,,,MULTI,TABS,SCROLL,STIJL1
    # Met de volgende regel laat je het dialog zien.
    DIALOG
SHOW

    :Evloop
   
# Wacht tot er een event (gebeurtenis) is. Ga, zodra deze er is, naar het bijbehorende
    # label.
    wait
event
    goto @event()

    :NieuwMENU
    #
Leeg de edit met het "dialog clear" commando.
    dialog
clear,TEKST
    #
Leeg de "bestandsnaam" variabel.
    %%Bestandsnaam =
    #
Zet de titel van het dialoog terug op "Kladblok".
    dialog
title,Kladblok
    goto
Evloop

    :OpenenMENU
    #
Laat de gebruiker een bestandsnaam kiezen om te open dmv. de @filedlg functie. Zet de bestandsnaam in de
    # variabele "%%Bestandsnaam" zodat we deze later kunnen gebruiken om het bestand weer op te slaan.
 
   %%Bestandsnaam = @filedlg(*.txt,Kies een bestand om te openen)

    #
Kijk of er een bestandsnaam is opgegeven. Zo ja, open deze, zo nee, waarschuw de gebruiker. Dit is
    # hetzelfde als met de @ask() functie, als de variabele leeg is (doordat de gebruiker op Annuleren heeft
    # geklikt, wordt de code tussen else en end uitgevoerd, als de variabele een bestandsnaam
    # bevat, wordt de code tussen if en else uitgevoerd.
    if %%Bestandsnaam
      #
Maak een lijst waarin een bestand ingeladen kan worden.
      list
create,1
      #
Laad het bestand met het "list loadfile" commando in de list.
  
   list
loadfile,1,%%Bestandsnaam
      #
Geef de edit de inhoud van "list 1".
      dialog
set,TEKST,@text(1)
      #
Zorg dat de titel van het programma de naam van het bestand bevat door "dialog title" te gebruiken.
      dialog
title,Kladblok - @name(%%Bestandsnaam).txt
      #
Sluit tenslotte de list af, zodat deze weer opnieuw gebruikt kan gaan worden.
  
   list
close,1
    else
      #
Geef een bericht weer dat er geen bestand is geselecteerd.
      warn
Je hebt geen bestand geselecteerd.
    end
    goto
Evloop

    :OpslaanMENU
    #
Als %%Bestandsnaam leeg is, betekent dat dat het bestand nog nooit is opgeslagen of
    # geopend. Stuur de gebruiker daarom door naar "Opslaan Als", zodat er een bestandsnaam opgegeven moet worden.

    if @not(
%%Bestandsnaam)
      goto
Opslaan AlsMENU
    end

    #
Maak een list.
 
   list
create,1
    #
"Assign" (draag over) de inhoud van de edit aan de list.
    list
assign,1,@dlgtext(TEKST)
    #
Sla de list op.
    list
savefile,1,%%Bestandsnaam
    #
Sluit de list weer netjes af.
    list
close,1
    #
In het geval een bestand onder een andere bestandsnaam is opgeslagen, moet de titel
    # van het venster netjes mee veranderen.

    dialog
title,Kladblok - @name(%%Bestandsnaam).txt
    goto
Evloop

    :Opslaan AlsMENU
    #
Laat de gebruiker een bestandsnaam uitkiezen.
    %%Bestandsnaam = @filedlg(*.txt,,,SAVE)
    #
Als er geen bestandsnaam is opgegeven, ga dan terug naar de "Event loop".
    if @not(
%%Bestandsnaam)
      goto
Evloop
    end
    #
Ga naar "OpslaanMENU", zodat het bestand opgeslagen kan worden.
    goto
OpslaanMENU

    :AfdrukkenMENU
    #
Maak een list.
 
   list
create,1
    #
Voeg de inhoud van de edit toe.
 
   list
assign,1,@dlgtext(TEKST)
    #
Print de tekst van "list 1" als Verdana, grootte 10.
    list
print,1,Verdana,10
    #
En sluit de list weer.
    list
close,1
    goto
Evloop

    :AfsluitenMENU
    #
Als iemand voor afsluiten kiest, is dit hetzelfde als het klikken op het kruisje van het scherm. Daarom
    # sturen we dit event door naar :Close.

    goto
Close

    :Resize
    # Als het scherm van formaat wordt veranderd, moet het editvak natuurlijk meeveranderen. Daarom gebruiken
    # we het "dialog setpos" commando, met als "width" en "height" parameters de breedte en hoogte van het
    # programma zelf. Dit kan gedaan worden door "@dlgpos()" te gebruiken zonder een naam voor het element op
   
# te geven. De tweede parameter moet aangeven wat we willen ontvangen, "w" voor "width" en "h" voor "height".

    dialog
setpos,TEKST,0,0,@dlgpos(,W),@dlgpos(,H)
    goto
Evloop

    :Close
    #
Indien de gebruiker bij een "@ask()" bericht op ja klikt, is "if" waar, als de gebruiker op nee klikt,
    # is "if" uiteraard onwaar en zal de code bij "else" uitgevoerd worden.

    if @ask(
Weet je zeker dat je dit wilt afsluiten?)
      # Stop
het programma.
      stop
    else
      #
Ga terug naar de "Event Loop".
      goto
Evloop
    end

 

Links:

- programmeer.pagina.nl
- VDSWORLD
- VDSWORLD Forum