Debugging vensters starten vanuit de applicatie Om vanuit een applicatie de debugging vensters te laten verschijnen, wordt er vaak volgende code gebruikt:
PREINPUT -1300; ESCAPE ! Opent het TRACE venster
PREINPUT -1301; ESCAPE ! Opent het COMMAND venster
PREINPUT -1302; ESCAPE ! Opent het WATCH venster
PREINPUT -1303; ESCAPE ! Opent het BREAK venster
Deze code werkt enkel in een Windows ProvideX/Plus sessie - in een WindX omgeving resulteren deze bevelen niet in het openen van het betreffende debug venster. Daarom is het aan te bevelen deze code te veranderen naar:
PRINT 'OPTION'("DebugWindow","Trace"),
PRINT 'OPTION'("DebugWindow","Command"),
PRINT 'OPTION'("DebugWindow","Watch"),
PRINT 'OPTION'("DebugWindow","Break"),
Bij het gebruik van WindX is het wenselijk dat de Trace, Watch en Break vensters zo gestart worden, dat ze aan server zijde de applicatie bewaken. Dit kan door het woord 'Host' voor de naam van het debug venster te plaatsen, bijvoorbeeld: Print 'Option'("DebugWindow","Host Watch"),. Om een debug venster te verbinden met de server applicatie nadat het reeds gestart is kan door 'Host {venster} Enable' te versturen, bijvoorbeeld: PRINT 'OPTION'("DebugWindow","Host Trace Enable"),
Verder kunnen ook te bewaken variabelen en break instructies in de debugvensters geladen worden met behulp van de 'OPTION' mnemonic. Bijvoorbeeld: PRINT 'OPTION'("DebugWindow","Host Watch Add A$"), zal variabele A$ toevoegen aan het Watch venster en PRINT 'OPTION'("DebugWindow","Break Add Test=LEN(A$)>0"), zal een Break laden waardoor de applicatie stopt zodra de lengte van A$ groter is dan 0. Voor een volledig overzicht van alle mogelijkheden in verband debugging vensters verwijs ik naar de ProvideX Language Reference PDF (v9.10), onder '5. Mnemonics / OPTION'.
Let op: om van de ProvideX/PxPLUS debugging vensters gebruik te kunnen maken, moet in het gebruikte INI bestand (print arg(-1) zal tonen wel bestand u gebruikt) een [Config] groep bestaan met 'Debug=1' (zonder quotes).
Snel en makkelijk je toepassing een andere look geven ?
Met ‘Themes’ en ‘Visual Classes’ lukt dit.
Themes zijn de vroegere Templates. Ze bepalen het uitzicht van objecten in een hele library. Ze worden dus ook in de ‘library defaults’ gezet.
Visual classes hebben betrekking op één enkel object. Je moet ze dus per individueel object instellen.
In dit voorbeeld gaan we alleen met buttons werken, maar andere objecten kunnen ook.
We nemen deze buttons als voorbeeld :
Font: Arial, 20 points
Foreground : default
Background: default
We gaan nu een ‘Theme’ maken.
Daarvoor starten we Nomads en kiezen in het menu > Options > Themes
Je kiest als naam ‘T1’ en control type: Button
Je ziet een aantal extra opties die je normaal niet kunt kiezen bij een gewone button.
Bijvoorbeeld ‘Hover Border Color’
De bedoeling is om een rode rand rond de button te krijgen als je de muis boven de button houdt.
In dit voorbeeld worden nog een aantal kleuren weergegeven.
Dit Theme ‘T1’, koppelen we aan onze library, via ‘Library Defaults’
Vanaf deze versie wordt het ACTIVATE.PVX bestand in een 'PXPKEYS' directory geplaatst, 1 directory hoger dan waar PxPlus geinstalleerd werd. Bijvoorbeeld, indien PxPlus in de standaard "C:\PVX Plus Technologies\PxPlus 2014" directory geinstalleerd is, dan zal de activatie in de "C:\PVX Plus Technologies\PxpKeys" directory geplaatst worden. Hierdoor is de activatie niet langer een onderdeel van een specifieke PxPlus versie, en kunnen verschillende PxPlus versies (al dan niet gelijktijdig) gebruik maken van deze activatie.
U kunt steeds verwijzen naar een specifieke activatie door gebruik te maken van: ActivationKey=pad_naar_directory_met_activate.pvx in de [Config] blok van het INI bestand, bijvoorbeeld:
[Config] ActivationKey=D:\PxPlus\pxpkeys
Indien u een bestaande Windows PxPlus versie upgrade naar v2014 en er bestaat reeds een lib\keys directory (van een oudere installatie), dan zal v2014 gebruik blijven maken van deze activatie en dus geen 'pxpkeys' directory maken. Ook Unix en Linux v2014 versies zullen gebruik blijven maken van de activatie in de lib directory (ongeacht of er een upgrade of nieuwe installatie uitgevoerd werd).
Vanaf PxPlus Windows versie 11 kan er in het INI bestand een LOGFILE= regel opgenomen worden in de [CONFIG] blok. LOGFILE= dient te verwijzen naar een bestaand pad, bijvoorbeeld:
LOGFILE=D:\tmp\logv11.txt . Pad 'D:\tmp' moet dus aanwezig zijn, tekstbestand 'logv11.txt' zal aangemaakt worden indien het niet bestaat. Indien er in PxPlus een interne fout plaats vindt, zal PxPlus 1 of meerdere vermeldingen in het logbestand maken. Ook als PxPlus door het OS uit geheugen gehaald wordt (bijvoorbeeld door een geheugenpositie buiten het PxPlus geheugen te benaderen wat resulteert in de befaamde 'PxPlus has stopped working' melding), zal dit vermeld worden in het logbestand. Bij een PxPlus crash kunt u dan toch nog vaststellen, op welk punt in de applicatie het 'probleem' opgetreden is. De vermeldingen in het logbestand, hebben allemaal deze structuur: Datum Tijd [Programma:regel] Uitleg ivm het probleem.
Bijvoorbeeld:
Aug 13 16:52 [D:\pxplus\pxp7\misc\zip_format.pgm:160] *OUT OF MEMORY* - Global Alloc failed
Aug 13 16:52 [D:\pxplus\pxp7\misc\zip_format.pgm:160] *OUT OF MEMORY* Unable to allocate
1760559116 bytes
Aug 14 13:40 [*plus/web/request:120] [TCP][Winsock]Error status:10035(796:)
Aug 19 09:44 [D:\pxplus\pvxplus11\misc\blobtest.pgm:200] Fatal exception error code
c0000005 occurred
Aug 19 09:44 [D:\pxplus\pvxplus11\misc\blobtest.pgm:200] - ERR=0 CTL=0 RET=258 LFA=1 LFO=1
Aug 19 09:44 [D:\pxplus\pvxplus11\misc\blobtest.pgm:200] - Last path used: [MySQL]mysql;
Aug 19 09:44 [D:\pxplus\pvxplus11\misc\blobtest.pgm:200] - Program stack follows:
Sep 18 09:59 [*winlist:5193] *MEMORY LIMIT HIT* - About to report an error 31
Dec 17 09:17 [webreq:12240] SSL Chkerror socket 488 sts 0 yields 5
Dec 17 09:17 [webreq:12240] [TCP][Winsock]Error status:10035 (488:)
Jan 13 09:12 [*ezweb/server:444] * Error:404 Not Found Request:/favicon.ico
Jan 13 09:12 [*plus/winutl/winqry:1615] Skipping ref to control 0 (Disable) at
1615:D:\PxPLUS\PvxPlus11.5\lib\_plus\winutl\winqry (255:D:\PxPLUS\PvxPlus11.5\lib\_winlist)
Jan 13 09:14 [*ezweb/server:36] Shutting down *ezweb/server
U kunt zelf ook vanuit de applicatie vermeldingen in het logbestand maken door gebruik te maken van SETTRACE RECORD, bijvoorbeeld: SETTRACE RECORD "OOPS" in console mode zal resulteren in deze vermelding: Jan 20 13:37 [:0] OOPS
Vanaf PxPlus2014 v.12 is dit ook beschikbaar in Unix en Linux PxPlus versies. Om de LOGFILE te activeren in Unix/Linux, dient u een pvxtrace.log bestand aan te maken in de PxPlus directory. Indien PxPlus v12 vaststelt dat dit (tekst)bestand bestaat, zal het automatisch gebruikt worden om interne meldingen in op te slaan.
#!/bin/sh
PVXLIB=/pxplus/lib
PVXFLMAP=\\/
export PVXLIB PVXFLMAP
umask 0
cd /pxplus
{su username}
/pxplus/pxplus -dr=/pxplus/ *plus/cs/host -arg 4093 {forced program} >/dev/null &1
A new feature has been added in PxPLUS v6.10, where a Windows Printer may be defined on a PC so that it appears in the Windows Printer Selection Dialogue, and if that printer is selected from within a PxPLUS session, then PxPLUS attempts to re-route the printer to a device driver.
This allows Developers to create Windows Printer’s on workstations for items such as the Preview, PDF, or HTMLoutput from PxPLUS.
This feature works based on the name and properties of the printer.
You should now have a printer named “PxPLUS Viewer” as one of this workstation’s printers. From within any PxPLUS application, you will see this printer in the *WINPRT* printer selection dialogue. Whenever this printer is selected, PxPLUS will re-route the printer to the specific device driver.
In the case of our example, we have created a printer named “PxPLUS Viewer” which is connected to “NUL:”. If selected from Printer Selection, PxPLUS will automatically close “*WINPRT*” and open the file “*VIEWER*” instead.
NOTE: This will ONLY work in PxPLUS applications!
If the user selects one of these special PxPLUS mapped printers from another application (Word, Notepad, etc.), they will get NO output.
Eerst overlopen we de bevelen, functies en parameters die betrekking hebben op het vinden van bestanden.
‘CD’ parameter.
De ‘CD’ parameter staat standaard ‘UIT’, wat betekent dat de directory waar je in staat pas doorzocht wordt ná de directories uit de PREFIX lijst.
Indien de parameter ‘AAN’ staat, dan kijkt PxPLUS eerst in de actieve directory, en pas dan in de PREFIX lijst.
(zie verder ‘Zoek Regels’)
Om de inhoud van de parameter te controleren : PRINT PRM ( ‘CD’ )
en om de parameter te veranderen : SET PARAM ‘CD’ = 1 (or 0)
PREFIX
U kunt het PREFIX bevel vergelijken met de PATH variabele in MS-DOS of UNIX.
Gebruik het PREFIX bevel om een reeks van zoekpaden op te geven waar PxPLUS moet in zoeken als u een OPEN / LOAD / RUN / CALL / PERFORM uitvoert van een bestand of programma zonder volledige padnaam.
Voorbeeld:
PREFIX “/usr/mydir/data/ /usr/mydir/prog/ /usr/mydir/sub/ D:/other/data/”
Met andere woorden, als u een bestand opent mét volledige padnaam, dan gelden al de zoekregels niet.
De namen in de PREFIX moeten gescheiden zijn door een spatie.
Zoals u ziet, mag de schijfaanduiding toegevoegd worden aan de padnaam, om alzo te zoeken op een andere schijf dan dewelke actief is gemaakt met het SETDRIVE bevel.
U kunt 10 verschillende PREFIXen aanduiden, nl. PREFIX (0) tot PREFIX (9).
Voorbeeld:
PREFIX (0) “/usr/mydir/data/”
PREFIX (1)”/usr/mydir/prog/ /usr/mydir/sub/”
PREFIX (2)”D:/other/data/”
Het voordeel is dat u een bepaalde PREFIX kunt DISABLEn en ENABLEn.
b.v.: DISABLE 2, en u stopt het zoeken in D:/other/data/.
PREFIX (0) ” … ” is hetzelfde als PREFIX ” … ”
Als er padnamen zijn waarin al een spatie voorkomt, dan moet u deze padnaam tussen aanhalingstekens plaatsen.
Voorbeeld:
PREFIX “C:/Tmp/ C:/usr/ “”C:/Program Files/”””
PRINT PFX of PRINT PFX (n) toont u de inhoud van PREFIX.
‘ = ‘ teken voor speciale zoekopdrachten.
Het ‘=’ teken in de PREFIX heeft een speciale betekenis. Elk ‘=’ teken komt overeen met een letter (of cijfer) van de bestandsnaam en wordt erdoor vervangen. Het eerste ‘=’ teken wordt vervangen door de eerste letter van de bestandsnaam, het tweede ‘=’ teken door de tweede letter van de bestandsnaam, enzovoort.
De bedoeling is om grote directories op te delen in kleinere, voor snellere toegang en beter beheer.
Voorbeeld:
Veronderstel dat uw toepassing uit verschillende modules bestaat. Aan de naam van een programma kun je al zien tot welke module deze behoort.
b.v. BH001 BH002 BH003 behoren tot de boehhoudmodule en LN001 LN002 LN… behoren tot de loonadministratiemodule. U kunt dan uw (grote) directory opsplitsen in meerdere kleine directories. De naam van deze subdirectories moet dan overeenkomen met de eerste letters van de naam van de modules. In dit geval BH en LN.
Als PxPLUS nu een programma of bestand zoekt, dan evalueert PxPLUS de eerste overeenkomende letter(s) en gebruikt die om in de juiste directory te gaan kijken.
Voorbeeld:
PREFIX “/myapp/==/”
OPEN (1)”BHHIST”
PxPLUS evalueert de bestandsnaam BHHIST en maakt er ‘/ myapp / BH / BHHIST’ (1) van, en tracht zó het bestand te openen.
Asterisks als PREFIX wild-cards.(2)
U kunt ‘*’ en ‘**’ gebruiken als wild-card teken in PREFIX om (nieuwe) bestandsnaam extenties te ondersteunen zonder uw programma’s te moeten aanpassen.
Deze uitbreiding is gemaakt in versie 4.20 voornamelijk om Windows 2000 gecertificeerd te zijn. Om Windows 2000 gecertificeerd te zijn, moeten uw bestanden en programma’s een extentie hebben. Met de wild-card tekens in PREFIX kunt u uw bestanden een specifieke extentie geven, zonder dat u uw programma’s moet aanpassen.
Een enkele asterisk (*):
Indien uw PREFIX bevel een asterisk bevat, gevolgd door een extentie, dan zal PxPLUS dit asterisk teken vervangen door het bestand dat u tracht te openen.
Met het resultaat tracht PxPLUS dan om het bestand te vinden, en indien niet gevonden, zal PxPLUS alsnog het bestand trachten te openen zonder extentie.
Voorbeeld:
PREFIX (5) “*.dat”
OPEN(1)”klant”
PxPLUS scant de directory naar ‘klant.dat’ en opent het bestand. Indien ‘klant.dat’ niet gevonden werd, dan zoekt PxPLUS verder naar ‘klant’. Indien gevonden, opent PxPLUS het bestand, indien niet gevonden zal PxPLUS een ERROR 12 genereren.
Nota!
KEYED “abcde”,5 zal het bestand ‘abcde.dat’ niet creëeren maar wel ‘abcde’ , en
ERASE “abcde” zal wel het bestand ‘abcde.dat’ wissen !
Dubbele asterisks (**):
Indien uw PREFIX twee asterisks bevat, samen met een extentie, dan zal de substitutie zoals hierboven beschreven, enkel gebeuren als het een bestandsnaam betreft zonder eigen extentie bij het OPEN bevel. Indien de naam reeds een extentie heeft, dan wordt er geen automatische vervanging gedaan.
Voorbeeld:
PREFIX “/mydir/**.dat”
OPEN(1)”journaal”
OPEN(2)”journaal.hist”
Vermits ‘ OPEN (1)”journaal” ‘ een bestand bevat zonder extentie, zal PxPLUS eerst zoeken naar ‘/mydir/journaal.dat’ en vervolgens naar ‘/mydir/journaal’.
Vermits ‘ OPEN (2)”journaal.hist” ‘ wel een bestand met extentie bevat (.hist), zal PxPLUS geen ‘.dat’ toevoegen, en dus gewoon zoeken naar het bestand ‘/mydir/journaal.hist ‘.
PREFIX PROGRAM
Gebruik het PREFIX PROGRAM formaat om een zoekpad te definiëren om specifiek naar programma’s te zoeken. PxPLUS zal eerst in dit pad zoeken, en eventueel vervolgens in de andere PREFIX, indien u een LOAD, RUN, CALL, PERFORM, PROGRAM of SAVE uitvoert.
Voorbeeld:
PREFIX PROGRAM “/pvx/mydir/pgm/”
om de inhoud te zien :
PRINT PFX(PGN)
PREFIX FILE
Dit is niet de tegenhanger van PREFIX PROGRAM !
Gebruik het PREFIX FILE formaat om dynamische omzettingen te doen van bestandsnamen. U kunt bijvoorbeeld een ‘ OPEN(x)”klant” ‘ geprogrammeerd hebben, maar eigenlijk wilt u dat “//andere_machine/customer” geöpend wordt.
Hoe werkt het ? U definiëert een KEYED bestand met externe sleutel en een variabele recordlengte. Indien het bestand niet aan deze voorwaarden voldoet, krijgt u een ERROR 17:Invalid file type or contents. b “PFXBESTAND”
De sleutel is de naam zoals die in het programma staat. bvb “klant”.
Het eerste veld is de naam van het vervangbestand. bvb “//andere_machine/customer”.
Dan voert u het bevel uit : PREFIX FILE “PFXBESTAND”
Bij een OPEN onderzoekt PxPLUS nu eerst dit bestand, en kijkt of de bestandsnaam, die u wilt openen, bestaat als sleutel in dit bestand. Zo ja, dan wordt het veld als bestandsnaam gebruikt en gelden terug alle zoek regels.
Mag ik u even herinneren dat enkel indien een relatieve bestandsnaam is opgegeven, dat dan het hele zoekmechanisme geldt. Bestandsnamen met absolute padnamen worden onmiddellijk geopend, zonder te zoeken.
Voorbeeld:
KEYED “pfxbestand”,25
OPEN(1)”pfxbestand”
WRITE (1,key=”klant”)”[odb]ACCESS;CUST;KEY=CUSTNO”
CLOSE(1)
……
PREFIX FILE “pfxbestand”
OPEN(1)”klant” ! Intern wordt dit
>> OPEN(1)”[odb]ACCESS;CUST;KEY=CUSTNO”
Zoals u ziet, is het erg makkelijk als u wilt veranderen van databank. U moet enkel de keyed file veranderen, uw programma’s blijven ongewijzigd.
Vanaf versie 4.23 is er een tweede veld toegevoegd aan het PREFIX FILE bestand.
Dit is een OPTIONS veld. Deze opties worden toegevoegd aan de OPT= bij het openen van het bestand. Dit heeft men gedaan, omdat de lengte van de naam een limiet heeft van 256 bytes.
Voorbeeld:
Het PREFIX FILE bestand bevat het volgende :
Key=”klant”, Veld1=”[ODB]DSN;customer”, Veld2=”KEY=cust_id”
OPEN(1)”klant”
intern wordt dit :
OPEN(1,OPT=”KEY=cust_id”)”[ODB]DSN;customer”
of …
OPEN(1,OPT=”REC=klantnaam”)”klant”
intern wordt dit :
OPEN(1,OPT=”KEY=cust_id;REC=klantnaam”)”[ODB]DSN;customer”
De inhoud van OPT= wordt in feite achteraan de naam bijgezet, en dit wordt dan:
OPEN(1)”[ODB]DSN;customer;KEY=cust_id;REC=klantnaam”
PRINT PFX(-1) toont U het PREFIX FILE bestand.
ZOEK REGELS
PxPLUS zoekt een bestand of programma in deze volgorde :
OPEN
1) PREFIX FILE, indien gebruikt. (Vervangt de padnaam, en vervolgt de sequentie)
2) Huidige directory ( indien ’CD’ parameter aan )
3) PREFIX 0 to 9
4) PROGRAM PREFIX, indien gebruikt
5) Huidige directory ( indien ’CD’ parameter uit )
LOAD / RUN / CALL / PERFORM / SAVE
1) PREFIX FILE, indien gebruikt (Vervangt de padnaam, en vervolgt de sequentie)
2) Program Cache
3) Current Directory ( indien ’CD’ parameter aan )
4) PREFIX PROGRAM, indien gebruikt
5) PREFIX 0 to 9
6) Current Directory ( indien ’CD’ parameter uit )
De PREFIX zoekregels gelden niet alleen voor het openen van bestanden, maar ook voor het creëeren ervan. PxPLUS maakt het bestand aan in het eerste pad van de eerste PREFIX. Indien ‘CD’ parameter aan staat, dan worden bestanden aangemaakt in de ‘aktieve’ directory.
Let op dat eenmaal een programma in ‘cache’ zit, en stel dat u de PREFIX uitschakelt waaruit het programma gekomen is, dan zal PxPLUS bij het opnieuw oproepen, nog steeds het bewuste programma uit cache halen en geen error 12 genereren.
PERFORMANTIE
Wat u best vermijdt is de schijf aanduiding vooraan in de padnaam.
SETDRIVE “C:” ! meestal is dit de standaard waarde
PREFIX “C:/myapp/data/ C:/myapp/files/ D:/mydir/somedir/ C:/pvx/lib/”
Beter is :
SETDRIVE “C:”
PREFIX “/myapp/data/ /myapp/files/ D:/mydir/somedir/”
Ten eerste heeft u /pvx/lib in uw zoekpad niet nodig. Elk PxPLUS hulpprogramma en elke PxPLUS subdirectory kunt u oproepen of vinden door vooraan het ‘ * ‘ te plaatsen.
b.v. CALL “*web/email” ip CALL “\pvx\lib\_web\email”
Ten tweede, door het weglaten van de schijfaanduiding hoeft PxPLUS niet te controleren óf de schijf wel bestaat, en dus wint u tijd.
Indien mogelijk, zet het pad met een afwijkende schijfaanduiding achteraan in het zoekpad.
OPEN (1) FILE$
OPEN (1,ISZ=1) FILE$
OPEN (1,ISZ=n) FILE$, waar n>1
OPEN (1) | OPEN (1,ISZ=1) | OPEN (1,ISZ=n) n>1 | |
---|---|---|---|
0D0A | 0D0A | 0D0A000000… | |
WRITE | 8A0D0A | 8A | 8A0000000000… |
WRITE RECORD | 0D0A | NOTHING | 000000… (tot LEN=n) |
PxPLUS doet eerst een test op het eerste record van een ‘serial’ bestand. Als er een teken gevonden wordt buiten de reeks van een ” ” (spatie) en een “~” (tilde), dan beschouwt PxPLUS het bestand als een binair bestand en de regels van ‘OPEN (1,ISZ=1)’ zijn van toepassing.
Je moet het bestand LOCKen wil je er iets in schrijven.
PxPLUS behandelt het bestand op een record georiënteerde manier.
De IND() functie geeft u het huidige record.
PxPLUS voegt altijd $0D0A$ (1) toe aan het eind van een record.
In geval van een WRITE bevel zal een extra field separator ($8A$) (2) toegevoegd worden net vóór de record separator ($0D0A$)
Een ‘READ RECORD’ scant de data in het bestand naar een $0D0A$ byte combinatie.
Een ‘READ’ impliceert een ‘READ RECORD’. De gegevens van de ‘READ RECORD’ worden gebruikt om de variabelen te vullen, waar $8A$ fungeert als field separator.
Een ‘READ (1,IND=n)’ leest het n+1ste record.
1 record separator
PxPLUS voor Windows, de record separator is $0D0A$
PxPLUS voor UNIX, de record separator is $0A$
In mijn voorbeelden heb ik steeds $0D0A$ gebruikt.
2 field separator
De standaard field separator is $8A$, maar kan gewijzigd worden met de ‘FS’ parameter.
Als je een bestand opent met ‘,ISZ=1’, dan open je het bestand in BINAIRE mode. Zelfs als het een KEYED bestand is.
Om compatibel te zijn met andere Business Basics, is ‘ISZ=-1’ toegestaan.
Deze manier van OPEN, impliceert een LOCK op het bestand.
PxPLUS behandelt het bestand op een byte georiënteerde manier.
De IND() functie geeft u de byte pointer of m.a.w. het aantal bytes dat u gelezen heeft.
PRINT X$ schrijft X$+$0D0A$
WRITE X$ schrijft X$+$8A$
WRITE RECORD X$ schrijft X$ en voegt niets toe aan de variabele, maar als de variabele leeg is wordt er een $00$ byte toegevoegd.
Normaal lees je het bestand met READ RECORD(1,SIZ=nnn)X$
Anders wordt , ‘SIZ=1’ genomen.
‘READ(1,IND=n)’ leest de n+1ste byte.
Opgepast met deze manier van lezen en schrijven.
Test altijd of het resultaat klopt met wat u wenste.
‘PRINT’ schrijft de variabele(n) in het bestand. Elke PRINT wordt beëindigd met $0D0A$.
Achtereenvolgende PRINTs kunnen uitgevoerd worden. Geen field separator tussen twee velden.
Wanneer het n aantal bytes bereikt is wordt er een ERROR #1 gegenereerd.
Wanneer het n aantal bytes niet bereikt wordt, dan wordt the rest van n bytes gevuld met $00$
‘WRITE’ schrijft de variabele(n) in het bestand. Een field separator ($8A$) wordt toegevoegd achter elk veld. De resterende n bytes worden gevuld met $00$.
‘WRITE RECORD’ schrijft de gegevens in het bestand zonder separator. De resterende n bytes worden telkens gevuld met $00$.
Een ‘READ’ impliceert een READ RECORD met n aantal bytes. De variabelen worden gevuld aan de hand van het gelezen record.
Een ‘READ RECORD’ leest n aantal bytes (n = gespecificeerd bij de OPEN)
Een ‘READ RECORD (1,SIZ=x) leest x bytes.
Samenvatting
WRITE PROCEDURE
SERIAL F$
OPEN LOCK (1) F$
PRINT (1)"10 REM"
PRINT (1)"20 BEGIN"
PRINT (1)"30 FOR I=1 to 10"
PRINT ...
PRINT (1)"9999 END"
READ PROCEDURE
CLOSE (1)
OPEN (1)F$
MERGE (1)
WRITE PROCEDURE
SERIAL F$
OPEN (1,isz=1) F$
DIM X$(128)
X$(1)=SOME_CODE$
X$(25)=OTHER_STUFF$
...
X$=X$+$09$
WRITE RECORD (1)X$
READ PROCEDURE
OPEN(1,isz=1)F$
GET:
READ(1,siz=129,end=DONE)X$
GOTO GET
DONE:
READ PROCEDURE
OPEN (1) F$
GET:
READ(1,end=DONE)X$,Y$,Z$
GOTO GET
DONE:
WRITE PROCEDURE
SERIAL F$
OPEN LOCK (1) F$
PUT:
A$= ... , B$= ... , C$= ...
WRITE (1)A$,B$,C$
GOTO PUT
0010 BEGIN ; PRINT 'CS','SB'
0020 FOR I=1 TO 2
0030 LET F$="c:\tmp\erase.me"; ERASE F$,ERR=*PROCEED; SERIAL F$
0050 !
0060 IF I=1 THEN OPEN LOCK (1)F$; PRINT "OPEN (1) "
0070 IF I=2 THEN OPEN LOCK (1,ISZ=1)F$; PRINT "OPEN(1,ISZ=1)"
0080 !
0090 PRINT (1)"111"
0100 WRITE (1)"222"
0110 WRITE RECORD (1)"333"
0130 PRINT (1)"444"
0140 WRITE (1)"555"
0150 WRITE RECORD (1)"666"
0160 !
0170 CLOSE (1); OPEN (1,ISZ=1) F$
0180 READ RECORD (1,SIZ=-1000) X$
0190 PRINT 'LF',"Binary file contents: ",'LF','LF','SF',HTA(X$),
0200 !
0330 CLOSE (1)
0331 PRINT 'SB','LF'
0340 NEXT I
Een Link File is een PxPLUS bestand om een ‘ALIAS’-naam te creëren voor een bepaalde ‘poort’ of ‘bestand’ en om een Device Driver er aan te koppelen.
Een PxPLUS Link File is een klein, eenvoudig bestandje met drie onderdelen.
– De ‘header’, waarin het soort Link File staat.
– De naam van de ‘andere’ poort of het ‘andere’ bestand.
– De naam van een Device Driver (call-programma) dat zal uitgevoerd worden nadat het ‘andere’ bestand geopend is. (zie Device Driver hieronder)
Dat is eigenlijk alles … Link Files zijn kleine bestandjes in een directory zoals er zovele zijn en hebben dezelfde regels als andere bestanden. Dus onder UNIX moet u bv. letten op hoofd- en kleine letters.
Bij Link Files zijn er drie verschillende types, en dat zie je aan de ‘header’ van de Link File. nl: [Pvxlnk], [Pvxdev], en [Pvxapr]. Intern zal PxPLUS op een andere manier met ze omgaan.
Laten we het even hebben over de ‘header’ van een bestand.
Alle PxPLUS bestanden hebben een ‘header’. In ‘KEYED’ bestanden zie je [PVXKEY] en ‘INDEXED’ bestanden hebben [PVXIND].
Als PxPLUS een bestand opent, eender welk bestand trouwens, dan lezen ze dadelijk de eerste 512 bytes (of minder). Ze kijken of de ‘header’ begint met ‘[Pvx’ en zien dus dadelijk of het een van hun bestanden is of niet. Dus elk ander bestand beschouwen ze als een ASCII-bestand.
Indien het een ‘keyed’ bestand is, zal PxPLUS het op de juiste manier behandelen. De interpreter weet immers hoe de interne structuur in elkaar zit en kan de juiste records lezen.
In geval het een Link File is, weet PxPLUS dat ze er anders mee moeten om springen dan een ‘keyed’ bestand.
Vermits PxPLUS al 512 bytes gelezen heeft, hebben ze de totale Link File in geheugen. PxPLUS analyseert dan de rest.
Van positie 9 en 60 lang bevindt zich de naam van de ‘andere file’
Van positie 69 en 12 lang bevindt zich de naam van de ‘CALL’ of Device Driver.
Intern zal PxPLUS de Link File sluiten. Op hetzelfde kanaal opent PxPLUS ‘het andere bestand’ en zorgt ervoor dat de naam van de Link File wordt getoond als u een PRINT FID(kanaal) uitvoert. Vóór de naam van de Device Driver wordt er ‘*dev’ geplakt, dus weet u dat Device Drivers zich altijd in ‘…../lib/_dev/’ bevinden.
En tenslotte wordt de ‘CALL’ uitgevoerd.
U moet er dus op letten dat :
1) Het ‘andere bestand’ moet je in PxPLUS kunnen openen. Dus.. de juiste rechten, het juiste pad, de juiste naam (kleine- of hoofdletters).
2) De Device Driver moet te laden en uitvoerbaar zijn met het bevel: CALL”*dev/<programma>”
Er bestaat natuurlijk een hulpprogramma om Link Files te creëren, namelijk ‘*UCL‘.
Ik zei al dat er drie soorten Link Files zijn. De respectievelijke ‘headers’ zien er als volgt uit : [Pvxlnk], [Pvxdev] en [Pvxapr]
Deze ‘headers’ zorgen er voor dat PxPLUS ze op een andere manier zal behandelen.
[Pvxlnk] wordt gebruikt om een link te maken naar een ander bestand, zonder een Device Driver. U kunt dus b het bestand ‘KLANTEN’ verplaatsen naar een andere schijf bv. ‘F:\DATA\KLANTEN’ en een Link File maken die KLANTEN noemt. Zodoende moet u niets aan uw programma’s veranderen als u dit doet.
[Pvxdev] wordt waarschijnlijk het meest gebruikt. Hiermee open je een ander bestand of een poort en de Device Driver wordt opgeroepen. Dit type heb je dus nodig voor printers en dergelijke.
[Pvxapr] is een Link File voor ‘slave’ printers. Dus printers die gekoppeld zijn aan de printerpoort van een terminal. PxPLUS opent de ‘andere poort’, voert het ‘call’ programma uit en stuurt het ‘PS’ mnemonic naar de printer. Als het kanaal gesloten wordt stuurt PxPLUS het ‘PE’ mnemonic.
Enkele voorbeelden :
Name of link file | LP |
Name of file/device | *windev*;\\texas\HP on Ne01: |
Selected driver | HPLASER |
Name of link file | LP |
Name of file/device | \\server_name\shared_printer_name\ |
Selected driver | OKI24 |
Name of link file | /MYAPP/P1 |
Name of file/device | >lp -d queuename -c -s 2>/dev/null |
Selected driver | EPSON |
Name of link file | SPOOL |
Name of file/device | /tmp |
Selected driver | spooler |
Name of link file | WINDOWS |
Name of file/device | [wdx]*winprt* |
Selected driver | myprog |
De naam van de Link File is volledig uw keuze. De naam van ‘het andere bestand of poort’ is een naam die je in PxPLUS moet kunnen openen. Dus fysieke poorten (LPT1), of spoolqueue’s (>lp -dxxx -s ..), of UNC-namen (\\SERVER\PRINTER), of TCP/IP-poorten ([TCP]1000;), ODBC-verbinding, enzovoort …
De Device Driver is een CALL-programma dat zich moet bevinden in de ‘*dev’ directory. Je bent vrij om er zelf eentje te maken.
Een PxPLUS Device Driver is een ‘CALL’-programma om een bestand of poort, eens geopend, te initialiseren en te prepareren.
Voorbeeld:
Name of ‘link’ file | LP |
Name of file/dev. | /dev/lp0 |
Selected driver | OKI |
OPEN(1)”LP”
Dit zou hetzelfde zijn als :
OPEN(1)”/dev/lp0″
CALL “*dev/OKI”
SETFID (1)”LP”
‘OKI’ is enkel maar een PxPLUS programma. Van alles en nog wat kun je erin doen. Je kunt andere bestanden openen. Je kunt de gebruiker bepaalde dingen laten invoeren. Je kunt andere ‘CALL’s laten uitvoeren. Alles wat je in een gewone CALL kunt doen, kun je hier ook.
Bekijk eens een Device Driver, zoals HPLASER. Dus, LOAD “*dev/hplaser”.
In het begin staat er een regel die begint met DEFTTY (LFO) cols,rows of DEFPRT (LFO) cols,rows.
DEFTTY and DEFPRT vertellen PxPLUS dat het om een scherm of een printer gaat. Zonder dit denkt PxPLUS dat het een bestand is. Dus zo weet PxPLUS dat ze de FIN() in TERMINAL formaat moeten teruggeven indien DEFTTY gebruikt en dus FIN() in PRINTER formaat, indien DEFPRT.
COLS en ROWS dienen ook voor de FIN() en voor functies zoals MXC() en MXL().
LFO en LFA zijn twee systeemvariabelen, zoals DAY of SSN.
LFO staat voor Last File Open en LFA staat voor Last File Accessed.
Een simpel programma, zoals ‘*dev/hplaser’, toont u dat je zelf mnemonics kunt maken. Ze bestaan zo lang het kanaal geopend blijft en zijn dus specifiek voor dat kanaal.
Met de functie MNM() kunt u de waarde van een mnemonic lezen en dus hergebruiken voor een ander kanaal.
Bv.: Je definieert de ‘PS’ en ‘PE’ mnemonic voor je scherm.
In de Device Driver voor je ‘slave’ printer kun je dan de ‘PE’ en ‘PS’ mnemonics halen van kanaal 0 (jouw scherm) en ze toepassen op je printer kanaal.
Verder zijn er enkele mnemonics met een speciale betekenis.
‘*C’ is een mnemonic die automatisch gestuurd wordt als het kanaal gesloten wordt.
Meestal zet men daar de ‘reset’ codes om de printer te initialiseren.
In ‘*R’ kan je een OS bevel stoppen dat zal uitgevoerd worden als het kanaal gesloten wordt. Bv.: ‘ rm /tmp/lock_file ‘
En dan heb je nog ‘*I’ en ‘*O’. Als je ‘mapchan’ van UNIX kent, begrijp je wat *I en *O kunnen doen.
‘*I’ is een input-conversie tabel en ‘*O’ is een output-conversie tabel.
Hiermee kun je dus bepaalde tekens veranderen in andere tekens bij in- en/of uitvoer.
bv. MNEMONIC ‘*O’=$00 01 02 03.. .. ..1C 1D 1E 1F 2E 21 22 .. .. .. .. .. FE FF$
Deze tabel zal een ‘spatie’ als een ‘punt’ tonen. (De hex-waarde van een ‘spatie’ is $20$ en is vervangen door $2E$, een ‘punt’ )
Een voorbeeld van een meer complexe Device Driver zou kunnen zijn:
! My driver
PCHAN=LFO, PNAME$=FID(LFO)
CLOSE(PCHAN)
[ code die kijkt of er een lock-file bestaat ]
[ als de lock-file bestaat, doe een EXIT 14, zodanig dat de OPEN een ERROR=14 krijgt ]
[ code om een lock-file te creëren ]
[ code om een tijdelijk bestand te creëren : ‘MYOUTPUT’ ]
OPEN(PCHAN)”MYOUTPUT”
[ call het programma met de mnemonic definities ]
SETFID (PCHAN) PNAME$ ( ja, SETFID werkt ook op bestanden !)
EXIT
Een interessante functie die PxPLUS heeft is de OPT().
Als je een OPEN(KANAAL,OPT=”hallo”)NAAM$ doet, dan krijg je met de OPT(kanaal) de inhoud terug, dus ‘hallo’. Je kunt er eender wat instoppen bij de OPEN en terug uit halen in de Device Driver.
Voorbeeld:
Je hebt een Link File die noemt ‘LP’, ‘de andere poort’ is ‘/dev/lp0’ en de Device Driver is ‘myprog’
OPEN(1,ERR=stmt,OPT=”Controleer of het juiste papier geladen is !”) “LP”
<PxPLUS Intern>
[PxPLUS leest de ‘LP’ link file]
[Sluit het bestand ‘LP’]
[Opent ‘/dev/lp0’]
[Gebruikt SETFID om de naam te veranderen van ‘/dev/lp0’ naar ‘LP’]
[Call “*dev/myprog”]
<In ‘*dev/myprog’>
options$=OPT(LFO)
[options$ is nu ‘Controleer of het juiste papier geladen is !’]
IF NOT(NUL(OPTIONS$)) MSGBOX OPTION$,”Boodschap”
[call program EXITS]
<PxPLUS intern>
[Geeft eventuele EXIT numval door aan de OPEN]
Een funktie die weinig personen kennen is de SETDEV TSK().
Wie reeds met BBx gewerkt heeft, baseert zich nog al eens op de TSK() om een lijst met printers te generen. Met PxPLUS kunnen we dit emuleren.
Met dit bevel kun je de TSK() laden, zodat de TSK() funktie die inhoud teruggeeft die je verwacht alsof het BBx zou zijn. Klein nadeel is dat je een TSK() niet kunt wissen.
SETDEV TSK() $0100$+”LP”+$00$+”>lp -dq1 %COPIES% -s 2>/dev/null” +$00$
SETDEV TSK() $0100$+”P1″+$00$+”/dev/lp1″+$00$
De inhoud krijg je terug met het bevel X1$=TSK(0) en X2$=TSK(1)
Je ziet het, praktisch alles kan in een Device Driver.
Bekijk even ‘*dev/spool’. Als ‘het andere bestand’ wordt er een directory naam verwacht. De directory wordt gesloten, er wordt een tijdelijk bestand gemaakt in deze directory en de naam wordt teruggezet zoals ie was. Alle ‘print’s komen in dit tijdelijk bestand terecht en zodra het kanaal gesloten wordt, wordt het OS-bevel ‘>lp -d…’ gestart via de mnemonic ‘*R’. Je kunt meerdere bevelen in ‘*R’ stoppen. Je moet ze dan scheiden door een ‘;’ zoals elk OS-bevel.
Een speciale Device Driver is ‘*dev/windows’. Deze wordt gebruikt door ‘PxPLUS voor Windows’.
Verander dit programma liefst niet ! Eigenlijk verander je best nooit een driver in ‘*dev’, want indien je een nieuwe versie van PxPLUS installeert, dan worden uw veranderingen overschreven. Je kunt wel copies maken onder een andere naam en die veranderen naar wens. Als je iets specifieks wil doen, doe het dan in de ‘lib/_udev’ directory. (Indien hij niet bestaat, mag je die directory creëren)
PxPLUS kijkt altijd in deze directory of ze eenzelfde terminaldriver vinden. In dit geval dus ‘WINDOWS’. Als er daar een is, dan zal hij uitgevoerd worden.
bv.: Je wil blauwe letters op een witte achtergrond.
Maak dan een programma ‘*udev/windows’
0010 ! Windows
0020 print ‘blue’,’_white’,’df’,’cs’,
0030 exit
>save”*udev/windows”
>start
Eigenlijk is het alleen maar ’terminologie’. Het hele idee van Link Files en Device Drivers is vrij simpel, omdat … alles mogelijk is. Je kunt alles doen wat je maar kunt inbeelden… omdat het ‘maar’ een CALL-programma is. Link Files zijn slechts een manier om een ALIAS naam te geven aan een bestand of poort of .< vul zelf in >
(Originele tekst van Gord Davey, herwerkt en aangevuld door Tino Vanholst)