Programování tisků a řízení tiskárny
Příkazy tisku
Ve
FoxPro je velká nabídka příkazů pro tisk sestav (výsledků). Nutno zdůraznit,
že mezi zobrazováním na obrazovce a tiskem výsledků činnosti programu nebo
jejich zaznamenáním do souboru jsou z hlediska programování ve FoxPro 2.0
pouze rozdíly plynoucí z technických možností jednotlivých zařízení.
Například příkaz @ řádek,sloupec SAY ... se nemůže u tiskárny vracet na
předchozí řádek. Když má programovaný řádek příkazu menší hodnotu
než je počet vytisknutých řádků, pak tisk je proveden na nové straně.
Existují
však speciální příkazy pro tisky, které se mohou použít při zobrazování.
To má velikou výhodu, že sestavy lze odladit bez plýtvání papíru.
FoxPro
má dva nástroje typu low lever case (REPORT a LABEL) pro programování sestav
s tiskem mezivýsledků a možností použití jednoduché semigrafiky a typů písma.
Produkty těchto nástrojů pokryjí většinu praktických aplikací.
V
profesionální praxi se programátor neobejde bez znalosti následujících příkazů.
Jsou jednoduché, rychlé a v praxi velice oblíbené příkazy, které vyhodnotí
a vytisknou výsledek výrazů.
? | ?? [<expr1>
[PICTURE <expC1>] [FUNCTION <expC2>] [AT
<expN>]
[STYLE <expr>] [, <expr2>]] ...
? tisknee na nový řádek,
?? od aktuální pozice na výstupním zařízení. Směrování výstupu se řídí
nastavením příkazů SET PRINTER a SET CONSOLE. Tvar výstupu je možno
upravovat zadáním klauzulí FUNCTION a PICTURE - popis viz @ ... SAY/GET. V
klauzuli FUNCTION lze v tomto příkazu použít speciální kód V<n>,
který umožní zadat vertikální uspořádání výstupu. Hodnota <n> určuje
maximální počet sloupců, které výstup zabere. Klauzulí AT se určí
sloupec, od kterého se začne výstup zobrazovat. Klauzulí STYLE se zadává
typ a velikost písma pro výstup na tiskárnu - při výstupu na obrazovku se
ignoruje.
? "Datum:", DATE(), "."
Pro řízení tiskáren pomocí
řídicích kódů (takzvaných escape sekvencí) se používá příkazu:
??? <expC>
který nemění hodnotu aktuální
pozice řádku ani sloupce. Ve výrazu <expC> lze použít funkce CHR()
nebo kód uzavřený do složených závorek { }.
??? CHR(27)+CHR(15)
Kreslení rámečků a čar
se provádí příkazem:
DEFINE BOX FROM <sl1> TO <sl2>
HEIGHT <expN1>
[AT LINE <expN2>]
[SINGLE | DOUBLE | <definice rámečku>]
Nakreslení rámečku lze použít
pouze ve spojení s příkazy ? nebo ??, nikoliv s příkazy @ ... SAY. Šířka
rámečku je zadaná levým a pravým sloupcem <sl1> a <sl2>, výška
parametrem <expN1>, polohu horní hrany lze zadat parametrem
<expN2>, standardní hodnota je aktuální číslo řádku. Výška rámečku
je ještě ovlivňována hodnotou systémové proměnné _PSPACING. Rámeček může
být jednoduchý, dvojitý nebo zadaný řetězcem <definice rámečku>
(bližší popis viz SET BORDER). Pro vykreslení rámečku je třeba nastavit
systémovou proměnnou _BOX = .T. a příkaz SET PRINTER ON.
DEFINE BOX FROM 1 TO 32 HEIGHT 10 DOUBLE
Příkazy a funkce pro programové
řízení tisku
Tisk
se programově řídí pomocí speciálních příkazů a funkcí a měněním
obsahu systémových proměnných. Jména systémových proměnných začínají
znakem podtržení. Funkce systémových proměnných budou probrány spolu s příkazy
a funkcemi, ve kterých se používají. Okamžitá poloha na výstupu se zjišťuje
funkcemi:
PROW()
PCOL()
které vrací číslo aktuálního
řádku a sloupce na "tištěné" straně, (analogicky jako funkce
ROW() a COL() v okně). Hodnota je relativní vzhledem k nastavenému levému
okraji (SET MARGIN) nebo proměnné _PLOFFSET.
@ PROW(), PCOL()+1 SAY "...."
Provedení zadaného příkazu
v okamžiku naplnění určeného počtu řádků stránky výstupu (obvykle příkaz
volání procedury nebo funkce) se programuje:
ON PAGE [AT LINE <expN> <příkaz>]
Počítání řádků se provádí
v systémové proměnné _PLINENO. V okamžiku překročení hodnoty
<expN> se provede činnost zadaná příkazem. Příkaz ON PAGE může být
též vyvolán jako efekt při provádění příkazu EJECT PAGE. ON PAGE bez
parametrů ruší předchozí nastavení příkazu.
ON PAGE AT LINE 24 do obrazek
Nastavení tiskárny na další
stranu se programuje příkazem:
EJECT
Přesná funkce příkazu závisí
na obsahu systémové proměnné _PADVANCE. Příkaz nemá vliv na obsah proměnných
_PAGENO nebo _PLINENO.
EJECT PAGE
příkaz provede čtyři činnosti:
-
zapíše prázdné řádky chybějící do konce strany (počet rádků je dán
rozdílem mezi obsahem systémové proměnné _PLENGTH, která obsahuje délku
strany a systémové proměnné _PLINENO, která obsahuje aktuální počet řádků
na straně) prázdných řádků na obrazovku a nebo do souboru, který byl přiřazen
příkazem SET ALTERNATE,
-
nastaví novou stránku na tiskárně (když je připojena),
-
zvětší o jedničku systémovou proměnnou _PAGENO,
-
nastaví na nulu systémovou proměnnou _PLINENO .
Funkce příkazu souvisí s
nastavením systémové proměnné _PADVANCE a s příkazem ON PAGE: Je-li
_PADVANCE="LINEFEEDS", příkaz ON PAGE byl vyslán a obsh proměnné
_PLINENO je menší než číslo řádku zadané v příkaze ON PAGE, provede
se:
-
potřebné množství nových řádků na tiskárnu, obrazovku a eventuálně do
souboru přiřazeného příkazem SET ALTERNATE tak, aby byla nastavena nová
stránka. Je-li _PADVANCE="LINEFEEDS", příkaz ON PAGE nebyl vyslán
a proměnná _PLINENO je větší než číslo řádku zadané v ON PAGE,
provede se:
-
_PLENGTH-_PLINENO nových řádků se vyšle na tiskárnu, obrazovku eventuálně
do souboru (SET ALTERNATE).
-
_PAGENO se zvětší o jedničku.
-
_PLINENO se nastaví na nulu.
Podmíněné nastavení tiskárny
na novou stránku.
**EJECT PAGE **
Výpis obsahu databázového souboru
Pro
výpis položek nebo výrazů databáze je výhodné použít příkaz:
LIST [FIELDS <seznam výrazů>]
[<rozsah>] [FOR <expL1>]
[WHILE <expL2>]
[OFF] [TO PRINTER | TO FILE
<soubor>]
[NOCONSOLE] [NOOPTIMIZE]
Příkaz má standardně
hodnotu rozsahu všechno (ALL). Věty označené ke zrušení se při nastavení
SET DELETED ON nevypisují. Klausule NOCONSOLE potlačí výstup na obrazovku.
Použití nástrojů pro tvorbu
sestav
Ve
foxpro existují výkonné nástroje, které nevatvářejí program, ale speciální
soubor obsahující dedinifci tisku ve tvaru tabulky.
Programování sestav se
nejrychleji programuje příkazem:
CREATE REPORT <soubor1> | ?
[NOOVERWRITE] FROM <soubor2>
[FIELDS <seznam položek>]
[FORM | COLUMN]
[ALIAS | NOALIAS] [WIDTH
<expN>]
příkaz vytvoří definici
jednoduché výstupní sestavy. Standardní přípona definice je FRX .
NOOVERWRITE zamezí vytvoření definice sestavy, pokud <soubor1> již
existuje. FROM <soubor2> specifikuje jméno databázového souboru, podle
jehož struktury má být sestava definována. Soubor nemusí být otevřen.
FORM uspořádá sestavu po řádcích (každá položka jeden řádek), COLUMN
(implicitní) po sloupcích. ALIAS způsobí uvedení jmen databázových položek
včetně jmen alias. WIDTH <expN> specifikuje šířku sestavy v počtu
sloupců.
CREATE REPORT vypis FROM seznam
Následující příkaz není
analogií předchozího, jelikož zahajuje proces interaktivního vytváření
souboru (.FRX) s definicí výstupní sestavy
CREATE REPORT [<soubor> | ?]
[[WINDOW <okno1>]
[IN [WINDOW] <okno2> |
SCREEN]]
CREATE REPORT vyhodnoceni
Úprava definice sestavy se
provádí interaktivně příkazem:
MODIFY REPORT [<soubor> | ?]
[[WINDOW <okno1>] [IN [WINDOW]
<okno2> | SCREEN]]
[NOENVIRONMENT]
[NOWAIT]
[SAVE]
NOENVIRONMENT potlačí
obnovení prostředí, ve kterém byl soubor s definicí výstupní sestavy vytvářen.
Při neuvedení fráze je prostředí automaticky obnoveno (za předpokladu, že
bylo uloženo ve fázi vytváření). SAVE ponechá po ukončení příkazu na
obrazovce pasivní obraz okna s návrhem výstupní sestavy.
MODIFY REPORT vypis NOENVIRONMENT
Vlastní tisk setavy podle
souboru s definicí provádí příkaz:
REPORT [FORM <soubor1> | ?]
[ENVIRONMENT]
[<rozsah>] [FOR <expL1>]
[WHILE <expL2>]
[HEADING <expC>] [PLAIN]
[NOEJECT]
[SUMMARY] [PREVIEW]
[NOCONSOLE] [PDSETUP]
[NOOPTIMIZE]
[TO PRINTER | TO FILE
<soubor2>]
FORM <soubor1>|?
specifikuje soubor s definicí sestavy (standardní přípona .FRX). ENVIRONMENT
obnoví prostředí, ve kterém byl soubor s definicí sestavy vytvářen. Předpokladem
je jeho uložení ve fázi vytváření, kdy se uloží všechny informace o
otevřených databázových a indexových souborech a nastavených vazbách.
Pokud nelze využít ENVIRONMENT, pak musí být zdrojové databázové soubory
a jejich indexové soubory otevřeny včetně nastavení potřebných vazeb mezi
soubory. HEADING <expC> určuje dodatečnou hlavičku každé stránky
sestavy. PLAIN omezí výpis hlaviček stránky pouze na první stránku
sestavy. NOEJECT potlačí přechod na novou stránku před zahájením tisku.
NOCONSOLE potlačí při tisku sestavy její výstup na obrazovku. PREVIEW
provede výstup sestavy na obrazovku (netiskne se). SUMMARY omezí výpis pouze
na součtové a mezisoučtové řádky. TO PRINTER | TO FILE <soubor2>
provede směrování výstupu na tiskárnu nebo do souboru zadaného jména.
PDSETUP použije nastavení tiskárny - viz dialog Report.
REPORT FORM vyhodnoceni TO PRINTER
Použití nástrojů pro tvorbu
jmenovek
Jmenovky
jsou speciální sestavy, které mají text umístěn ve vymezeném prostoru. Nástroje
pro tvorbu jmenovek se používají se při programování tisku adres (lepených
na poštovní zásilky), štítků materiálu ve skladech, k tisku rozborových
sestav, apod. Vytvoření definičního souboru jmenovek (standardně LBX),
zabezpečuje příkaz:
CREATE LABEL [<soubor> | ?]
[[WINDOW <okno1>] [IN [WINDOW]
<okno2> | SCREEN]]
CREATE LABEL adresy
Změna souboru definice
jmenovek se programuje příkazem:
MODIFY LABEL [<soubor> | ?]
[[WINDOW <okno1>] [IN [WINDOW]
<okno2> | SCREEN]]
[NOENVIRONMENT]
[NOWAIT]
[SAVE]
Klauzule jsou stejné jako u
příkazu MODIFY REPORT.
MODIFY LABEL adresy NOENVIRONMENT
Vlastní tisk jmenovek se
programuje příkazem:
LABEL [FORM <soubor> | ?]
[TO PRINTER | TO FILE
<soubor2>]
[ENVIRONMENT]
[<rozsah>] [FOR <expL1>]
[WHILE <expL2>]
[NOCONSOLE] [SAMPLE]
[NOOPTIMIZE]
[PREVIEW] [PDSETUP]
Význam klausulí je stejný
jako u příkazu REPORT.
LABEL FORM adresy TO PRINTER
Řízení tiskárny
Příkaz
pro určení výstupného zařízení (výběru tiskárny) má čtyři
modifikace:
SET PRINTER ON | OFF
přepne výstup na tiskárnu,
(neplatí pro příkazy @ ... SAY, u nich nutno použít příkazu SET DEVICE).
Nastavení tiskárny lze testovat funkcí:
SYS(102)
která vrací nastavení příkazu
SET PRINTER (ON nebo OFF).
SET PRINTER TO [<soubor> [ADDITIVE] | <port>]
nasměruje výstup do souboru
nebo zadané výstupní zařízení (LPT1|2|3 nebo COM1|2). Výstupní soubor se
přepíše když nebude zadána fráze ADDITIVE.
SET PRINTER TO [\\<jméno stanice v síti>
\<jméno tiskárny sítě> =
<LPT1|2|3>]
přesměruje výstup na síťovou
tiskárnu.
SET PRINTER TO [\\SPOOLER [\NB] [\F = <expN>] [\B =
<expC>]
[\C = <expN>] [\P =
<expN>] [\S = <server>] [\Q = <queue>]]
příkaz určený pro síť
Novell Advance Netware (R) revision 2.00 nebo vyšší. \NB potlačuje tisk
titulní stránky; \F=<expN> číslo formátu (0 až 255); \B=<expC>
text titulní stránky (max. 12 znaků - standardně je jméno uživatele);
\C=<expN> počet kopií (1 až 255, implicitně jedna); \P=<expN> číslo
tiskárny (standardně nula); \S=<server> specifikace tiskárny, je-li v síti
u serveru připojeno více tiskáren (neuzavřené v uvozovkách);
\Q=<queue> umožní zadat jméno fronty pro zadanou tiskárnu (neuzavřené
v uvozovkách).
SYS(6)
Vrací jméno zařízení, na
které je směrován výstup příkazem SET PRINTER.
Nastavení hodnot prostředí
pro výstup na tiskárnu se programuje strukturou, která začíná příkazem
PRINTJOB a končí příkazen ENDPRINTJOB. Struktura inicializuje systémové
proměnné související s tiskem. Struktura má tvar:
PRINTJOB
<příkazy>
ENDPRINTJOB
PRINTJOB provede:
- vyšle inicializační
tiskové kódy uložené v proměnné _PSCODE.
- nastaví novou stránku,
je-li proměnná _PEJECT="BEFORE" nebo "BOTH".
- do proměnné _PCOLNO uloží
nulu.
ENDPRINTJOB provede:
- vyšle tiskové kódy pro
konec tisku uložené v proměnné _PECODE
(umožní tak vrátit stav před PRINTJOB).
- nastaví novou stránku,
je-li proměnná _PEJECT="AFTER" nebo "BOTH".
- provede znovu PRINTJOB,
je-li nastaven počet kopií v proměnné _PCOPIES.
PRINTSTATUS()
Funkce vrací .T., když je
tiskárna nebo zařízení definované pro tisk připraveno k tisku
SYS(13)
Vrací stav tiskárny (
"READY" - tiskárna je připravena, jinak "OFFLINE").
Přesná funkce příkazu závisí
na obsahu systémové proměnné _PADVANCE. Příkaz nemá vliv na obsah proměnných
_PAGENO nebo _PLINENO. Nastaví tiskárnu na začátek další stránky. Funkce
příkazu souvisí s nastavením systémové proměnné _PADVANCE a s příkazem
ON PAGE. Je-li _PADVANCE = "FORMFEED" a příkaz ON PAGE nebyl vyslán,
příkaz EJECT PAGE provede:
-
nastavení nové stránky na tiskárně (je-li připojena).
-
(_PLENGTH-_PLINENO) prázdných řádek na obrazovku a/nebo do souboru, který
byl přiřazen příkazem SET ALTERNATE.
-
systémová proměnná _PAGENO se zvětší o jedničku.
-
systémová proměnná _PLINENO se nastaví na nulu.
Je-li
_PADVANCE="LINEFEEDS", příkaz ON PAGE byl vyslán a obsah proměnné
_PLINENO je menší než číslo řádku zadané v příkaze ON PAGE, provede
se:
-
potřebné množství nových řádků na tiskárnu, obrazovku a eventuálně do
souboru přiřazeného příkazem SET ALTERNATE tak, aby byla nastavena nová
stránka. Je-li _PADVANCE="LINEFEEDS", příkaz ON PAGE nebyl vyslán
a proměnná _PLINENO je větší než číslo řádku zadané v ON PAGE,
provede se:
-
_PLENGTH-_PLINENO nových řádků se vyšle na tiskárnu, obrazovku eventuálně
do souboru (SET ALTERNATE).
-
_PAGENO se zvětší o jedničku.
-
_PLINENO se nastaví na nulu.
Podmíněné nastavení tiskárny
na novou stránku.
Vrací číslo aktuálního
sloupce na tiskárně. Hodnota je relativní vzhledem k nastavenému levému
okraji (SET MARGIN) nebo proměnné _PLOFFSET. Místo této funkce lze použít
speciální operátor $.
@ PROW(), PCOL()+1 SAY "...."
@ PROW(),PCOL()+1 SAY "...."
Vrací číslo aktuálního
řádku na tiskárně.
SET MARGIN TO <expN>
Určuje odsazení levého
okraje výstupu na tiskárnu. Hodnota <expN> se uloží do systémové
proměnné _PLOFFSET. Odsazení levého okraje je též ovlivňováno proměnnou
_LMAGRIN. Nastavení levého okraje tímto příkazem nemá vliv na výstupy příkazem
REPORT FORM. Implicitní hodnota je nula.
SET PDSETUP TO [[<expC> [, <expr1> [,
<expr2> ... ]]] [WITH
<expr3> [, <expr4> ...
]]]
Nastavuje soubor s
informacemi pro tisk. Soubor s informacemi pro tisk je kombinace programu pro
ovladač tiskárny a tiskových informací jako orientace stránky, implicitní
velikost a typ písma, nastavení okrajů atd. Jméno souboru <expC> je
uloženo ve zdrojovém souboru FoxPro (FOXUSER.DBF). Je možno ho vytvořit a pojmenovat
interaktivně v dialogu SET EDITING DIALOG. Jméno souboru se ukládá též do
proměnné _PDSETUP. Výrazy <expr1>, <expr2> ... jsou parametry pro
program ovladače tiskárny. Hodnoty výrazů <expr3>, <expr4> ...
jsou určeny pro naplnění systémového pole _PDPARMS.