Základy práce se soubory
Tisk souboru
 Tisk

Tisk souboru


Vstupní soubor je sekvenčně čten, komponenta po komponentě je transformována do tiskové podoby. Provádí se ošetření stránkování, tisk hlaviček a patiček.


Pro rozdělení souborů se používají tyto standardní procedury a funkce:


assign, reset, read, close

Nejjednodušší tiskové programy mají za úkol převedení informací ze sekvenčních souborů do tvaru vhodného pro zobrazení na znakové tiskárně. Bez ohledu na typ znakové tiskárny je třeba si uvědomit, že rozměr papíru je konečný, a to jak do šířky, tak i do délky papíru.


Šířka stránky je dána typem tiskárny, typem použitého písma, standardně je šířka 80/132 znaků na rychlotiskárnách, na jehličkových tiskárnách lze tisknout i více znaků. V grafickém módu lze na tiskárnách tisknout drobnějším nebo naopak zvětšeným písmem. Standardně lze oproti psacímu stroji (60 úhozů na řádku) počítat 72 znaků na běžnou šířku stránky A4 na výšku. Využití větších šířek papíru činí problémy s archivací a přenosem v aktovkách, užívají se i speciální pořadače na rozšířený nebo dvojitý A4 formát. Všeobecně lze maximálně doporučit tisk na standardní formát.


V tiskárnách se používá jednak nekonečný papír, jednak jednotlivé stránky. Nekonečný papír po stranách vybavených perforací, je rozdělen naříznutím na jednotlivé stránky formátu nepatrně většího než A4 na výšku. Toto zvětšení je obvykle užito pro strojové rozdělení a oříznutí na běžný A4 formát. Tiskárny standardně vynechávají na konci stránky a na začátku stránky malý prostor pro toto oříznutí i bez programového řešení. Tuto funkci lze u tiskárny s nekonečným papírem vypnout, např. pro tisk souvislého grafu nebo tabulky dvojité výšky. Standardně se počítá maximální počet řádek na stránce 60-65.


Tisknout lze na čistý nebo předtištěný papír. Při tisku na předtištěný papír (na rychlotiskárně) se většinou jedná o větší počet stran a program musí na začátku vytisknout zkušební stránku(y), dotázat se operátora, zda je tiskárna dobře nastavena. Ten ji eventuálně mechanicky přestaví a potvrdí správné nastavení. Teprve potom lze kvalitně tisknout data do formuláře. Pro tyto obtíže se pro menší počet tištěných stránek dává přednost tisku na čistý papír, kdy se formulář dotiskne k datům. Proto jsou vhodné tiskárny v grafickém modu.


Každou stránku lze rozdělit na tyto hlavní části:


Hlavička se tiskne na začátku každé stránky a obsahuje datum, čas, číslo stránky, jméno projektu, jméno sestavy. Obtížně se tiskne celkový počet stran sestavy, neboť to by vyžadovalo nejdřív tisknout celou sestavu do souboru a spočítat počet stran a potom v druhém průchodu doplnit celkový počet stran na každou stránku.

Vlastní informace se tisknou do jedné nebo více řádek. Více řádek se používá, pokud se informace o určité datové entitě nevejde do jedné řádky, přitom je třeba dát pozor na čitelnost sestavy vhodným rozmístěním datových polí, tiskem prázdných řádek, odsazením v pokračujících řádkách tak, aby byl jasně vidět identifikační údaj.


V setříděných sestavách ekonomických dat se provádí tisk mezisoučtů změně části identifikačního údaje. Například pokud se tisknou ekonomické výkony za závod, provoz, dílnu a stroj, tiskne se jeden mezisoučet při změně dílny za danou dílnu, druhý při změně provozu za daný provoz, při změně závodu za celý závod a nakonec výkon za celou společnost.


Tisk patičky se provádí na konci každé stránky. Je vhodné, aby patičky obsahovaly vysvětlivky a zkratky použité na dané stránce a tím zvýšily čitelnost sestavy i bez manuálu.


Na konci každé sestavy je třeba tisknout zprávu o konci sestavy, např. celou řádku znaků, řetězec „Konec sestavy“ apod. To je nutné zejména tehdy, je-li sestava dělena na samostatné stránky a je třeba mít jistotu, že jde opravdu o konec a neschází náhodou několik řádek na poslední stránce. Dále lze na poslední stránku umístit souhrnné vysvětlivky a sdělení pro uživatele.


Stránkování lze řídit jednoduchým algoritmem. Na začátku programu je třeba do čítače řádek na stránce umístit dostatečně velké číslo. Před každým tiskem tiskové řádky nebo související skupiny otestovat, zda čítač řádek nepřevyšuje maximální počet řádek na stránce. Pokud ano, pak se tiskne patička (s výjimkou 1. tisku), stránkuje se, tiskne se hlavička a nuluje se čítač řádek. Po tisku řádky nebo skupiny řádek se čítač řádek patřičně inkrementuje. Inkrementaci je třeba provést i při tisku mezisoučtů. V konzolové aplikaci se tisk stránky provádí odesláním znaku o ordinální hodnotě 12 (FF, Form Feed).


