GENEAAL - Plugin compiler versie 9.0
1 / 58
Inhoudsopgave Plugins voor GENEAAL .................................................................................................................................................... 3 Wat is een plugin? ...................................................................................................................................................... 4 Plugin, variabelen ....................................................................................................................................................... 5 Expressies en voorwaarden ........................................................................................................................................ 8 Opdrachten, functies ................................................................................................................................................. 10 Het gebruik van plugins............................................................................................................................................. 13 Syntaxdiagrammen van de plugintaal PIPL .................................................................................................................... 14 Wat is een syntaxdiagram? ....................................................................................................................................... 15 Namen, getallen, tekenrijen en variabelen ................................................................................................................ 17 Expressies en voorwaarden ...................................................................................................................................... 19 Declaraties en specificaties ...................................................................................................................................... 22 Opdrachten en plugin-programma ............................................................................................................................ 25 Standaardfuncties ........................................................................................................................................................... 28 Databasefuncties ...................................................................................................................................................... 29 Functies voor in- en uitvoer ....................................................................................................................................... 42 Algemene functies .................................................................................................................................................... 46 Het gebruik van de Plugin Compiler ................................................................................................................................ 49 Overzicht van het maken van een plugin .................................................................................................................. 50 Plugintekst aanmaken en bewerken ......................................................................................................................... 52 Plugintekst compileren en testen .............................................................................................................................. 56
2 / 58
Plugins voor GENEAAL Inhoud Wat is een plugin? Plugin, variabelen Expressies en voorwaarden Opdrachten, functies Het gebruik van plugins
3 / 58
Wat is een plugin? Omschrijving GENEAAL is een programma dat de genealoog ondersteunt bij zijn werkzaamheden. Hij kan de genealogische gegevens over personen en relaties tussen de personen opslaan en bewerken. Er bestaat een groot aantal mogelijkheden voor het genereren van genealogische rapporten en uitvoer. Bekend zijn uiteraard de genealogie, het parenteel, de stamreeksen en de kwartierstaat. Daarnaast kan ook een z.g. uitgebreide genealogie worden gemaakt. Uitvoer kan een document (standaard MS-Word, of RTF), een webpagina, een schema of een CSV-bestand zijn. Toch kan het voorkomen dat de gebruiker een ander soort document of uitvoer wil maken dan er standaard in Geneaal is voorzien. Om dit te kunnen realiseren moet de gebruiker zelf een programma maken dat de gewenste uitvoer genereert. Zo'n, programma kan door Geneaal worden uitgevoerd en heet een plugin. Het is als het ware een kleine toepassing die in Geneaal wordt "geplugd" en door Geneaal wordt uitgevoerd. Het maken van een dergelijke plugin bestaat uit het programmeren in een eenvoudige programmeertaal, genaamd PIPL (PlugIn Programming Language). Iedereen die programmeerervaring heeft, zal dit gemakkelijk leren. Het is een taal die lijkt op zeer eenvoudig Pascal. Iemand die geen programmeerervaring heeft, kan de taal snel aanleren door zijn eenvoud. De gang van zaken bij het maken van een plugin is als volgt:
programmeer de plugin. Dit kan met behulp van elke teksteditor. Met het programma Plugin Compiler kan ook de programmatekst worden aangemaakt in de taal PIPL. De Compiler herkent de taalwoorden en geeft deze in een speciale kleur weer, wat de leesbaarheid zeer bevordert.
Nadat de plugin-tekst is ingevoerd moet deze worden opgeslagen. Dit wordt gedaan in een bestand met de extensie .TPI. "TPI" staat voor tekst plugin.
Nu kan de plugin worden gecompileerd. Dit betekent dat de programmatekst wordt gecontroleerd op fouten, en bij afwezigheid van fouten wordt omgezet in een vorm die GENEAAL kan uitvoeren. Dit levert een bestand op als Plugin.GPI. De extensie GPI staat voor Geneaal-plugin. Om de plugin te gebruiken of te testen wordt GENEAAL gestart. Men kiest menu Extra, en daarna Plugins. Hier verschijnen alle plugins, waarna er één kan worden gekozen en uitgevoerd.
4 / 58
Plugin, variabelen wat is een programma? opbouw van een plugin variabelen
voorbeeld
Wat is een programma? Een programma in het algemeen bestaat uit een aantal opdrachten die een computer moet uitvoeren. Deze opdrachten moet de computer kunnen begrijpen om ze uit te voeren. Een taal die een computer kan uitvoeren is van een zeer eenvoudige structuur, b.v. een serie getallen die voor de computer een betekenis hebben als opdrachten. Voor de mens zijn deze reeksen getallen allesbehalve goed leesbaar. Daarom wordt een programma in een bepaalde programmeertaal geschreven, die de mens goed kan begrijpen en doorzien, maar die nog ongeschikt is om door de computer te laten uitvoeren. Zo'n programma geschreven in een programmeertaal moet eerst door een z.g. compiler (vertaler) worden vertaald (gecompileerd) naar een versie die door de computer kan worden uitgevoerd. Een programma zal in het algemeen bewerkingen/opdrachten uitvoeren op z.g. data, of informatie. Het programma bewerkt de data en produceert meestal weer andere data die wordt uitgevoerd. Daarom bestaat een computerprogramma uit twee delen: de data (of informatie) en de opdrachten die werken op die data. Een plugin-programma is ook een computerprogramma. Het is in die zin een bijzonder programma dat het niet rechtstreeks door een computer wordt uitgevoerd, maar door Geneaal, dat zelf ook een computerprogramma is. (In het vervolg zal, in plaats van "plugin-programma" over "Plugin"worden gesproken.) Voordat een plugin kan worden uitgevoerd door Geneaal, moet het ook eerst worden gecompileerd. Hiervoor is het programma Plugin Compiler beschikbaar.
Opbouw van een plugin
Een plugin wordt geschreven in de programmeertaal PIPL (Plugin Programming Language). Net als elke taal, bevat PIPL ook woorden. Dit kunnen woorden zijn die zijn gereserveerd voor het schrijven van een programma, of woorden die de programmeur zelf mag verzinnen. Een voorbeeld van het allereenvoudigste plugin-programma is: plugin programma1 description 'Eenvoudigste programma, dat niets doet...' main {dit programma heeft geen opdrachten} endmain In dit programma zijn enkele woorden vet geschreven. Dat zijn z.g. gereserveerde woorden, die tot PIPL behoren: plugin description
main, endmain
Hiermee start een plugin-programma. Achter plugin komt een naam, de titel van de plugin. Deze titel mag geen spatie of leesteken bevatten. Bovenstaande plugin heet dus: programma1. Het woord description gaat vooraf een een tekst die de beschrijving van de functie van de plugin geeft. Deze beschrijving mag alle tekens bevatten. Ze moet tussen twee bovenkomma's worden geplaatst. Opm. Zo'n tekst tussen bovenkomma's heet een tekenrij of (in het engels) string. Tussen de woorden main en endmain moeten de opdrachten worden geplaatst die worden uitgevoerd. In dit programma zijn er dus geen opdrachten: het programma doet dan ook niets. Het enige wat er wel staat tussen main en endmain is een zin tussen accolades: alles wat tussen accolades staat wordt door de Plugin Compiler beschouwd als commentaar , ofwel als iets dat niet tot het programma behoort. Commentaar is een hulpmiddel om de lezer van het programma de werking van het programma te verduidelijken.
Opmerking: Het programma is weergegeven met behulp van een aantal kleuren. Dit komt de leesbaarheid ten goede. Deze kleuren worden ook gebruikt door de Plugin Compiler. Gebruikte kleuren zijn: zwart gereserveerde woorden en tekens van PIPL blauwgroen namen en andere woorden rood tekenrij groen getallen blauw commentaar PIPL heeft een aantal ingebouwde opdrachten. Deze kunnen worden gebruikt, zonder dat ze behoeven te worden 5 / 58
geprogrammeerd. Zulke opdrachten heten ook wel standaardfuncties. Eén van de standaardfuncties is de functie om een tekst te laten weer te geven door Geneaal: de functie melding Naam melding
Parameter(s) titel, tekenrij
Werking In een schermpje, met titel, wordt de tekenrij weergegeven. Voorbeeld: melding('Informatie', 'Hallo iedereen!')
We kunnen programma1 aanvullen met deze opdracht: plugin programma2 description 'Eenvoudig programma, dat iets meldt...' main {dit programma laat een scherm zien...} melding('Informatie', 'Hallo iedereen!'); endmain Wanneer dit programma wordt gecompileerd (zie compileren) en daarna wordt uitgevoerd door Geneaal, dan laat Geneaal zien:
N.B. Een compiler begrijpt alleen programma's die voldoen aan de definitie van de programmeertaal. Zo'n definitie is altijd zeer precies, en niet zoals b.v. een spreektaal, die veel vrijer kan worden gebruikt. Een compiler kan een programma afkeuren om de minste afwijking, b.v. een punt teveel, of te weinig. De definitie van PIPL wordt gegeven met behulp van goed toegankelijke syntaxdiagrammen. Zie hiervoor het hoofdstuk Syntaxdiagrammen van de plugintaal PIPL. In het vervolg zal bij ieder voorbeeld van een PIPL-taalelement een verwijzing worden gegeven naar een syntaxdiagram dat dit element beschrijft. Deze verwijzingen zullen in blauw worden gegeven. Beschrijving plugin
Variabelen
Alleen opdrachten zijn niet voldoende om een programma te maken dat een realistisch resultaat moet geven. Wanneer er bijvoorbeeld een programma gemaakt moet worden dat de eerste 100 getallen optelt, dan hebben is er tenminste een getal nodig dat aangeeft welk getal nu moet worden opgeteld en een getal dat de som weergeeft. Dergelijke getallen worden variabelen genoemd. Variabelen kunnen dus getallen weergeven, maar ook tekenrijen. Dat betekent dat ze van het type getal (engels number) of van het type tekenreeks (engels string) zijn. Elke variabele heeft een naam (engels: identifier) en een type. In PIPL kan men variabelen bekend maken (ofwel declareren) die men in het programma wil gebruiken. Een voorbeeld van een declaratie van variabelen is: globalvars Getal: number; Som: number; Het "kopje" globalvars geeft aan dat er een declaratiegedeelte volgt. Een declaratie bestaat uit de naam van de variabele, gevolgd door een ":" en een aanduiding voor het type van de variabele. In het voorbeeld zijn beide variabelen, Getal en Som van het type number (een getal dus). N.B. elke declaratie wordt gevolgd door een ";". Een kortere schrijfwijze is: globalvars Getal, Som: number;
6 / 58
Er zijn dus twee basistypen voor variabelen in PIPL: getal en tekenreeks, voorgesteld door number en string. N.B. Getallen kunnen gehele getallen zijn of gebroken getallen. In PIPL worden beide types gevangen onder het basistype number. Voorbeeld van een geheel getal: 1234. Voorbeeld van een gebroken getal: 10,25. N.B.2 Gebroken getallen kunnen niet zondermeer worden gebruikt in een programmatekst. Voor het weergeven van een gebroken getal moet worden gebruik gemaakt van een formule: 10,25 wordt ingevoerd als: 10 + 25/100. Omdat er ook vaak met lijsten getallen en lijsten tekenrijen wordt gewerkt bestaan er ook de typen getallenlijst en tekenrijenlijst. Een lijst is eigenlijk een rij die genummerd wordt vanaf 1 tot en met de laatste. De termen getallenlijst en tekenrijenlijst heten in PIPL resp. numberlist en stringlist. Om dergelijke lijsten te gebruiken moet er in de declaratie aangegeven worden hoe lang de lijsten maximaal zijn. De lengte wordt aangegeven door een geheel getal tussen "[" en "]". Voorbeeld: globalvars Leeftijden: numberlist[10]; {Leeftijden kan 10 getallen bevatten} Namen: stringlist[25]; {Namen bevat maximaal 25 tekenrijen} Lijsten hebben genummerde elementen. De nummering begint bij 1, en eindigt bij het maximum, zoals dat aangegeven wordt in de declaratie. In bovenstaande voorbeeld heeft Leeftijden elementen (getallen) met de nummers 1 t/m 10. Beschrijving declaratie, variabelen, globale variabelen
7 / 58
Expressies en voorwaarden expressies van type getal expressies van type tekenrij voorwaarden
voorbeeld
Expressies van het type getal In de toekenningsopdracht kan een variabele een waarde krijgen. Veelal zal een enkele waarde niet voldoende zijn, maar zal een z.g. expressie moeten worden gebruikt om "iets" uit te rekenen. Voorbeeld: Getal * 1/100 Hier wordt 1 % van Getal berekend. Het is een voorbeeld van een expressie. In een expressie van het type number (numerieke expressies) kunnen meer z.g. operatoren voorkomen dan de "*" (vermenigvuldiging). Operatoren in een numerieke expressie: + * / %
Optelling Aftrekking; of unaire min Vermenigvuldiging Deling met resultaat een gebroken getal Deling van gehele getallen, met als resultaat een geheel getal
N.B. Operatoren worden in een bepaalde volgorde uitgevoerd in een expressie: eerst *, / of %, daarna + en -. Behalve operatoren, variabelen en getallen kunnen in numerieke expressies ook haakjes voorkomen: "(" en ")". Zij dienen om de volgorde van verwerking van de operatoren te wijzigen. Voorbeeld: (Getal - 100) / 200 Eerst wordt van de waarde van Getal 100 afgetrokken en dit resultaat wordt gedeeld door 200. Beschrijving numerieke expressie
Expressies van het type tekenrij Niet alleen met getallen of variabelen van het type number kunnen expressies worden gemaakt, ook met tekenrijen en variabelen van het type string kunnen expressies worden opgebouwd: Voorbeeld: 'Naam:' ++ Totalenaam Hier wordt de tekenrij "Naam:" gekoppeld met de inhoud van string-variabele Totalenaam. Dit is een expressie van het type string (tekerijexpressie). In een tekerijexpressie kan maar één operator voorkomen alleen de koppel-operator (++). Beschrijving tekenrijexpressie
Voorwaarden
In een voorwaarde worden variabelen en expressies met andere vergeleken. Vaak komt voor dat getest moet worden of een variabele een bepaalde waarde heeft. Voorbeeld: Teller > 100 In dit voorbeeld wordt getest of de waarde van de variabele Teller groter is dan 100. Is dat zo dan is de waarde van de voorwaarde waar, anders levert de voorwaarde onwaar op. Er is een aantal vergelijkingsoperatoren waarmee voorwaarden kunnen worden gemaakt:
8 / 58
= <> > < >= <=
Is gelijk Is ongelijk Is groter dan Is kleiner dan Is groter of gelijk Is kleiner of gelijk
bruikbaar voor number en string bruikbaar voor number en string bruikbaar voor number en string bruikbaar voor number en string bruikbaar voor number en string bruikbaar voor number en string
N.B. Een string a is groter dan string b wanneer a lexicografisch gezien ná b komt. Dus 'Wat' is groter dan 'Aap'. Evenzo geldt: een string a is kleiner dan string b wanneer a lexicografisch gezien vóór b komt. Voorbeeld: 'garage' is kleiner dan 'schuur'. Verder geldt dat hoofdletters voor kleine letters komen. Naast deze eenvoudige voorwaarden kunnen ook voorwaarden worden gecombineerd met behulp van de operatoren and, or en not (in het nederlands: en, of en niet). In de volgende tabel wordt duidelijk hoe deze operatoren werken. In de tabel staat r1 en r2 voor een voorwaarde, zoals hiervoor omschreven.
Operator
Gebruik
Verklaring
and or not
r1 and r2 r1 or r2 not r1
is waar alleen als én r1 én r2 waar zijn is waar wanneer óf r1 óf r2 waar is is waar wanneer r1 niet waar is
Voorbeelden: Wanneer getest moet worden of de waarde van Getal tussen 100 en 199 ligt, noteert men dat als: (rechtstreeks testen of Getal binnen de grenzen ligt) Getal >= 100 and Getal <= 199 of als:
(hier wordt getest of Getal niet buiten de grenzen ligt. Let ook op het gebruik van de haakjes!)
not (Getal < 100 or Getal > 199)
Beschrijving voorwaarden
9 / 58
Opdrachten, functies Soorten opdrachten Functies Standaardfuncties
Soorten opdrachten
Zoals elke programmeertaal kent ook PIPL diverse soorten opdrachten. Hieronder een overzicht. toekenningsopdracht (engels: assignment statement)
met een toekenningsopdracht kan een variabele een waarde worden gegeven. Voorbeeld: Getal := 1024; N.B. ":=" betekent: "wordt gelijk aan". Beschrijving toekenningsopdracht
als-dan-anders-opdracht (engels: if-then-else statement)
Met deze opdracht kan een voorwaarde worden getest of die waar is. Wanneer dit het geval is wordt het then-gedeelte uitgevoerd; anders (indien aanwezig) het else-gedeelte. Voorbeeld: if Getal = 1000 then Naam := 'kilo' else Naam := 'mega'; N.B. Het symbool "=" is duidelijk anders dan in de toekenningsopdracht gebruikt ":="-symbool. De enkele "=" vergelijkt twee grootheden ("is gelijk aan?"); en het symbool ":=" betekent "wordt gelijk aan". N.B.2 De opdracht achter then mag elke soort opdracht, behalve weer een als-dan-opdracht zijn; en achter else mag elke soort opdracht geplaatst worden. N.B.3 Het else-gedeelte mag worden weggelaten. Beschrijving als-dan-opdracht
samengestelde opdracht (engels: compound statement)
tussen de gereserveerde woorden begin en end worden een aantal opdrachten gezet, die dan als één geheel worden beschouwd. Een dergelijke samenstelling is goed te gebruiken in een als-dan-opdracht. Voorbeeld: begin Getal := 789; Naam := '
'; end; Beschrijving samengestelde opdracht
lusopdracht (engels: loop statement)
de tussen de gereserveerde woorden loop en endloop geplaatste opdrachten worden herhaald uitgevoerd: bij endloop wordt weer naar de eerste opdracht achter loop- gesprongen. De herhaling wordt gestopt wanneer aan de voorwaarde van een stop-als-opdracht wordt voldaan. Voorbeeld: loop Getal := Getal + 2; stopif Getal > 100; endloop; Beschrijving lusopdracht
10 / 58
stop-als-opdracht (engels: stopif statement)
deze opdracht kan alleen voorkomen in een herhaalopdracht. Wanneer aan de voorwaarde achter stopif wordt voldaan, wordt de herhaalopdracht afgebroken, en verder gegaan met de opdracht na de herhaalopdracht. Voorbeeld: stopif Naam = 'Piet'; Beschrijving stop-als-opdracht
resultaatopdracht
deze opdracht kan alleen voorkomen in een functie. Achter het gereserveerde woord result komt een expressie. De functie krijgt hiermee een waarde. Zie Functies. Voorbeeld: result Getal - 2; Beschrijving resultaatopdracht
N.B. Elke opdracht wordt dus afgesloten door een puntkomma (";").
Functies Het komt bij het programmeren van een plugin voor dat een aantal opdrachten telkens weer voorkomen. In zo'n geval is het handig om een dergelijk stukje code een naam te kunnen geven en met behulp van die naam het stukje telkens weer te kunnen gebruiken. Een dergelijk stukje code met een naam heet een functie. Een functie heeft dus een naam en een bevat een aantal opdrachten. Een voorbeeld is b.v. het geven van een bericht aan de gebruiker: function Bericht beginfunc Aantal := Aantal + 1; Melding('Bericht aan de gebruiker'); endfunc Deze functie telt het aantal berichten in de variabele Aantal (die als globale variabele elders in het programma is gedeclareerd) en geeft via de standaardfunctie Melding een bericht in een klein scherm. Telkens wanneer in het hoofdproramma een bericht moet worden gezonden, wordt de functie aangeroepen: Bericht; De functie zou nog beter bruikbaar zijn, wanneer van vanuit de functie-aanroep kon worden meegegeven wat het bericht is dat moet worden weergegeven aan de gebruiker. Dit kan met behulp van parameters: function Bericht(B:string) beginfunc Aantal := Aantal + 1; Melding(B); endfunc De functie Bericht is nu voorzien van een parameter B, die van het type string is. In de opdracht Melding staat nu dat het bericht B moet worden weergegeven in plaats van het 'constante' bericht 'Bericht aan de gebruiker'. De functie kan worden aangeroepen door: Bericht('Start'); en b.v. Bericht('Klaar'); Het zou ook wel eens gemakkelijk zijn dat een functie een waarde kan doorgeven. Wanneer er een functie nodig is om de getallen van 1 t/m n op te tellen, dan kan de functie de waarde van de som aan het programma doorgeven. De kop van de functie is dan: function Som(n: number): number Hierin is n de parameter die aangeeft tot hoeveel moet worden opgeteld vanaf 1. Aan het einde van de kop staat een aanduiding voor het type van het resultaat van de functie: number. Een functie kan een getal of een tekenrij als resultaat hebben. 11 / 58
Om een rij getallen op te kunnen tellen hebben we een variabele nodig die het op te tellen getal aangeeft en een variabele die de opgebouwde som voorstelt. Deze variabelen kunnen onder globalvars worden gedeclareerd, maar omdat deze alleen binnen de functie nodig zijn, kunnen ze ook bij de functie worden gedeclareerd onder localvars. De variabelen die onder localvars worden bekend gemaakt, zijn elders in het programma niet bekend. De functie ziet er als volgt uit: (N.B. alles wat tussen accolades staat is commentaar ter verduidelijking) function Som(n: number): number localvars i: number; s: number; beginfunc i := 1; {getalteller, begint bij 1 en moet lopen tot n} s := 0; {lopende som, initieel dus 0} loop stopif i > n; {de lusopdracht stoppen, wanneer i groter is dan n} s := s + i; {tel i op bij de lopende som} endloop; result s; {geef de functie als resultaat de lopende som in s} endfunc De functie kan worden aangeroepen met bijvoorbeeld: Gemiddelde := Som(12) / 12; Hier wordt het gemiddelde van 1 t/m 12 berekend. Hierboven is het concept van parameters weergegeven. Er is een aantal vormen van parameters mogelijk. In de functiekop: function Som(n: number): number is de parameter n van het type number. Dit betekent dat bij de aanroep de parameter n de waarde krijgt van de overeenkomste expressie in de aanroep. In feite lijkt n net een locale variabele onder localvars met dien verstande dat de parameter een beginwaarde krijgt bij de aanroep. Het is ook mogelijk om een parameter een soort doorgeefluik naar een globale variabele te laten zijn: function A(Par: numbervar): number beginfunc Par := Par + 1; endfunc De parameter Par is nu gespecificeerd als zijnde van het type numbervar i.p.v number. Wanneer B en C globale variabelen zijn van het type number dan is het effect van de aanroep: A(B); dat de globale variabele B met 1 wordt opgehoogd! Evenzo, bij de aanroep: A(C); wordt de globale variabele C met 1 opgehoogd. Ook de parametrs van het type numberlist en stringlist worden zo behandeld. dus: bij numbervar, stringvar, numberlist en stringlist wordt bij de aanroep niet de waarde van de meegegeven expressie doorgegeven aan de functie, maar het naam van de globale variabele. Beschrijving functiekop, locale variabelen, functiedeclaratie, formele parameters
Standaardfuncties In de Plugin Compiler is een aantal functies ingebouwd, die de gebruiker niet zelf hoeft te definiéren. Deze functies hebben betrekking op een aantal gebieden:
gegevens over personen, relaties en plaatsen uit de genealogiedatabase halen; uitvoer schrijven en invoer van de gebruiker lezen; nuttige functies m.b.t. tekenrijen, bestandsnamen, conversie van getallen naar tekst e.d.
Al deze functies worden besproken in het hoofdstuk Standaardfuncties.
12 / 58
Het gebruik van plugins Hoe worden plugins opgeslagen? Een plugin bestaat in twee versies: • Een leesbare tekstversie, deze wordt opgeslagen als bestand met de extensie .tpi. Deze versie wordt m.b.v. de Plugin Compiler aangemaakt en bewerkt. • Een uitvoerbare versie, die de opdrachtcodes bevat die GENEAAL kan uitvoeren: een bestand met de extensie: .gpi. Deze versie wordt aangemaakt door de Plugin Compiler, na het controleren van de leesbare versie op fouten.
Waar worden plugins opgeslagen? Iedere gebruiker van GENEAAL kan zijn eigen set van plugins hebben. De plugins worden standaard opgeslagen in de map C:\Documents and Settings\\Application Data\GENEAAL\ (voor Windows XP). Voor Windows Vista, 7 en 8 is de map: C:\Users\\AppData\Roaming\Geneaal. Men overigens wel plugin-teksten elders opslaan, maar de .gpi-bestanden moeten altijd in de genoemde map worden bewaard, anders kan GENEAAL ze niet vinden. Overigens hoeft men genoemde opslagmap normaliter niet te onthouden, zij wordt automatisch door de Plugin Compiler gekozen.
13 / 58
Syntaxdiagrammen van de plugintaal PIPL Inhoud Wat is syntaxdiagram? Namen, getallen, tekenrijen en variabelen Expressies en voorwaarden Declaraties en specificaties Opdrachten en plgin-programma
14 / 58
Wat is een syntaxdiagram? Wat is een syntaxdiagram? Elke (programmeer)taal heeft een aantal regels die beschrijven hoe de taal is opgebouwd, en waarmee men kan bepalen welke zinnen tot deze taal behoren. Zulke regels kan men natuurlijk met gewoon Nederlands weergeven, maar het blijkt erg moeilijk om met het Nederlands zeer precies de regels te formuleren. Daarom gebruikt men vaak wiskundige formules, die niet voor tweeërlei uitleg vatbaar zijn. Het is ook mogelijk om de regels niet met een formule weer te geven, maar schematisch, met een diagram. Zulk een diagram is voor iedereen gemakkelijk te begrijpen en te gebruiken. In een syntaxdiagram maak men gebruik van twee soorten "eenheden" (weergegeven met "blokjes") en van verbindingen tussen die eenheden. Verder heeft elke diagram een beginpunt en een eindpunt. De twee soorten eenheden zijn:
elementaire eenheden: deze bestaan in het algemeen uit de symbolen/woorden die met het toetsenbord kunnen worden gemaakt, b.v. plugin Zulke eenheden worden in een syntaxdiagram weergegeven met: De "waarde" staat in het blokje vermeld.
gedefinieerde eenheden: dit is een blokje met daarin de naam van een ander syntaxdiagram, weergegeven met: De naam in het blokje verwijst naar de naam van het elders gedefinieerde diagram.
De verbindingen hebben de vorm van een pijl. De pijlrichting geeft aan op welke wijze men "door het diagram mag lopen". De pijlen gaan van een eenheid naar een eenheid of naar een eindpunt. Pijlen zien er als volgt uit: Men begint altijd bij het beginpunt van een diagram, dat altijd links is geplaatst. Het eindpunt staat altijd rechts. Een begin- of eindpunt wordt getekend als: Een syntaxdiagram zou men kunnen vergelijken met een "rangeerterrein": de trein begint links en kan al dan niet via afslaande wissels het eindpunt, rechts, bereiken:
naam
Bovenstaand diagram geeft weer hoe een naam kan worden verkregen. Men begint bij het beginpunt (links), moet dan naar rechts voorbij de elementaire eenheid "een letter", in de richting van de pijl, vervolgens naar de volgende elementaire eenheid, Daarna heeft men de keus: direct naar het eindpunt (rechts), óf terug naar de elementaire eenheid "letter, cijfer of _", en later naar het eindpunt. Wanneer men via een elementaire eenheid komt wordt opgeschreven wat deze 'produceert'. Aan het eindpunt heeft men een voorstelling van een naam. Voorbeelden van een naam zijn: "a", "abc", "jan_de_groot". Maar niet: "van 't hul", omdat hier spaties zijn gebruikt en een bovenkomma, die niet in een elementaire eenheid van het gebruikte diagram voorkomt! Ook niet "3a" omdat een naam niet met een cijfer mag beginnen. Het volgende syntaxdiagram bevat een elders gedefinieerde eenheid:
15 / 58
lijsttype
Dit diagram levert een stukje van de taal PIPL op dat een lijsttype wordt genoemd. Men begint weer bij het beginpunt (links) en kiest eerst welke 'afslag' wordt genomen: b.v. die van "numberlist" (levert op: numberlist), vervolgens wordt "[" gepasseerd (geeft dus: numberlist[). Nu komt de gedefinieerde eenheid "getal". Hiervoor schakelt men naar het diagram getal:
getal
Dit diagram levert b.v. op: 25. Hierna gaat men weer terug naar het diagram lijsttype: het resultaat hiervan is na het uitvoeren van getal: numberlist[25. Tot slot volgt nog "]" en men bereikt het eindpunt, rechts. Totale resultaat voor een lijsttype in PIPL is dus numberlist[25]. Met bovenstaande voorbeelden is duidelijk gemaakt hoe syntaxdiagrammen kunnen worden gebruikt om correcte taalelementen van de taal PIPL te genereren.
16 / 58
Namen, getallen, tekenrijen en variabelen Namen Basistypen Variabelen
Namen naam
Opmerking: Voorbeelden:
Een naam bestaat uit een letter, eventueel gevolgd door een aantal letters, cijfers of "onderstreping". z, A198, Piet_2
Basistypen getal
Opmerking: Voorbeelden:
Het diagram getal produceert alleen gehele getallen. Wanneer een gebroken getal moet worden gebruikt, kan dit worden genoteerd als een numerieke expressie. Voorbeeld: 9,67 wordt: 9 + 67/100. 125000 9
tekenrij
Opmerking:
Er is een aantal bijzondere tekens die in een tekenreeks mogen worden gebruikt: \n staat voor een nieuwe regel \\ staat voor een \ \ kan worden gebruikt om een tekenreeks over twee regels te verdelen \' staat voor een ', terwijl toch de tekenreeks niet wordt afgeloten
Voorbeelden:
'Dit is een tekenreeks' 'Dit is een tekenreeks, verdeeld over\ twee regels' 'in deze zit een \', die niet het einde aangeeft'
Variabelen eenvoudige variabele
lijstvariabele
Opmerking:
Voorbeelden:
De numerieke expressie moet een geheel getal opleveren. Ook mag de numerieke expressie geen getal opleveren dat kleiner is dan 1, of groter is dan de hoogst mogelijke index zoals die bij de declaratie is opgegeven. Wanneer Achternamen een lijst is, die is gedeclareerd als: Achternamen: stringlist[100], dan is Achternamen[25] of Achternamen[i] een lijstvariabele (van het type string). 17 / 58
Het eerste element uit de lijst is Achternamen[1], en het laatste element is Achternamen[100].
variabele
Zie ook: naam, numerieke expressie, eenvoudige variabele, lijstvariabele
18 / 58
Expressies en voorwaarden Numerieke expressie en (algemene) expressie Tekenrij-expressie Logische expressie en voorwaarde
Numerieke expressie en algemene expressie factor
Opmerking: Voorbeelden:
De variabele moet een variabele zijn die uiteindelijk een number bevat. De functieaanroep moet een resultaat van het type number opleveren. -12 Som(i) (24 % 4) Piet[2]
term
Opmerking: Voorbeelden:
1000 a * b[1] Lijst[2] / 20 * 34
numerieke expressie
Opmerking:
Voorbeelden:
Bovenstaande diagrammen definieren een bepaalde volgorde van berekenen voor wat betreft de operatoren. Zo wordt in een numerieke expressie als eerste uitgevoerd de unaire -, daarna de *, / en %; en tenslotte de + en - operatoren. Tip: bij twijfel over de volgorde, haakjes ( "(" en ")" ) gebruiken! De operator % staat voor de deling met een geheel resultaat (de "rest" van de deling wordt genegeerd). 4 + 12 * 3 levert op 40 (4 + 12) * - 3 levert op - 48 12 / 5 levert op 2,5 12 % 5 levert op 2 19 / 58
expressie
Zie ook: variabele, functieaanroep, numerieke expressie, getal, tekenrij-expressie
Tekenrij-expressie tekenrijfactor
Opmerking: Voorbeelden:
De variabele moet een variabele zijn die uiteindelijk een tekenrij bevat. De functieaanroep moet een resultaat van het type tekenrij opleveren. S HfdLetters(T) 'Voornaam: '
tekenrijexpressie
Opmerking: Voorbeelden:
'Voornaam: ' ++ Persoon[i]
Zie ook: variabele, functieaanroep, tekenreeks
Logische expressie en voorwaarde logische factor
Opmerking: Voorbeelden:
not true (z <= y)
20 / 58
logische term
Opmerking: Voorbeelden:
a > 10 and b < 100 not (teller > 12 and voornaam <> '')
logische expressie
Opmerking:
Voorbeelden:
Bovenstaande diagrammen samen leveren een bepaalde volgorde van berekenen op voor wat betreft de operatoren not, and en or. Zo wordt als eerste uitgevoerd de not, daarna de and en tenslotte de or. Tip: bij twijfel over de volgorde, haakjes ( "(" en ")" ) gebruiken! not (teller > 12 and voornaam <> '') or achternaam = ''
voorwaarde
Opmerking:
Voorbeelden:
In een voorwaarde worden expressies vergeleken. Deze expressies moeten van het zelfde type zijn. Dus een tekenrijexpressie kan alleen worden vergeleken met een tekenrijexpressie, en een numerieke expressie kan niet worden vergeken met een tekenrijexpressie. Voor numerieke expressies zijn de operatoren duidelijk. Voor een tekenrijexpressie is dat niet voorshand duidelijk. Een tekenrijexpressie is groter dan een andere tekenrijexpressie wanneer de eerste lexicografisch gezien na de tweede komt. Hierbij geldt dat de hoofdletters voor de kleine letters komen, dus: 'Jan' is kleiner dan 'Piet' (want J komt eerder in het alfabet dan P) en 'piet' is groter dan 'Piet' (want kleine letters komen na de hoofdletters) i >= 100 naam <= 'Zwier'
Zie ook: expressie
21 / 58
Declaraties en specificaties Declaratie- en specificatietypen Declaraties, globale variabelen Functiedeclaratie
Declaratie- en specificatietypen basistype
lijsttype
Opmerking: Voorbeelden:
numberlist[100]
declaratietype
Opmerking: Voorbeelden:
Bij een lijsttype geeft het getal aan hoeveel getallen of tekenrijen er in de lijst kunnen worden opgeborgen. De elementen uit een lijst worden achtereenvolgens genummerd van 1 tot en met de waarde van het "getal". stringlist[2000]
specificatietype
Zie ook: getal, basistype, lijsttype
22 / 58
Declaraties, globale variabelen basisdeclaratie
Opmerking: Voorbeelden:
Wanneer er meer dan één naam wordt gebruikt, gescheiden door een komma, krijgen alle namen het type zoals dat achter de ":" is vermeld. Getal: number i,j:number Naam: string
declaratie
Opmerking: Voorbeelden:
Wanneer er meer dan één naam wordt gebruikt, gescheiden door een komma, krijgen alle namen het type zoals dat achter de ":" is vermeld. Getal: numberlist[99] g,h:number Namen: stringlist[10]
globale variabelen
Opmerking: Voorbeelden:
Globale variabelen kunnen dus leeg zijn, d.w.z. ze komen niet voor. Variabelen in een globalvars-sectie kunnen overal in het programma worden gebruikt. globalvars Voornaam: string; Aantal: number; Achternamen: stringlist[1000];
Zie ook: naam, basistype, declaratietype
Functiedeclaratie formele parameters
Opmerking:
Formele parameters worden tijden de functie-aanroep vervangen door de waarden die in de functieaanroep worden meegegeven. Met deze waarden worden de opdrachten in de functie uitgevoerd. Voor specificatietype is dit: number aan de formele parameter wordt een getalwaarde toegekend string aan de formele parameter wordt een tekenrij toegekend
23 / 58
numbervar stringvar numberlist stringlist Voorbeelden:
de formele parameter verwijst naar een globale variabele van type number de formele parameter verwijst naar een globale variabele van type string de formele parameter verwijst naar een globale variabele van type numberlist de formele parameter verwijst naar een globale variabele van type stringlist
a,b: stringvar; c: stringlist; d,e: number
functiekop
Opmerking: Voorbeelden:
De naam is dus de functienaam, die ook bij de functieaanroep wordt gebruikt. De formele parameters kunnen leeg zijn. Telop(Van, Naar: number) Sorteer(L: stringlist; Aantal: numbervar) Bewerken( )
locale variabelen
Opmerking:
Voorbeelden:
Locale variabelen zijn vergelijkbaar met globale variabelen. Er zijn twee uitzonderingen op deze vergelijking: 1. de locale variabelen zijn alleen bekend in de functie waarbinnen zij gedeclareerd zijn. 2. als locale variabelen kunnen alleen variabelen van een basistype worden genoemd, dus geen lijsten. localvars s: string; i: number;
functiedeclaratie
Opmerking:
Voorbeelden:
Elke functie heeft een resultaat: dit is een waarde van een basistype, dus een tekenrij (string) of een getal (number). Deze waarde wordt gevuld met behulp van de resultaat-opdracht. Wanneer er in de functie geen resultaat-opdracht voorkomt wordt de waarde van de functie '' (lege tekenrij) resp. 0. function PlakAanElkaar(a, b: string): string beginfunc result a ++ b; endfunc
Zie ook: naam, specificatietype, basisdeclaratie, basistype, opdracht
24 / 58
Opdrachten en plugin-programma Opdrachten Plugin-programma
Opdrachten functieaanroep
Opmerking:
Voorbeelden:
Per opgegeven parameter in de functiedeclaratie moet er een waarde(expressie) in de aanroep worden geplaatst. De uitkomst van de expressie moet passen bij het specificatietype van de parameter. Zie hiervoor de opmerking bij formele parameters Telop(1,10) Sorteer(Namenlijst, 100) SchrijfTekst(0, 'Klaar!')
toekenningsopdracht
Opmerking:
Het type van de exppressie moet passen bij het type van de variabele Bij type variabele past type number, numberlist, numbervar number string, stringlist, stringvar string
Voorbeelden:
i := 1 Namen[2] := 'Jansen'
als-dan-opdracht
Opmerking: Voorbeelden:
De opdracht na then mag geen als-dan-opdracht zijn. Het else-deel mag worden weggelaten. if i < j then i := j else j := i if n > 10 then Klaar(1)
stop-als-opdracht
Opmerking: Voorbeelden:
De stop-als-opdracht mag alleen voorkomen in een lusopdracht. stopif i >= Laatste
25 / 58
lusopdracht
Opmerking: Voorbeelden:
De opdrachten tussen loop en endloop worden herhaald uitgevoerd. loop Telop(i, Aantal); i := i + 1; stopif i > Aantal; endloop
samengestelde opdracht
Opmerking: Voorbeelden:
De opdrachten tussen begin en end worden als één opdracht beschouwd. begin a := 1; Namenlijst[a] := Leeg; if b > a then a := b; end
resultaat-opdracht Opmerking: Voorbeelden:
De resultaat-opdracht kan alleen voorkomen in een functie result 1 result 25 * b + a
opdracht
Opmerking:
Een functieaanroep is een element dat een waarde oplevert (een getal of een tekenrij). Wanneer de functie-aanroep niet in een expressie wordt gebruikt, maar als zelfstandige opdracht, dan wordt de resultaat
waarde niet gebruikt.
Zie ook: variabele, expressie, logische expressie
26 / 58
Plugin-programma plugin-programma
Opmerking:
Voorbeelden:
De naam is de naam van de plugin. Deze naam wordt gebruikt als naam van de uitvoer van de compiler, het z.g. GPI-bestand. De tekenrij na description bevat de korte omschrijving van de functie van de plugin. Deze wordt in GENEAAL getoond. Voorbeeld van een (niet zinnig) programma waar alle taalelementen worden gebruikt: plugin voorbeeld description 'voorbeeld-programma dat geen\ \'zinnige\' taak uitvoert\n' globalvars n: number; s string; nl numberlist[10]; sl: stringlist[7]; function BergOp(Index: numbervar; Lijst: stringlist): number localvars i: number; beginfunc i := Index; if i < 7 then begin Lijst[i] := 'leeg'; s := GetalnaarTekst(i, 0) ++ ' gevuld!'; end; Index := Index + 1; result i; endfunc main s := 'ongevuld....'; n := 1; loop BergOp(n, sl); stopif n > 10; endloop endmain
Zie ook: naam, tekenrij, globale variabelen, functiedeclaratie, opdracht
27 / 58
Standaardfuncties Inhoud Databasefuncties Functies voor in- en uitvoer Algemene functies Alle standaardfuncties zijn aan de Plugin Compiler reeds bekend. De gebruiker kan de functies in de plugin gebruiken, zonder deze te hoeven declareren. Bij de beschrijving van de functies zal telkens de functiekop worden gegeven, zodat duideljk is welke parameters nodig zijn en van welk type de parameters zijn. Ook wordt aangegeven welk resultaat de functie terug geeft.
28 / 58
Databasefuncties Functies voor persoonsgegevens Functies voor relatiegegevens Functies voor plaatsgegevens Functies voor verbinden met de database en de personenlijst
Functies voor persoonsgegevens De functies voor het ophalen van persoonsgegevens hebben alle als eerste parameter nodig het persoonsnummer. Wanneer GENEAAL een persoonsnummer vermeldt als b.v. 2:234, dan is het getal om mee te geven aan een functie voor persoonsgegevens: 2 * 100000 + 234: Dus familienummer * 100000 + nummer binnen de familie.
Datums worden teruggegeven zoals deze zijn ingevoerd in GENEAAL:
dus in het formaat ddmmjjjj, eventueel voorafgegaan door C, N, V; of het formaat Tjjjjjjjj (tussen twee jaren). Tijdstippen (b.v. geboorteuur) worden weergegevn zoals deze zijn ingevoerd in GENEAAL, dus in het formaat uumm. De functies geven alle als resultaat een getal: 0 wanneer de functieuitvoering is mislukt (b.v. persoonsnummer bestaat niet, of er was een databasefout) 1 wanneer de functie goed is uitgevoerd. De uitvoer-parameter is altijd een stringvar of numbervar waarin het gevraagde veld van het persoonsrecord wordt geplaatst. Functie Functiekop Parameters
Vraag titels van een persoon function PersoonTitels(Pnummer: number; Titels:stringvar): number
Functie Functiekop Parameters
Vraag voornamen van een persoon function PersoonVoornamen(Pnummer: number; Voornamen:stringvar): number
Functie Functiekop Parameters
Vraag patroniem van een persoon function PersoonPatroniem(Pnummer: number; Patroniem:stringvar): number
Functie Functiekop Parameters
Vraag tussenvoegsels van een persoon function PersoonTussenv(Pnummer: number; Tussenv:stringvar): number
Functie Functiekop Parameters
Vraag achternaam van een persoon function PersoonAchternaam(Pnummer: number; Achternaam:stringvar): number
Functie Functiekop Parameters
Vraag roepnaam van een persoon function PersoonRoepnaam(Pnummer: number; Roepnaam:stringvar): number
Pnummer: Titels:
Pnummer: Voornamen:
Pnummer: Patroniem:
Pnummer: Tussenv:
Pnummer: Achternaam:
Pnummer: Roepnaam:
persoonsnummer, invoer de gevraagde titels, uitvoer
persoonsnummer, invoer de gevraagde voornamen, uitvoer
persoonsnummer, invoer het gevraagde patroniem, uitvoer
persoonsnummer, invoer de gevraagde tussenvoegsels, uitvoer
persoonsnummer, invoer de gevraagde achternaam, uitvoer
persoonsnummer, invoer de gevraagde roepnaam, uitvoer
29 / 58
Functie Functiekop Parameters
Vraag bijnaam van een persoon function PersoonBijnaam(Pnummer: number; Bijnaam:stringvar): number
Functie Functiekop Parameters
Vraag of de persoon ongehuwd is function PersoonOngehuwd(Pnummer: number; Ongehuwd:numbervar): number
Functie Functiekop Parameters
Vraag geslacht van een persoon function PersoonGeslacht(Pnummer: number; Geslacht:stringvar): number
Functie Functiekop Parameters
Vraag geboorteplaats van een persoon function PersoonGebPlaats(Pnummer: number; GebPlaats:numbervar): number
Functie Functiekop Parameters
Vraag geboortedatum van een persoon function PersoonGebDatum(Pnummer: number; GebDatum:stringvar): number
Functie Functiekop Parameters
Vraag geboorteuur van een persoon function PersoonGebUur(Pnummer: number; GebUur:stringvar): number
Functie Functiekop Parameters
Vraag geboortekalender van een persoon function PersoonGebKalender(Pnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag geboorteaktenummer van een persoon function PersoonGebAkte(Pnummer: number; GebAkte:stringvar): number
Functie Functiekop Parameters
Vraag plaats van geboorteakte van een persoon function PersoonGebAktePlaats(Pnummer: number; GebAktePlaats:numbervar): number
Pnummer: Bijnaam:
Pnummer: Ongehuwd:
Pnummer: Geslacht:
Pnummer: GebPlaats:
Pnummer: GebDatum:
Pnummer: GebUur:
Pnummer: Kal:
Pnummer: GebAkte:
persoonsnummer, invoer de gevraagde bijnaam, uitvoer
persoonsnummer, invoer 0, wanneer de persoon niet ongehuwd is, 1, wanneer de persoon wel ongehuwd is, uitvoer
persoonsnummer, invoer 'M' wanneer de persoon een man is, 'V' wanneer de persoon een vrouw is, 'O' wanneer het geslacht onbekend is, uitvoer
persoonsnummer, invoer 0. wanneer de geboorteplaats onbekend is, anders het nummer van de geboorteplaats, uitvoer
persoonsnummer, invoer de gevraagde geboortedatum, uitvoer
persoonsnummer, invoer het gevraagde geboortetijdstip, uitvoer
persoonsnummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
persoonsnummer, invoer het gevraagde geboorteaktenummer, uitvoer
Pnummer: persoonsnummer, invoer GebAktePlaats: 0: wanneer de geboorteakteplaats onbekend is, anders het nummer van de geboorteakteplaats, uitvoer
30 / 58
Functie Functiekop Parameters
Vraag geboorteaktedatum van een persoon function PersoonGebAkteDatum(Pnummer: number; GebAkteDatum:stringvar): number
Functie Functiekop Parameters
Vraag geboorteaktekalender van een persoon function PersoonGebAkteKalender(Pnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag doopplaats van een persoon function PersoonDoopplaats(Pnummer: number; Doopplaats:numbervar): number
Functie Functiekop Parameters
Vraag doopplaatstoevoeging van een persoon function PersoonDoopPlToev(Pnummer: number; DooplToev:stringvar): number
Functie Functiekop Parameters
Vraag doopdatum van een persoon function PersoonDoopDatum(Pnummer: number; DoopDatum:stringvar): number
Functie Functiekop Parameters
Vraag doopkalender van een persoon function PersoonDoopKalender(Pnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag doopreligie van een persoon function PersoonDoopReligie(Pnummer: number; DoopReligie:stringvar): number
Functie Functiekop Parameters
Vraag overlijdensplaats van een persoon function PersoonOverlPlaats(Pnummer: number; OverlPlaats:numbervar): number
Functie Functiekop Parameters
Vraag overlijdensplaatstoevoeging van een persoon function PersoonOverlPlToev(Pnummer: number; OverlPlToev:stringvar): number
Functie Functiekop
Vraag overlijdensdatum van een persoon function PersoonOverlDatum(Pnummer: number; OverlDatum:stringvar): number
Pnummer: persoonsnummer, invoer GebAkteDatum: de gevraagde geboorteaktedatum, uitvoer
Pnummer: Kal:
Pnummer: Doopplaats:
Pnummer: DoopPlToev:
Pnummer: DoopDatum:
Pnummer: Kal:
Pnummer: DoopReligie:
Pnummer: OverlPlaats:
Pnummer: OverlPlToev:
persoonsnummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
persoonsnummer, invoer 0: wanneer de doopplaats onbekend is, anders het nummer van de doopplaats, uitvoer
persoonsnummer, invoer de gevraagde toevoeging, uitvoer
persoonsnummer, invoer de gevraagde doopdatum, uitvoer
persoonsnummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
persoonsnummer, invoer de gevraagde doopreligie, uitvoer
persoonsnummer, invoer 0: wanneer de overlijdensplaats onbekend is, anders het nummer van de overlijdensplaats, uitvoer
persoonsnummer, invoer de gevraagde toevoeging, uitvoer
31 / 58
Parameters
Pnummer: OverlDatum:
Functie Functiekop Parameters
Vraag overlijdenskalender van een persoon function PersoonOverlKalender(Pnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag overlijdenstijdstip van een persoon function PersoonOverlUur(Pnummer: number; OverlUur:stringvar): number
Functie Functiekop Parameters
Vraag overlijdensaktenummer van een persoon function PersoonOverlAkte(Pnummer: number; OverlAkte:stringvar): number
Functie Functiekop Parameters
Vraag overlijdensakteplaats van een persoon function PersoonOverlAktePlaats(Pnummer: number; OverlAktePlaats:numbervar): number
Functie Functiekop Parameters
Vraag overlijdensaktedatum van een persoon function PersoonOverlAkteDatum(Pnummer: number; OverlAkteDatum:stringvar): number
Functie Functiekop Parameters
Vraag overlijdensaktekalender van een persoon function PersoonOverlAkteKalender(Pnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag of de persoon overleden is function PersoonOverleden(Pnummer: number; Overleden:numbervar): number
Functie Functiekop Parameters
Vraag of de persoon begraven of gecremeerd is function PersoonBegrCrem(Pnummer: number; BegrCrem:stringvar): number
Functie Functiekop Parameters
Vraag begrafenis- of crematieplaats van een persoon function PersoonBegrCremPlaats(Pnummer: number; BegrCremPlaats:numbervar): number
Pnummer: Kal:
Pnummer: OverlUur:
Pnummer: OverlAkte:
persoonsnummer, invoer de gevraagde overlijdensdatum, uitvoer
persoonsnummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
persoonsnummer, invoer het gevraagde overlijdenstijdstip, uitvoer
persoonsnummer, invoer het gevraagde overlijdensaktenummer, uitvoer
Pnummer: persoonsnummer, invoer OverlAktePlaats: 0: wanneer de overlijdensakteplaats onbekend is, anders het nummer van de overlijdensakteplaats, uitvoer
Pnummer: OverlAkteDatum:
Pnummer: Kal:
Pnummer: Overleden:
Pnummer: BegrCrem:
Pnummer:
persoonsnummer, invoer de gevraagde overlijdensaktedatum, uitvoer
persoonsnummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
persoonsnummer, invoer 0: wanneer de persoon niet overleden is, 1: wanneer de persoon wel overleden is, uitvoer
persoonsnummer, invoer 'B' : de persoon is begraven (default) 'C' : de persoon is gecremeerd, uitvoer
persoonsnummer, invoer 32 / 58
BegrCremPlaats:
0: wanneer de plaats onbekend is, anders het nummer van de plaats, uitvoer
Functie Functiekop Parameters
Vraag toevoeging begrafenis-/crematieplaats van een persoon function PersoonBegrCremPlToev(Pnummer: number; BegrCremPlToev:stringvar): number
Functie Functiekop Parameters
Vraag begrafenis- of crematiedatum van een persoon function PersoonBegrCremDatum(Pnummer: number; BegrCremDatum:stringvar): number
Functie Functiekop Parameters
Vraag begrafenis- of crematiekalender van een persoon function PersoonBegrCremKalender(Pnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag grafnummer van een persoon function PersoonGrafNummer(Pnummer: number; Grafnummer:stringvar): number
Functie Functiekop Parameters
Vraag relatienummer van de ouders van een persoon function PersoonRelatieOuders(Pnummer: number; RelatieOuders:numbervar): number
Functie Functiekop Parameters
Vraag beroepen van een persoon function PersoonBeroepen(Pnummer: number; Beroepen:stringvar): number
Functie Functiekop Parameters
Vraag woonplaatsen van een persoon function PersoonWoonpl(Pnummer: number; Woonpl:stringvar): number
Functie Functiekop Parameters
Vraag aantal relaties van een persoon function PersoonAantalRels(Pnummer: number; AantalRels:numbervar): number
Functie Functiekop Parameters
Vraag de n-de relatie van een persoon function PersoonRelatie(Pnummer: number; n: number; Relatie:numbervar): number
Pnummer: persoonsnummer, invoer BegrCremPlToev: de gevraagde toevoeging, uitvoer
Pnummer: BegrCremDatum:
Pnummer: Kal:
persoonsnummer, invoer de gevraagde datum, uitvoer
persoonsnummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
Pnummer: GrafNummer:
persoonsnummer, invoer het gevraagde grafnummer, uitvoer
Pnummer: persoonsnummer, invoer RelatieOuders: het gevraagde relatienummer, uitvoer
Pnummer: Beroepen:
Pnummer: Woonpl:
Pnummer: AantalRels:
Pnummer: n Relatie:
persoonsnummer, invoer de gevraagde beroepen, uitvoer
persoonsnummer, invoer de gevraagde woonplaatsen, uitvoer
persoonsnummer, invoer het gevraagde aantal relaties, uitvoer
persoonsnummer, invoer nummer van de relatie (maximaal 8), invoer het gevraagde relatienummer, uitvoer
33 / 58
Functie Functiekop Parameters
Vraag of de persoon afgerond is function PersoonAfgerond(Pnummer: number; Afgerond:numbervar): number
Functie Functiekop Parameters
Vraag of de persoon waarschijnlijk overleden is function PersoonWaarschOverleden(Pnummer: number; WO:numbervar): number
Pnummer: Afgerond:
Pnummer: WO:
persoonsnummer, invoer 0: wanneer de persoon niet afgerond is, 1: wanneer de persoon wel afgerond is, uitvoer
persoonsnummer, invoer 0: wanneer de persoon waarschijnlijk niet is overleden, 1: wanneer de persoon waarschijnlijk wel is overleden,
uitvoer Functie Functiekop Parameters
Vraag of de gegevens van een persoon uitgevoerd mogen worden function PersoonNietUitvoeren(Pnummer: number; NietUitvoeren:numbervar): number
Functie Functiekop Parameters
Vraag privacy-gegevens van een persoon function PersoonPrivacy(Pnummer: number; Privacy:numbervar): number
Functie Functiekop Parameters
Vraag opmerkingen/referenties bij de geboorte van een persoon function PersoonGebOpmRef(Pnummer: number; GebOpmRef:stringvar): number
Functie Functiekop Parameters
Vraag opmerkingen/referenties bij de doop van een persoon function PersoonDoopOpmRef(Pnummer: number; DoopOpmRef:stringvar): number
Functie Functiekop Parameters
Vraag opmerkingen/referenties bij het overlijden van een persoon function PersoonOverlOpmRef(Pnummer: number; OverlOpmRef:stringvar): number
Functie Functiekop Parameters
Vraag opmerking/referenties bij het begraven of de crematie van een persoon function PersoonBegrCremOpmRef(Pnummer: number; BegrCremOpmRef:stringvar): number
Functie Functiekop Parameters
Vraag opmerking/referenties bij de namen van een persoon function PersoonNamenOpmRef(Pnummer: number; NamenOpmRef:stringvar): number
Pnummer: NietUitvoeren:
Pnummer: Privacy:
Pnummer: GebOpmRef:
Pnummer: DoopOpmRef:
Pnummer: OverlOpmRef:
persoonsnummer, invoer 0: wanneer de gegevens wel uitgevoerd mogen worden, 1: wanneer de persoon niet uitgevoerd mogen worden, uitvoer
persoonsnummer, invoer 0 : geen beperking, 1 : alleen namen, 2 : verbergen, uitvoer
persoonsnummer, invoer de gevraagde opmerkingen/referenties, uitvoer
persoonsnummer, invoer de gevraagde opmerkingen/referenties , uitvoer
persoonsnummer, invoer de gevraagde opmerkingen/referenties , uitvoer
Pnummer: persoonsnummer, invoer BegrCremOpmRef: de gevraagde opmerkingen/referenties , uitvoer
Pnummer: NamenOpmRef:
persoonsnummer, invoer de gevraagde opmerkingen/referenties, uitvoer
34 / 58
Functie Functiekop Parameters
Vraag algemene opmerkingen van een persoon function PersoonAlgemeneOpm(Pnummer: number; AlgemeneOpm:stringvar): number
Functie Functiekop Parameters
Vraag gegevens over gekoppelde beelden (bestanden) van een persoon function PersoonBeelden(Pnummer: number; Files:stringlist; Titels:stringlist; Aantal:numbervar): number
Functie Functiekop Parameters
Vraag extra veld van een persoon function PersoonExtraVeld(Pnummer: number; VeldNr: number; Veld: stringvar): number
Pnummer: persoonsnummer, invoer AlgemeneOpm: de gevraagde opmerking, uitvoer
Pnummer: Files: Titels: Aantal:
Pnummer: VeldNr: Veld:
persoonsnummer, invoer een lijst met bestandsnamen, inclusief de mapnamen , uitvoer een lijst met de titels van de beelden, uitvoer het aantal ingevulde bestandsnamen en titels in de lijsten Files en Titels, uitvoer
persoonsnummer, invoer het nummer van het extraveld. Nummering begint bij 1 , uitvoer de inhoud van het gevraagde veld, uitvoer
Functies voor relatiegegevens De functies voor het ophalen van relatiegegevens hebben alle als eerste parameter nodig het relatienummer.
Datums worden teruggegeven zoals deze zijn ingevoerd in GENEAAL:
dus in het formaat ddmmjjjj, eventueel voorafgegaan door C, N, V; of het formaat Tjjjjjjjj (tussen twee jaren). De functies geven alle als resultaat een getal: 0 wanneer de functieuitvoering is mislukt (b.v. relatienummer bestaat niet, of er was een databasefout) 1 wanneer de functie goed is uitgevoerd. De uitvoerparameter is altijd een stringvar of numbervar waarin het gevraagde veld van het relatierecord wordt geplaatst. Functie Functiekop Parameters
Vraag het persoonsnummer van de man in een relatie function RelatieMan(Rnummer: number; Mannr:numbervar): number
Functie Functiekop Parameters
Vraag het persoonsnummer van de vrouw in een relatie function RelatieVrouw(Rnummer: number; Vrouwnr:numbervar): number
Functie Functiekop Parameters
Vraag type van een relatie function RelatieType(Rnummer: number; RelType:stringvar): number
Functie Functiekop Parameters
Vraag ondertrouwplaats van een relatie function RelatieOndertrPlaats(Rnummer: number; OndertrPlaats:numbervar): number
Rnummer: Mannr:
Rnummer: Vrouwnr:
Rnummer: RelType:
Rnummer:
relatienummer, invoer het gevraagde persoonsnummer, uitvoer
relatienummer, invoer het gevraagde persoonsnummer, uitvoer
relatienummer, invoer 'H': de relatie is een huwelijk 'S': de relatie betreft een samenwoning 'R': de relatie is een geregisteerd partnerschap 'O': de relatie is van onbekend type, uitvoer
relatienummer, invoer
35 / 58
OndertrPlaats:
0: wanneer de ondertrouwplaats onbekend is, anders het nummer van de ondertrouwplaats, uitvoer
Functie Functiekop Parameters
Vraag ondertrouwplaatstoevoeging van een relatie function RelatieOndertrPlToev(Rnummer: number; OndertrPlToev:stringvar): number
Functie Functiekop Parameters
Vraag ondertrouwdatum van een relatie function RelatieOndertrDatum(Rnummer: number; OndertrDatum:stringvar): number
Functie Functiekop Parameters
Vraag ondertrouwkalender van een relatie function RelatieOndertrKalender(Rnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag huwelijksplaats van een relatie function RelatieHuwPlaats(Rnummer: number; HuwPlaats:numbervar): number
Functie Functiekop Parameters
Vraag huwelijksplaatsoevoeging van een relatie function RelatieHuwPlToev(Rnummer: number; HuwPlToev:stringvar): number
Functie Functiekop Parameters
Vraag huwelijksdatum van een relatie function RelatieHuwDatum(Rnummer: number; HuwDatum:stringvar): number
Functie Functiekop Parameters
Vraag huwelijkskalender van een relatie function RelatieHuwKalender(Rnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag huwelijksaktenummer van een relatie function RelatieHuwAkte(Rnummer: number; HuwAkte:stringvar): number
Functie Functiekop Parameters
Vraag huwelijksakteplaats van een relatie function RelatieHuwAktePl(Rnummer: number; HuwAktePl:numbervar): number
Rnummer: relatienummer, invoer OndertrPlToev: de gevraagde toevoeging , uitvoer
Rnummer: relatienummer, invoer OndertrDatum: de gevraagde datum, uitvoer
Rnummer: Kal:
Rnummer: HuwPlaats:
Rnummer: HuwPlToev:
Rnummer: HuwDatum:
Rnummer: Kal:
Rnummer: HuwAkte:
Rnummer: HuwAktePl:
relatienummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
relatienummer, invoer 0: wanneer de ondertrouwplaats onbekend is, anders het nummer van de ondertrouwplaats, uitvoer
relatienummer, invoer de gevraagde toevoeging, uitvoer
relatienummer, invoer de gevraagde datum, uitvoer
relatienummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
relatienummer, invoer het gevraagde aktenummer, uitvoer
relatienummer, invoer 0: wanneer de plaats onbekend is, anders het nummer van de plaats, uitvoer
36 / 58
Functie Functiekop Parameters
Vraag kerkelijk huwelijkplaats van een relatie function RelatieKerkHuwPlaats(Rnummer: number;KerkHuwPlaats :numbervar): number
Functie Functiekop Parameters
Vraag toevoeging kerkelijk huwelijksplaats van een relatie function RelatieKerkHuwPlToev(Rnummer: number; KerkHuwPlToev:stringvar): number
Functie Functiekop Parameters
Vraag kerkelijk huwelijksdatum van een relatie function RelatieKerkHuwDatum(Rnummer: number; KerkHuwDatum:stringvar): number
Functie Functiekop Parameters
Vraag kerkelijk huwelijkskalender van een relatie function RelatieKerkHuwKalender(Rnummer: number; Kal:stringvar): number
Functie Functiekop Parameters
Vraag kerkelijk huwelijk religie van een relatie function RelatieKerkHuwRel(Rnummer: number; KerkHuwRel:stringvar): number
Functie Functiekop Parameters
Vraag of er gescheiden is in de relatie function RelatieGescheiden(Rnummer: number; Gescheiden:numbervar): number
Functie Functiekop Parameters
Vraag plaats van scheiding van een relatie function RelatieScheidPlaats(Rnummer: number; ScheidPlaats:numbervar): number
Functie Functiekop Parameters
Vraag datum van scheiding van een relatie function RelatieScheidDatum(Rnummer: number; ScheidDatum:stringvar): number
Functie Functiekop Parameters
Vraag kalender van scheidingsdatum van een relatie function RelatieScheidKalender(Rnummer: number; Kal:stringvar): number
Rnummer: relatienummer, invoer KerkHuwPlaats: 0: wanneer de plaats onbekend is, anders het nummer van de plaats, uitvoer
Rnummer: relatienummer, invoer KerkHuwPlToev: de gevraagde toevoeging, uitvoer
Rnummer: KerkHuwDatum:
Rnummer: Kal:
relatienummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
relatienummer, invoer de gevraagde religie, uitvoer
Rnummer: KerkHuwRel:
relatienummer, invoer 0: wanneer er niet gescheiden is, 1: wanneer er wel gescheiden is, uitvoer
Rnummer: Gescheiden:
Rnummer: ScheidPlaats:
Rnummer: ScheidDatum:
Rnummer: Kal:
relatienummer, invoer de gevraagde datum, uitvoer
relatienummer, invoer 0: wanneer de plaats onbekend is, anders het nummer van de plaats, uitvoer
relatienummer, invoer de gevraagde datum, uitvoer
relatienummer, invoer de gevraagde kalender (G = gregoriaans, J = juliaans, - = v.Chr.), uitvoer
37 / 58
Functie Functiekop Parameters
Vraag het aantal kinderen uit een relatie function RelatieAantalKind(Rnummer: number; AantalKind:numbervar): number
Functie Functiekop Parameters
Vraag het n-de kind van een relatie function RelatieKind(Rnummer: number; KNr: number; Kind:numbervar): number
Functie Functiekop Parameters
Vraag of er geen kinderen zijn uit een relatie function RelatieGeenKind(Rnummer: number; GeenKind:numbervar): number
Functie Functiekop Parameters
Vraag of de gegevens van de relatie mogen worden uitgevoerd function RelatieNietUitvoeren(Rnummer: number; NietUitvoeren:numbervar): number
Functie Functiekop Parameters
Vraag opmerkingen/referenties bij de ondertrouw function RelatieOndertrOpmRef(Rnummer: number; OndertrOpmRef:stringvar): number
Functie Functiekop Parameters
Vraag opmerkingen/referenties bij het huwelijk function RelatieHuwOpmRef(Rnummer: number; HuwOpmRef:stringvar): number
Functie Functiekop Parameters
Vraag opmerkingen/referenties bij het kerkelijk huwelijk function RelatieKerkHuwOpmRef(Rnummer: number; KerkHuwOpmRef:stringvar): number
Functie Functiekop Parameters
Vraag opmerkingen/referenties bij de scheiding function RelatieScheidOpmRef(Rnummer: number; ScheidOpmRef:stringvar): number
Functie Functiekop Parameters
Vraag algemene opmerkingen bij een relatie function RelatieAlgemeneOpm(Rnummer: number; AlgemeneOpm:stringvar): number
Functie Functiekop
Vraag extra veld van een relatie function RelatieExtraVeld(Rnummer: number; VeldNr: number; Veld: stringvar): number
Rnummer: AantalKind:
Rnummer: KNr: Kind:
Rnummer: GeenKind:
Rnummer: NietUitvoeren:
relatienummer, invoer het gevraagde aantal kinderen, uitvoer
relatienummer, invoer het rangnummer van het kind in de relatie , invoer het gevraagde persoonsnummer van het kind, uitvoer
relatienummer, invoer 0: wanneer er kinderen zijn, 1: wanneer er geen kinderen zijn, uitvoer
relatienummer, invoer 0: gegevens wel uitvoeren, 1: gegevens niet uitvoeren, uitvoer
Rnummer: relatienummer, invoer OndertrOpmRef: de gevraagde opmerkingen/referenties, uitvoer
Rnummer: HuwOpmRef:
relatienummer, invoer de gevraagde opmerkingen/referenties, uitvoer
Rnummer: relatienummer, invoer KerkHuwOpmRef: de gevraagde opmerkingen/referenties, uitvoer
Rnummer: ScheidOpmRef:
relatienummer, invoer de gevraagde opmerkingen/referenties, uitvoer
Rnummer: relatienummer, invoer AlgemeneOpm: de gevraagde algemene opmerkingen, uitvoer
38 / 58
Parameters
Rnummer: VeldNr: Veld:
relatienummer, invoer het nummer van het extraveld. Nummering begint bij 1 , uitvoer de inhoud van het gevraagde veld, uitvoer
Functies voor plaatsgegevens De functies voor het ophalen van plaatsgegevens hebben alle als eerste parameter nodig het plaatsnummer. De functies geven alle als resultaat een getal: 0 wanneer de functieuitvoering is mislukt (b.v. plaatsnummer bestaat niet, of er was een databasefout) 1 wanneer de functie goed is uitgevoerd. De tweede parameter is altijd een stringvar waarin het gevraagde veld van het plaatsrecord wordt geplaatst.
Functie Functiekop Parameters
Vraag plaatsnaam function PlaatsNaam(Plnummer: number; Naam:stringvar): number
Functie Functiekop Parameters
Vraag provincienaam function PlaatsProv(Plnummer: number; Prov:stringvar): number
Functie Functiekop Parameters
Vraag landnaam function PlaatsLand(Plnummer: number; Land:stringvar): number
Plnummer: Naam:
Plnummer: Prov:
Plnummer: Land:
plaatsnummer, invoer de gevraagde plaatsnaam, uitvoer
plaatsnummer, invoer de gevraagde provincienaam, uitvoer
plaatsnummer, invoer de gevraagde landnaam, uitvoer
Functies voor verbinden met de database en de personenlijst Deze functies dienen o.a. om verbinding te leggen met een familie in de database of met de huidige personenlijst. Verder kunnen de (naam van de) huidige geopende familie, de huidige persoon en het aantal families in het geopende dossier worden opgevraagd. Een aparte functie is die voor het toevoegen van een persoon aan de personenlijst. Functie Functiekop Parameters
Verbind met de personenlijst function ConnectSelectie(AantalPers: numbervar): number AantalPers:
aantal personen in de personenlijst, uitvoer
Resultaat
0: 1:
de connectie is mislukt de verbinding is tot stand gebracht. De personen uit de personenlijst kunnen worden opgevraagd met behulp van de functie VolgendeSelPersoon. Het aantal personen in de lijst wordt doorgegeven in AantalPers.
Functie Functiekop Parameters
Verbind met een familie function ConnectFamilie(FamNr: number; AantalPers: numbervar): number
Resultaat
FamNr
het nummer van de familie waarmee verbonden moet worden,
AantalPers:
aantal personen in de personenlijst, uitvoer
0: 1:
de connectie is mislukt (b.v. FamNr incorect) de verbinding is tot stand gebracht. De personen uit de gevraagde kunnen worden opgevraagd met behulp van de functie VolgendeFamPersoon. Het aantal personen in
invoer
39 / 58
de familie wordt doorgegeven in AantalPers.
Functie Functiekop Parameters
Selecteer de volgende persoon uit personenlijst function VolgendeSelPersoon(Volgende: number): number Volgende
het rangnummer van de persoon die geselecteerd moet worden,
invoer
Het rangnummer loopt van 1 t/m aantal personen in de personenlijst. Resultaat
0: <> 0:
Functie Functiekop Parameters
Selecteer de volgende persoon uit familie function VolgendeFamPersoon(Volgende: number): number Volgende
de persoon bestaat niet (b.v. fout rangnummer) het persoonsnummer van de gevraagde persoon.
het rangnummer van de persoon die geselecteerd moet worden,
invoer
Het rangnummer loopt van 1 t/m aantal personen in de familie. Resultaat
0: <> 0:
Functie Functiekop Parameters
Vraag aantal families in het geopenden dossier function AantalFamilies(AantalF: numbervar): number AantalF
het aantal families in het dossier, uitvoer N.B. Wanneer er geen dossier is geopend, is het aantal families gelijk aan 0.
Resultaat
0: 1:
de aanroep is mislukt het aantal families is doorgegeven in AantalF
Functie Functiekop Parameters
Vraag nummer van de huidige familie function HuidigeFamilies(FamNr: numbervar): number FamNr
het nummer van de huidige geopende familie, uitvoer N.B. Wanneer er geen familie is geopend, is het FamNr gelijk aan 0.
Resultaat
0: 1:
de aanroep is mislukt het nummer is doorgegeven in FamNr
Functie Functiekop Parameters
Vraag naam van een familie function NaamFamilie(FamNr: number; Naam: stringvar): number FamNr: Naam:
het nummer van de gewenste familie, invoer de naam van de familie (incl. tussenvoegsels), uitvoer
Resultaat
0:
de aanroep is mislukt (b.v. het FamNr is incorrect, of er is geen familie open) de naam van de familie is doorgegeven in Naam
1:
de persoon bestaat niet (b.v. fout rangnummer) het persoonsnummer van de gevraagde persoon.
Functie Functiekop Parameters
Voeg persoon toe aan de personenlijst function VoegToeAanSelectie(PNummer: number): number PNummer:
het nummer van de toe te voegen persoon, invoer
Resultaat
0:
komt niet voor
40 / 58
1:
de persoon is toegevoegd aan de lijst
Functie Functiekop Parameters
Vraag sectiegegevens function SectieGegevens(Scheidingsteken: stringvar): number
Resultaat
het aantal secties
Functie Functiekop Parameters
Vraag gegevens extra velden function AantalExtraVelden(ExtraPers: numbervar; ExtraRel: numbervar): number
Resultaat
altijd 1
Scheidingsteken
ExtraPers ExtraRel
het teken waarmee de sectie worden gescheiden in een veld, uitvoer
het aanrtal extra velden bij een persoon, uitvoer het aantal extra velden bij een relatie, uitvoer
41 / 58
Functies voor in- en uitvoer Functies voor in- en uitvoer Invoer kan worden gelezen van de gebruiker, d.m.v vragen door een schermpje; of door lezen uit een tekstbestand. Voor het lezen van invoer van een scherm is het niet nodig om een invoerstroom te openen. Voor het lezen van een bestand is dat wel nodig, hiervoor is de functie OpenIn beschikbaar. Deze invoerstroom moet ook weer worden gesloten d.m.v. SluitIn. Uitvoer kan worden geschreven naar de meldingenlijst in het plugin-scherm van GENEAAL. Deze uitvoerstroom heeft nummer 0, en behoeft niet te worden geopend of gesloten. Voor uitvoer naar een bestand wordt gebruik gemaakt van uitvoerstroom 1. Deze uitvoer moet wel worden geopend, d.m.v OpenUit, en gesloten d.m.v. de functie SluitUit.
Functie Functiekop Parameters
Open een bestand voor de invoerstroom function OpenIn(Filenaam: stringvar; Ext, Titel: string): number Filenaam:
Ext:
De naam van het te openen bestand, invoer/uitvoer Wanneer de naam de lege tekenrij bevat, wordt een standaard Windows-opendialoog getoond. Hiermee kan een bestand worden gekozen op de standaard manier. Is een bestand gekozen, dan bevat na terug keer uit de functie de parameter Filenaam de naam van het gekozen bestand (incl. de mapnaam). Wanneer Fileaam een geldige bestandsnaam bevat tijdens de aanroep, wordt geen open-dialoog gestart, maar geprobeerd om dit bestand zonder tussenkomst van de gebruiker te openen. wanneer de parameter Filenaam leeg is wordt de opendialoog gestart met de instelling zoeken naar bestanden met extentie Ext,
invoer Titel:
wanneer de parameter Filenaam leeg is wordt de opendialoog gestart met de titel Titel, invoer
Resultaat
0: 1:
de aanroep is mislukt. het bestand met naam Filenaam is geopend voor invoer.
Functie Functiekop Parameters
Open een bestand voor de uitvoerstroom 1 function OpenUit(Filenaam: stringvar; Ext, Titel: string): number Filenaam:
Ext:
De naam van het te openen bestand, invoer/uitvoer Wanneer de naam de lege tekenrij bevat, wordt een standaard Windows-save-dialoog getoond. Hiermee kan een bestand worden gekozen op de standaard manier. Is een bestand gekozen, dan bevat na terug keer uit de functie de parameter Filenaam de naam van het gekozen bestand (incl. de mapnaam). Wanneer Fileaam een geldige bestandsnaam bevat tijdens de aanroep, wordt geen save-dialoog gestart, maar geprobeerd om dit bestand zonder tussenkomst van de gebruiker te openen. wanneer de parameter Filenaam leeg is wordt de savedialoog gestart met de instelling zoeken naar bestanden met extentie Ext,
invoer Titel:
wanneer de parameter Filenaam leeg is wordt de savedialoog gestart met de titel Titel, invoer
Resultaat
0: 1:
de aanroep is mislukt. het bestand met naam Filenaam is geopend voor uitvoerstroom 1.
Functie Functiekop
Sluit een invoerbestand function SluitIn( ): number
42 / 58
Resultaat
0: 1:
Opmerking
wanneer de invoerstroom niet open is, wordt het programma afgebroken.
Functie Functiekop Resultaat
Sluit een uitvoerbestand function SluitUit( ): number
Opmerking
wanneer de uitvoerstroom niet open is, wordt het programma afgebroken.
Functie Functiekop Resultaat
Bepaal of een bestand aanwezig is function BestandBestaat( Filenaam: string): number
Functie Functiekop Parameters
Vraag een tekst van de gebruiker d.m.v een scherm function Vraag(TitelTekst: string; Vraag: string; Antwoord stringvar ): number TitelTekst: Vraag: Antwoord:
de tekst die als titel van het scherm fungeert, invoer de tekst die de vraag inhoudt, invoer de, door de gebruiker teruggegeven tekst, uitvoer
Resultaat
0: 1:
de gebruiker heeft op de Annuleren-knop gedrukt de vraag is beantwoord, Antwoord bevat de tekst van de gebruiker.
Functie Functiekop Parameters
Meldt een tekst aan de gebruiker d.m.v een scherm function Melding(TitelTekst: string; Tekst: string ): number TitelTekst: Tekst:
de tekst die als titel van het scherm fungeert, invoer de inhoud van de melding, invoer
Resultaat
0: 1:
komt niet voor de melding is gegeven en gezien door de gebruiker.
Functie Functiekop Parameters
Vraag initiële waarden aan de gebruiker function Initscherm(OpbouwRes: stringlist ): number
0: 1:
0: 1:
OpbouwRes:
komt niet voor. het invoerbestand is gesloten.
komt niet voor. het uitvoerbestand is gesloten.
bestand bestaat niet het bestand is aanwezig
een tekenrijlijst waarin de opbouw van het vraagscherm staat. De uitvoer wordt ook in de zelfde lijst gegeven, in-, uitvoer De lijst kan een aantal regels (tekenrijen) bevatten. Er zijn twee soorten regels: 1. regel voor een checkbox. De inhoud van de regel is: CB:tekst bij de box 2. regel voor een editbox. De inhoud van de regel is: EB:opschrijft editbox Na de uitvoering van de functie bevat OpbouwRes de antwoorden van de gebruiker: 1. voor een checkboxregel bevat de regel 0 of 1 (resp. niet of wel aangevinkt) 2. voor een editbox bevat de regel het antwoord van de gebruiker.
Resultaat
0: 1:
Functie Functiekop
Laat Windows een bestand openen (afhankelijk van de extensie, wordt een bijbehorend programma gestart) function OpenBestand(Filenaam: string ): number
de gebruiker heeft op Annuleren gedrukt de gewenste informatie staat in de lijst.
43 / 58
Parameters
Filenaam:
de naam van het bestand dat Windows moet openen,
Resultaat
0: 1:
komt niet voor het bestand is aan Windows doorgegeven voor openen/verwerken.
Functie Functiekop Parameters
Lees een tekstregel uit de invoerstroom function LeesTekst( Tekst: stringvar ): number Tekst:
de tekstregel uit de invoerstroom, uitvoer
Resultaat
0: 1:
komt niet voor. het inlezen is gelukt.
Opmerking
wanneer de invoerstroom niet open is, of wanneer er een fout optreedt tijdens het lezen, wordt het programma afgebroken.
Functie Functiekop Parameters
Schrijf een tekst naar een uitvoerkanaal function SchrijfTekst(Kanaal: number; Tekst: string ): number Kanaal:
invoer
Tekst:
0: meldinglijst Plugin-scherm van GENEAAL, 1: uitvoerstroom die gekoppeld is met een uitvoerbestand, invoer de tekst die moet worden geschreven, invoer Opm: de Tekst wordt altijd gecompleteerd met een einderegel-symbool.
Resultaat
0: 1:
onbekend kanaal de tekst is geschreven
Opmerking
wanneer er een schrijffout optreedt in de uitvoerstroom wordt het programma afgebroken.
Functie Functiekop Parameters
Schrijf een einderegel-symbool naar een uitvoerkanaal function SchrijfNR(Kanaal: number ): number
Resultaat
0: 1:
Opmerking
wanneer er een schrijffout optreedt in de uitvoerstroom wordt het programma afgebroken.
Functie Functiekop Parameters
Maak een map aan onder Windows function MaakMap(S: string ): number S:
de naam van de te creeëren map,
Resultaat
0: 1:
het maken van de map is mislukt de nieuwe map is gemaakt
Functie Functiekop Parameters
Kopieer een bestand onder Windows function KopieerBestand(Van, Naar: string ): number Van: Naar:
de naam van de te kopiëren bestand (incl. map), de naam van de kopie (incl. map)
Resultaat
0: 1:
het kopiëren van de map is mislukt het bestand is gekopieerd.
Kanaal:
0: meldinglijst Plugin-scherm van GENEAAL, 1: uitvoerstroom die gekoppeld is met een uitvoerbestand, invoer onbekend kanaal de nieuwe regel is geschreven
44 / 58
Functie Functiekop Parameters
Hernoem een bestand onder Windows function HernoemBestand(Van, Naar: string ): number Van: Naar:
de oude naam van het bestand (incl. map), de nieuwe naam van het bestand (incl. map)
Resultaat
0: 1:
het hernoemen is mislukt het bestand is hernoemd.
45 / 58
Algemene functies Algemene functies De algemene functies die de Plugin Compiler kent zijn als volgt: Functie Functiekop Parameters
Zet getal om naar tekstrepresentatie function GetalNaarTekst( Getal, Decimalen: number): string
Resultaat
de representatie van het getal in een tekenrij
Opmerking
Voorbeelden: GetalNaarTekst(384623, 0) geeft '384623' GetalNaarTekst(6,25, 3) geeft '6,250'
Functie Functiekop Parameters
Zet datum om naar tekstrepresentatie function DatumNaarTekst( Datum: string): string
Resultaat
de representatie van de datum in een tekenrij.
Opmerking
De omzetting houdt rekening met de ingestelde datumpresentatie van GENEAAL
Functie Functiekop Resultaat
Vraag huidige datum function HuidigeDatum: string de huidige datum in interne representatie.
Functie Functiekop Parameters
Zet tekst om naar getal function TekstNaarGetal( Tekst: string): number
Resultaat
de getalswaarde van Tekst.
Opmerking
Wanneer de omzetting faalt, wordt het programma gestopt.
Functie Functiekop Parameters
Extraheer een deel uit een tekenrij function SubStr(S: string; Begin, Aantal: number): string
Resultaat Voorbeeld
Het gewenst deel uit S SubStr('Piet Janssen', 6, 3) geeft als resultaat: 'Jan'
Functie Functiekop Parameters
Verwijder een deel uit een tekenrij function VerwUitStr(S: string; Begin, Aantal: number): string
Resultaat Voorbeeld
Het overgebleven deel van S VerwUitStr('Piet Janssen', 1, 5) geeft als resultaat: 'Janssen'
Getal: Decimalen:
Datum:
Tekst:
S: Begin: Aantal:
S: Begin: Aantal:
het om te zetten getal, invoer het gewenste aantal decimalen achter de komma, invoer
een datum in interne representatie, invoer
een tekst die een getal voorstelt, invoer
de tekenrij waaruit het gedeelte moet worden genomen, invoer de positie in de tekenrij S waar het te extraheren deel begint, invoer het aantal tekens dat het gewenste deel lang is, invoer
de tekenrij waaruit het gedeelte moet worden verwijderd, invoer de positie in de tekenrij S waar het te verwijderen deel begint, invoer het aantal tekens dat het te verwijderen deel lang is, invoer
46 / 58
Functie Functiekop Parameters
Voeg een tekenrij in een tekenrij in function VoegInStr(S, Invoeg: string; Begin: number): string
Resultaat Voorbeeld
De nieuwe tekenrij VoegInStr('Piet Binsbergen', 'van ', 6) geeft als resultaat: 'Piet van Binsbergen'
Functie Functiekop Parameters
Zet een tekenrij om in hoofdletters function HfdLetters(S: string ): string
Resultaat Voorbeeld
S omgezet in hoofdletters HfdLetters('Piet Janssen') geeft als resultaat: 'PIET JANSSEN'
Functie Functiekop Parameters
Zet een tekenrij om in kleine letters function KlLetters(S: string ): string
Resultaat Voorbeeld
S omgezet in kleine letters KlLetters('Piet Janssen') geeft als resultaat: 'piet janssen'
Functie Functiekop Parameters
Bepaal positie van een tekenrij in een tekenrij function Positie(S, Subs: string) : number S: Subs:
de tekenrij waarin Subs moet worden gezocht, invoer de tekenrij die moet worden gezocht in S, invoer
Resultaat
0: <> 0:
Subs komt niet voor in S de positie in de tekenrij S waar Subs begint
Voorbeeld
Positie('Piet Janssen', 'Jan') geeft als resultaat: 5
Functie Functiekop Parameters
Bepaal de lengte van een tekenrij function LengteStr(S) : number
Resultaat Voorbeeld
de lengte in tekens van de tekenrij S LengteStr('Piet Janssen') geeft als resultaat: 12
Functie Functiekop Parameters
Vervang een tekenrij in een deeltekenrij door een andere function VervangInStr(S, Oud, Nieuw: string) : string
Resultaat
tekenrij S met daarin de gepleegde vervangingen N.B. Elk voorkomen van Oud wordt vervangen door Nieuw. VervangInStr('Piet Jansen', 'Jan', 'Gerrit') geeft als resultaat: 'Piet Gerritsen'
Voorbeeld
S: Invoeg: Begin:
S:
S:
S:
S: Oud: Nieuw:
de tekenrij waarin moet worden ingevoegd, invoer de tekenrij die moet worden ingevoegd, invoer de positie in S waar het invoegen begint, invoer
de string die moet worden omgezet, invoer
de string die moet worden omgezet, invoer
de tekenrij waarvan de lengte moet worden bepaald, invoer
de tekenrij waarin moet worden vervangen, invoer de deeltekenrij die moet worden gezocht en vervangen in S, invoer de tekenrij die de deeltekenrij Oud vervangt, invoer
Functie Functiekop Parameters
Verwijder spaties aan het begin en aan het einde van een tekenrij function Trim(Tekst: string) : string
Resultaat Voorbeeld
de gestripte tekst Trim(' Piet Janssen ') geeft als resultaat: 'Piet Janssen'
Tekst:
de tekenrij waarvan de paties moeten worden gestript, invoer
47 / 58
Functie Functiekop Parameters
Extraheer bestandsnaam uit een uitgebreide bestandsnaam (incl map) function ExtraheerBestandsnaam(Bestand: string) : string
Resultaat Voorbeeld
Alleen de bestandsnaam ExtraheerBestandsnaam('C:\Nieuwe bestanden\Voorbeeld.doc') geeft als resultaat: 'Voorbeeld.doc'
Functie Functiekop Parameters
Extraheer mapnaam uit een uitgebreide bestandsnaam (incl map) function ExtraheerMapnaam(Bestand: string) : string
Resultaat Voorbeeld
Alleen de mapnaam ExtraheerMapnaam('C:\Nieuwe bestanden\Voorbeeld.doc') geeft als resultaat: 'C:\Nieuwe bestanden\'
Functie Functiekop Resultaat Opmerking Voorbeeld
Vraag de naam van een tijdelijk bestand (incl de map, excl de extensie) function VraagTijdelijkeBestandsnaam( ) : string De bestandsnaam inclusief de mapnaam, maar exclusief de extensie Tijdelijke bestanden worden na gebruik automatisch door GENEAAL gewist. VraagTijdelijkeBestandsnaam( ) geeft als resultaat b.v.: 'C:\Documents and Settings\Gebruiker\~~~2010021302001234'
Functie Functiekop Parameters
Verander de extensie van een bestandsnaam function VeranderExtensie(Bestand, Ext: string) : string
Resultaat Voorbeeld
de gewijzigde bestandsnaam VeranderExtensie('Voorbeeld.doc', '.txt') geeft als resultaat: 'Voorbeeld.txt'
Functie Functiekop Resultaat
Vraag de hoogte van het beeldscherm in pixels function SchermHoogte( ) : number de schermhoogte
Functie Functiekop Resultaat
Vraag de breedte van het beeldscherm in pixels function SchermBreedte( ) : number de schermbreedte
Functie Functiekop Resultaat
Stop de uitvoering van de plugin function Stop( ) : number de uitvoering wordt gestopt
Bestand:
Bestand:
Bestand: Ext
de uitgebreide bestandsnaam, invoer
de uitgebreide bestandsnaam, invoer
de bestandsnaam, invoer de nieuwe extensie
48 / 58
Het gebruik van de Plugin Compiler Inhoud Overzicht van het maken van een plugin Plugintekst aanmaken en bewerken PluginTekst compileren en testen
49 / 58
Overzicht van het maken van een plugin Het proces van plugins maken Het proces van het maken van een plugin bestaat uit drie delen: 1 . 2 3 .
Het aanmaken van het plugin-programmatekst Het aangemaakte programma moet worden gecompileerd De gegenereerde code moet worden getest om te zien of de gewenste uitvoer inderdaad wordt geproduceerd door GENEAAL
De eerste twee de stappen worden binnen de Plugin Compiler uitgevoerd. De laatste stap moet binnen GENEAAL worden gedaan. Bij het starten van de Plugin Compiler krijgt men het volgende scherm:
In het hoofdscherm zijn vijf knoppen zichtbaar:
Hiermee wordt een bestaande plugintekst (TPI-bestand) geopend.
Hiermee wordt de (aangemaakte of gewijzigde) plugintekst (TPI-bestand) opgeslagen.
Hiermee kan de plugintekst worden afgedrukt op de standaardprinter
Met deze knop wordt een plugintekst gecompileerd.
Hiermee kan worden gezocht in de tekst naar een tekst of naar een regelnummer
50 / 58
Met deze knop wordt de Help-informatie opgeroepen.
51 / 58
Plugintekst aanmaken en bewerken nieuwe plugin maken plugintekst openen plugintekst opslaan tekst of regels zoeken De Plugin Compiler kan de programmatekst aanmaken en bewerken:
Een nieuwe plugin maken Er wordt direct een lege plugintekst getoond na het openen van de Plugin Compiler:
Bestaande plugintekst openen Inlezen van een plugintekst wordt gestart met de knop Er wordt naar een bestandsnaam gevraagd:
.
52 / 58
De Plugin Compiler "weet" waar de TPI-bestanden worden opgeslagen en start met de Openen-dialoog in de betreffende map: b.v. C:\Documents and Settings\\Application Data\GENEAAL (voor Windows XP). Men kan natuurlijk een andere map kiezen! Pluginteksten hebben als extensie: .tpi. Na het openen verschijnt de plugintekst:
53 / 58
Deze tekst kan worden bewerkt, met de gebruikelijke Windows-edit-commando's en -toetsen. N.B. Zoals hierboven te zien, wordt voor de vergroting van de leesbaarheid een aantal tekstkleuren gebruikt: zwart blauwgroen rood groen blauw
voor gereserveerde woorden van PIPL voor namen voor tekenrijen voor getallen voor commentaar
Bewerkte of ingevoerde plugintekst opslaan Na wijziging moet de tekst worden opgeslagen m.b.v. de knop
54 / 58
:
De bestaande bestandsnaam is al vast ingevuld, maar kan natuurlijk worden gewijzigd. De voorgestelde map is de map, die ook gebruikt is om de tekst in te lezen.
Tekst of regels zoeken Met behulp van het zoekveld naast de knop gezocht.
en met de knop zelf kan er naar tekst of een regelnummer worden
Vul eerst de te zoeken tekst in in het zoekveld en geef ENTER. Het eerste voorkomen van de tekst zal worden gemarkeerd. Wil men naar het volgende voorkomen zoeken, druk dan op de zoekknop. Wanneer naar een regelnummer moet worden gezocht, dan gaat dat op dezelfde manier: vul het regelnummer in in het zoekveld en geef ENTER. Verder zoeken met de knop heeft in dit geval geen zin...
55 / 58
Plugintekst compileren en testen plugintekst compileren plugin testen
Nummeringhaakjes
Plugintekst compileren Het ingevoerde of bewerkte pluginprogramma moet worden gecompileerd (vertaald):
eerst moet worden gecontroleerd of aan alle regels van PIPL is voldaan, en zo ja, moet het worden vertaald naar een versie die GENEAAL kan inlezen en uitvoeren.
Tijdens het compileren kunnen er dus één of meer fouten worden ontdekt. De compiler werkt zodanig, dat er altijd na één foutmelding wordt gestopt met het compilatieproces. Eerst moet de fout worden hersteld, daarna kan een volgende poging worden gedaan voor het compileren. N.B. Een compilatie kan pas worden gestart, nadat de huidige tekst is opgeslagen, anders volgt:
Om het compileren te starten, moet de compilatie knop worden gebruikt: Een eventuele foutmelding wordt vermeld in het rechterbovenvak:
Hierbij wordt het regelnummer vermeld, en wordt de betreffende regel gemarkeerd. Na verbetering, weer opslaan kan nogmaals worden gecompileerd, totdat het programa foutloos is: .
56 / 58
In het meldingenvak wordt nu vermeld dat er geen fouten zijn gevonden, en dat het bestand LeeftijdenOverledenen.gpi is aangemaakt. N.B. De naam van het gecompileerde bestand is altijd de naam van de plugin! Er wordt, in principe, opgeslagen in dezelfde map als waar de tekst is opgeslagen.
Plugin testen Wanneer de compiler het programma correct heeft vertaald, moet het nog in de praktijk worden getest. Dit kan alleen binnen GENEAAL. Wanneer GENEAAL nog niet is gestart, start het dan. Druk op de knop Plugin
, en het scherm om plugins uit te voeren verschijnt:
Kies vervolgens de te testen plugin en druk op de Voeruit-knop . In het Meldingenscherm verschijnt eventueel een foutmelding. Is dit het geval, dan dient de fout via de Plugin Compiler eerst te worden opgelost. 57 / 58
Bij een foutmelding wordt altijd het regelnummer vermeld, waar de fout is gevonden:
Met behulp van de zoekfunctie van de Plugin Compler kan de regel worden opgezocht waar de fout is geconstateerd.
58 / 58