Printen in PxPLUS
PxPLUS voor Windows kent twee systeemprinters :
*WINPRT* en *WINDEV*
Beiden gebruiken de Windows spooler.
Met *WINPRT* wordt de printjob geïnterpreteerd door de WINDOWS print API en
via de printer driver in de spoolqueue geplaatst, zodat het uiteindelijke
bestand door de printer gedrukt kan worden.
*WINDEV* is een speciale interface voor de WINDOWS print spooler. Deze
interface interpreteert geen grafische mnemonics en stuurt alle tekens door naar
de printer, dus ook escape-sequenties.
Dit lijkt dus op de 'klassieke' manier van printen, alsof u de printer
rechtstreeks opent.
Samengevat:
U kiest voor *WINPRT* indien u grafisch wilt printen met 'fonted scalable
tekst', bitmaps, rechthoeken, lijnen, etc. maar ook gewone tekst kunt u hier
printen.
U gebruikt *WINDEV* indien u geen grafische mnemonics gebruikt, maar zelf de
printer instelt met per printer specifieke escape-codes en enkel tekst print.
Voorbeeld 1
OPEN (1) "*WINPRT*
.... snip ....
PRINT (1) 'FONT'(FONT$,int(C*.8)),
PRINT (1)'TEXT' (@x(X+66.5), @y(Y+.5), @x(X+75), @y(Y+2), FC$),
PRINT (1) 'PEN'(1,4,0),
PRINT (1) 'RECTANGLE' (@x(MX), @y(MY+5), @x(MX+20), @y(MY+7)),
Voorbeeld 2
OPEN (1) "*WINDEV*"
PRINT (1) 'BO',ESC+"(s12H",'EO', ! HP Laser 12 cpi mode. Gebruik altijd
,'EO' en nooit +'EO'
PRINT (1) TXT$
Bij het openen van *WINPRT* of *WINDEV* kunt u heel wat opties meegeven,
gescheiden door een 'punt-komma'
Een standaard 'OPEN' ziet er als volgt uit :
OPEN (1) "*WINPRT*"
PxPLUS zorgt er dan voor dat het standaard keuze scherm voor printers
opgeroepen wordt, zodat u een WINDOWS printer kunt kiezen en eventueel
eigenschappen kunt aanpassen, zoals aantal copieën, bladschikking, printen in
een bestand ed.
De gekozen printer en instellingen blijven gelden zolang PxPLUS actief is.
Om te weten welke WINDOWS printers er geconfigureerd zijn, gebruiken we
volgende instructie :
WINPRT_SETUP LIST X$
In X$ zit dan een lijst van alle lokaal geconfigureerde printers, gescheiden
door een komma.
Als u een specifieke printer wilt openen, zonder het keuzevenster op te roepen,
dan geeft u bij het openen - gescheiden door een 'punt-komma' - de naam van die
printer mee, zoals die in de 'WINPRT_SETUP LIST' lijst voorkomt :
OPEN (1) "*WINPRT*;Epson FX-80 on \\server1\queue1"
Deze instructie opent printer 'Epson FX-80' die gekoppeld is aan machine
'\\server1' en die daar bekend en gedeeld is onder '\queue1'.
PxPLUS kent een paar speciale 'queue'-namen : "ASIS", "DEFAULT"
en "SETUP".
"ASIS" opent de printer met de instellingen zoals ie voordien ingesteld was en
"DEFAULT" opent de printer met de standaard instellingen. In beide gevallen
wordt het printer keuze scherm niet getoond.
"SETUP" laat u wel toe een printer te kiezen, maar u komt dadelijk in het
venster met de eigenschappen.
bv.
OPEN (1) "*WINPRT*;ASIS"
Om de geselecteerde printer te kennen, tikken we in:
WINPRT_SETUP READ X$
Als u een bepaalde printer wilt instellen als zijnde de huidige printer:
WINPRT_SETUP WRITE "Epson FX80 on \\server1\queue1"
Dit doet u voordat u *WINPRT* opent.
En als u een printer wilt openen met bepaalde afwijkende eigenschappen,
zonder het WINDOWS printer keuze scherm te openen, dan geeft u het volgende in:
OPEN (1) "*WINPRT*;Epson FX80 on
\\server1\queue1;ORIENTATION=LANDSCAPE;COPIES=3"
of een variant zonder printernaam:
OPEN(1) "*WINPRT*;SETUP;ORIENTATION=LANDSCAPE"
Wil u weten hoe de huidige printer is ingesteld, dan tikt u in:
WINPRT_SETUP READ PROPERTIES P$
En om ze - eventueel veranderd - terug te zetten:
WINPRT_SETUP WRITE PROPERTIES P$
Eén van de printer-eigenschappen is OFFSET. De waarde die OFFSET ons geeft wordt
uitgedrukt in 1/1000 van een inch. Omdat PxPLUS de linker- en bovenmarge van
een printer niet kent, kan het zijn dat er kleine verschillen ontstaan tussen
diverse printers bij het drukken van dezelfde taak.
Het volgende bevel zet de linker marge op 1/2 inch, en de boven marge op 3/4
inch.
WINPRT_SETUP WRITE PROPERTIES "OFFSET=500:750"
Hiermee kunnen we de marges aanpassen aan onze wensen en alzo heel precies
bepalen waar de linker-boven hoek van het blad is en dus ervoor zorgen dan een
gedrukt woord op die plaats komt die we willen. Handig bij voorgedrukte
formulieren, waar tekst soms precies in een vakje moet passen. OFFSET aanvaardt
ook negatieve waarden.
Volgende code geeft u een lijstje van lettertypes die een bepaalde printer
ondersteunt:
CHAN=UNT
OPEN(CHAN)"*WINPRT*"
F$='FONT'(LIST *,CHAN)
PRINT F$
En als u van een bepaald lettertype wilt weten welke puntgroottes er zijn,
tik dan volgende regels in:
S$='FONT' (LIST "Arial" ,channel)
PRINT S$
Kies een bepaalde grootte uit deze lijst en maak dit de 'default'-font en
'default'-grootte:
PRINT (channel) 'FONT'("font_name",-font_size),'DF',
Let op de negatieve waarde bij de 'font size'.
Een negatieve grootte (<0) betekent: Gebruik deze puntgrootte.
Een positieve waarde betekent: Maak de puntgrootte zoveel keer groter (>1;) of
kleiner (0<X<1;) dan de 'default'-grootte.
bv:
PRINT (channel) 'FONT'("Arial",-10),'DF', =kies Arial 10pt
PRINT (channel) 'FONT'("Arial",0.75),'DF', =25% kleiner dan de vorige
'default'-instelling
PRINT (channel) 'FONT'("Arial",1.5),'DF', =50% groter dan de vorige
'DF'-instelling
Hiermee bepaalt u dus niet alleen de grootte van het lettertype maar ook
hoeveel karakters er op een lijn passen en hoeveel lijnen er op een blad gaan.
Met andere woorden: hoe kleiner het lettertype, hoe meer karakters op een lijn
en omgekeerd.
De PxPLUS MXC() en MXL() functies geven u het aantal karakters per lijn en het
aantal lijnen per blad.
Een - niet zo nauwkeurige - manier om uw printer zó in te stellen, zodat u
een gewenst aantal kolommen krijgt, gaat dan als volgt:
PRINT (chan)'FONT'("Arial",MXC(chan)/positions_required),'DF',
Let op: PxPLUS maakt een afronding naar de dichtstbijzijnde, ondersteunde
fontgrootte. Daardoor kan het zijn dat u niet het gewenste aantal kolommen of
lijnen heeft. Bekijk ons voorbeeld-programma "fontpick" (beschikbaar via onze
website bij 'ProvideX/freeware'), waarin het probleem onderschept wordt.
MXC() en MXL() kunnen per type printer toch verschillen, ondanks hetzelfde
lettertype en karaktergrootte. Allerlei factoren spelen een rol, zoals
papiergrootte, oriëntatie van het blad, offset, printerdriver ...etc.
We raden u aan om uw programma's zo te ontwerpen, dat ze rekening houden met
eventueel kleine verschillen.
Als u een tekst print - met *WINPRT* of *WINDEV* - en u sluit de printer, dan
zal de WINDOWS spooler automatisch een bladsprong toevoegen aan het einde van de
job. Daar is weinig tegen te doen, ondanks het feit dat u in Windows-NT de
mogelijkheid heeft om het datatype van de printer 'RAW' in te stellen.
U kunt rechtstreeks naar de poort 'LPT1' printen om een bladsprong te
vermijden, maar we raden u aan de UNC naam te gebruiken. UNC staat voor
Universal Naming Convention.
OPEN (1)"\\server_name\printer_name"
Bij het sluiten wordt er dan geen 'formfeed' gestuurd. Mocht de PRINT
instructie een ERROR=13 genereren, LOCK dan het kanaal nadat de printer geopend
is.
Let op dat de UNC's beheerd worden door het operating system en deze bepaalt dus
het gedrag van de UNC. (Formfeed gedrag kan in de toekomst veranderen)
Om uw rapport precies hetzelfde te maken op verschillende printers, zijn er
twee mnemonics die u hierbij kunnen helpen, nl. 'CPI'() and 'LPI'().
Beide functies aanvaarden een waarde per inch, en hiermee forceren we meer
precieze @X() en @Y() locaties, onafhankelijk van het gekozen standaard
lettertype.
Voorbeeld:
OPEN(1)"*WINPRT*"
PRINT (1)'FONT'("Courier New",-10),'DF',
PRINT (1)'CPI'(10),'LPI'(6),
Dus, de eerste PRINT instructie zet lettertype 'Courier New', karaktergrootte
'10 punt' en maakt dit default. De tweede PRINT forceert 10 karakters per inch
en 6 lijnen per inch. Dit verandert niets aan de default font, maar het
verandert wel de interne berekening naar echte pixel coördinaten. In dit
voorbeeld, een PRINT @X(10), komt dan precies op 1 inch afstand vanaf de
linkermarge, een PRINT @X(25), komt dan op 2.5 inch afstand enz...
Hetzelfde geldt voor 'LPI'().
Gebruikersvragen
V: Kun je - eenmaal begonnen met een printprogramma - een
taak afbreken, en ervoor zorgen dat niets naar de printer gaat ?
A: Om een printjob te onderbreken, stuurt u een 'AB' mnemonic naar het
*WINPRT* kanaal. Alle PRINT's worden dan vergeten. Het kanaal blijft wel open.
V: Hoe weet ik welke printer als 'huidige' printer is
ingesteld ?
A: Geef volgende instructie :
WINPRT_SETUP READ A$
en A$ bevat de naam van de printer die u zoekt.
V: In Windows, hoe vind ik de 'default' printer ?
A: Windows bewaart de 'Default Printer' in de WIN.INI file. PxPLUS biedt u
een utility om in 'INI' files te lezen (en te schrijven).
CALL "*INIFILE;READ", "WIN.INI", "Windows", "Device", "", default_prt$,
80
PRINT default_prt$
V: Hoe kan ik lokale printers gebruiken als ik met WindX werk
?
A: Om toegang te hebben naar de printers die uw lokale PC heeft, voegt u de
prefix [WDX] toe aan de naam van de printer.
Voorbeeld:
OPEN (1)"[WDX]*WINPRT*"
or OPEN (1)"[WDX]*WINDEV*"
or OPEN (1)"[WDX]LPT1"
V: Hoe weet ik wanneer ik met WindX werk en wanneer niet,
zodat mijn programma eenvormig is bij het openen van de printer ?
A: Volgende instructie vult %WDX$ of maakt 'm leeg, naargelang u met WindX
werkt of niet. U kunt deze regel bv. in uw startprogramma plaatsen, vermits een
'%'-variabele globaal is.
IF MID(MSE,22,1) > $00$ AND MID(MSE,22,1) < $FF$ THEN LET %WDX$ = "[WDX]"
ELSE LET WDX$ = ""
In uw programma opent u de printer als volgt:
OPEN (CHAN) %WDX$ + "*WINPRT*"
V: Hoe kan ik een printer openen en sluiten, zonder dat de
Windows spooler een bladsprong uitvoert ?
A: Voeg 'INPUT' toe aan de 'OPEN'
OPEN INPUT (chn) "*WINPRT*"
Dit laat u toe een printer te openen, maar u kunt geen document starten.
Hiermee kunt u bv. testen of een printer beschikbaar is en welke lettertypes hij
ondersteunt
'FONT'(LIST *,chn)
De INPUT clausule bepaalt dat de printer in 'Query' mode is.
V: Hoe aligneer ik mijn kolommen ?
A: PxPLUS kent enkele mnemonics die u hierbij helpen :'JR', 'JD' en 'JL'.
Dit staat voor 'Justify Right, Decimal en Left'.
Vroeger was er alleen maar 'fixed font', dus de lengte van 'www' zou even lang
zijn als 'iii'. In Windows, met z'n 'truetype variable fonts', ziet u dadelijk
dat de letter 'w' veel langer is dan de letter 'i'.
Dit geldt ook voor cijfers, alhoewel sommige fonts bijna geen verschil geven.
(voorbeeld met Georgia 12pts, waarbij wel zichtbaar verschil)
1234567890
1111111111
3333333333
5555555555
7777777777
9999999999
0000000000
U ziet (hopelijk) dat de rechter kantlijn van de kolom niet mooi onder elkaar
staat, ondanks dat er overal 10 cijfers staan. Om dit rechts te aligneren past u
'JR' toe.
PxPLUS berekent het eindpunt alsof het een 'fixed font' was. b 10 karakters
aan 10 cpi is dus 1 inch afstand. Dan wordt de effectieve lengte van het getal
berekend.
Bij '1111111111' is dit b 0.7 inch, bij '9999999999' is dit misschien 0.9 inch.
Dan trekt men dit getal af van het eindpunt (1 inch) en PxPLUS kent het
beginpunt, dus 0.3 inch en 0.1 inch.
De 'JD' mnemonic is een variant hierop. In plaats van het einde van het getal
te aligneren, wordt er gekeken of er een decimale punt in het getal zit, en zo
ja, dan wordt hierop gealigneerd. Deze mnemonics werken enkel goed als de output
een vaste lengte heeft. U moet dus een masker gebruiken om de output te
formatteren.
En, vergeet het volgende niet .....
PxPLUS heeft twee lagen (layers) waarop de PRINT output terecht komt. De
'TEXT'-laag en de 'GRAPHIC'-laag.
Een PRINT (x) "ABCD" komt in de text-laag en een
PRINT (x)'TEXT'(x,y,"ABCD") komt in de graphic-laag terecht.
Met andere woorden: grafische mnemonics, zoals 'FONT', 'PICTURE', 'LINE'...
komen in de grafische laag terecht en deze ligt bovenop de text-laag.
Er is echter één uitzondering hierop.
De 'FONT'() gevolgd door een 'DF'. Deze stelt de 'default' font hoogte en
breedte in, in de text-laag. Alle gewone PRINT bevelen zullen deze instelling
dan gebruiken, tot u een andere 'FONT'+'DF' instelling uitvoert.
Bedenk ook dat de X en Y coördinaten gebaseerd zijn op deze instelling van de
text-laag.