Následující příklad pro tisk souboru s udaným typem záznam. Jedná se o část úlohy na automatické zpracování telefonního seznamu. Je uveden příklad, vstupní data a ukázka výstupní sestavy. V příkladu je vykomentářováno stránkování.



program teltisk;

{/**

*

* Autor: Kopecek     Datum: 2.10.2003

*

* Funkce: Tisk zmen. telefonniho seznamu

*

**/}

uses

     sysutils;

const

     NAME_LEN = 25;

     ADRE_LEN = 45;

     NUM_LEN = 8;

     MAXRADEK = 6;


type

     typ_jmeno = array[1..NAME_LEN] of char;

     typ_adresa= array[1..ADRE_LEN] of char;

     typ_cislo = array[1..NUM_LEN] of char;


     typ_zmen = record

        typ    : char;

        dvoutecka: char;

        jmeno : typ_jmeno;

        adresa : typ_adresa;

        cislo : typ_cislo;

        znacik0: char;

        znacik1: char;

        znacik2: char;

     end;

var

    strana,radka:   integer;

    zmen:    typ_zmen;

    upd:     file of typ_zmen;

    prn:     text;


procedure tiskhlav(var r,s:integer);


begin

        {if s > 0 then write(prn,chr(12)); }{strankovani}

        r := 0;inc(s);

        writeln(prn);

        write(prn,

'Projekt: PPVS/teltisk       Prehled zmen telefonu          Datum:   ');

        writeln(prn,DateToStr(Date));

        write(prn,

'Sestava:01                  =====================          Cas:     ');

        writeln(prn,TimeToStr(Time));

        write(prn,

'                                                           Strana:',strana:3);

        writeln(prn);

        writeln(prn,

'typ jmeno                  adresa                                     cislo');

        writeln(prn);

end;


procedure tiskzmen(s:typ_zmen);

var i:integer;

begin

     write(prn,s.typ);

     write(prn,s.dvoutecka);

     for i := 1 to NAME_LEN do write(prn,s.jmeno[i]);

     for i := 1 to ADRE_LEN-2 do write(prn,s.adresa[i]); {-2 kvuli sirce papiru}

     for i := 1 to NUM_LEN do write(prn,s.cislo[i]);

     writeln(prn);

end;


{ Uvodni sekce - otevreni souboru }


begin

assign(upd,'telef.upd');

{$i-}

reset(upd);

{$i+}

if ioresult <> 0 then begin

    writeln('Chyba pri otevirani souboru telef.upd');

    exit;

end;

assign(prn,'teltisk.prn');

rewrite(prn);

radka := 100;

strana:= 0;


{Hlavni zpracovani}


while not eof(upd) do begin

        read(upd,zmen);

        if radka > MAXRADEK then tiskhlav(radka,strana);

        tiskzmen(zmen);

        inc(radka);

end;


{Zaver programu - tisk zaveru sestavy a zavreni souboru}


writeln(prn);

writeln(prn,'KONEC ZPRACOVANI TELEFONNIHO SEZNAMU');

close(prn);

close(upd);

end.


Příklad vstupního souboru:


V:Bond James               U Viktora Kozeneho, Bahamy                   007     *

R:Klos Hans                Cholera 123, Varsava                         456258 *

Z:Goldring Heinrich        rue Victoire 111, Boneville                  456     *

V:Stirlitz Joachim von     Unter den Linden, Berlin                     45678912*

V:Minarik Pavel            kdesi ve skrytu                              95175345*

V:Philby Kim               Oxford Street, London                        1112223 *

V:Wennerstroem Eric        Tukholma 5, Stockholm                        55544466*

V:Kosmodemjanskaja Zoja    Prospekt Lenina 111, Moskva                  14725833*

V:Hari Mata                rue d'Austerlitz 1, Paris                    11122277*



Příklad výstupní sestavy:



Projekt: PPVS/teltisk       Prehled zmen telefonu          Datum:   10.10.2003

Sestava:01                  =====================          Cas:     18:27:27

                                                           Strana: 1

typ jmeno                  adresa                                     cislo


V:Bond James               U Viktora Kozeneho, Bahamy                 007

R:Klos Hans                Cholera 123, Varsava                       456258

Z:Goldring Heinrich        rue Victoire 111, Boneville                456

V:Stirlitz Joachim von     Unter den Linden, Berlin                   45678912

V:Minarik Pavel            kdesi ve skrytu                            95175345

V:Philby Kim               Oxford Street, London                      1112223

V:Wennerstroem Eric        Tukholma 5, Stockholm                      55544466


Projekt: PPVS/teltisk       Prehled zmen telefonu          Datum:   10.10.2003

Sestava:01                  =====================          Cas:     18:27:27

                                                           Strana: 2

typ jmeno                  adresa                                     cislo


V:Kosmodemjanskaja Zoja    Prospekt Lenina 111, Moskva                14725833

V:Hari Mata                rue d'Austerlitz 1, Paris                  11122277


KONEC ZPRACOVANI TELEFONNIHO SEZNAMU