JLABS

VaxNt/ProDB.PGuide.Soubory

Programátorská příručka.Práce se soubory

Bullet VaxNt není primárně určen pro práci se soubory, ale spíše s databází, formuláři apod. Nicméně se vždycky vyskytne nutnost textové soubory číst, zobrazovat nebo vytvářet. VaxNt k tomu účelu má celkem čtyři globální proměnné b,f,g a h. Jsou to tedy objekty, které existují mimo rámec skriptů a pokud tedy do těchto objektů skripty zapisují nebo čtou, jsou to vždycky tytéž soubory. Otevírání a uzavírání je samozřejmě možné v jakékoli úrovni skriptů Obvykle se tedy ve skriptu vytvoří výstupní report a jednotlivé složitější kapitoly mohou realizovat podřízené skripty.

Bullet Soubor b je binární a je rw, ostatní textové. Soubor f se používá na zápis a ostatní na zápis i čtení. Se soubory se ve skriptu nepřichází do styku explicitně, pouze vystupují jako prefixy funkcí. Tedy funkce "g.open" se snaží otevřít soubor g. Počet funkcí je dosti velký a vznikly postupně jako důsledek požadavků na různé triky.

BulletPřehled funkcí pro práci se soubory:


    Implicitní argumenty:
        fIndention - indentovací string, typicky prázdný. Vypisuje se před zápisem do f jako indentace.
        f - výstupní textový soubor

    Obsolentní nebo překonané funkce a zrovna tak i ty, které je možno nahradit jinými, se zde neuvádějí ...

    
    Otevírání, testování a mazání souborů:

        Funkce                  ArgList           Popis
        -------------------------------------------------------------------------------------------------------------
        f.exists                FileName          nastaví _PreviousResult na 1 nebo 0 podle toho zda FileName existuje
        f.erase                 FileName          zkusí vynazat FileName
        ?f.create               FileName,Label    otevře f na zápis nebo skočí na Label, pokud se to nepodaří 
        ?h.create               FileName,Label    otevře h na zápis nebo skočí na Label, pokud se to nepodaří 
        ?f.append               FileName,Label    dtto, ale s append
        ?g.open                 FileName,Label    dtto, ale pro g a na čtení 
        b.open                  FileName          pokusí se otevřít b jako file of byte a nastaví _PreviousResult
        b.create                FileName          dtto na zápis
        f.close                                   uzavře soubor
        g.close                                   dtto 
        h.close                                   dtto
        b.close                                   dtto
        -------------------------------------------------------------------------------------------------------------

    Ovládání automatické indentace:

        Funkce                  ArgList           Popis
        -------------------------------------------------------------------------------------------------------------
        f.indent+                                 fIndention:=fIndention+'  '
        f.indent-                                 Delete(fIndention,1,2)
        f.noindent                                fIndention:=''
        -------------------------------------------------------------------------------------------------------------


    Různé varianty zápisu do souborů:

        Funkce                  ArgList           Popis
        -------------------------------------------------------------------------------------------------------------
        f.write                 Arg               vypíše Arg a před ním ev. indentační string fIndention, udělá rovnou 
                                                  nový řádek
        f.wr                    Arg               vypíše Arg a před ním ev. indentační string fIndention, nevypisuje 
                                                  se CRLF.
        f.write._s                                vypíše s ev. indentací obsah globální proměnné _S, která se plní k 
                                                  tomu určnými příkazy _s.*. Nevypisuje se CRLF.
        f.dump.data                               vypíše komplet Data.Text, tedy stringovou podobu TStringListu Data, 
                                                  používá se pro ladění.
        f.write.raw             Arg               vypíše Arg bez resolvování a neudělá CRLF, hodí se k výpisům mustrů, 
                                                  které se následně teprve resolvují
        f.write.dir             Arg               vypíše adresář, používá se pro hromadné akce, kde se nejprve sestaví 
                                                  dlouhý list souborů a pak se nad ním cosi iteruje
        f.write.dir.recursive   Arg               dtto, ale s podadresáři
        f.write.centered        Width,Line        vypíše Line, ale napřed ji obalí z obou stran mezerami na šířku Width, 
                                                  je-li Line užší.
        f.write.textfile        FileName          zapíše obsah udaného souboru, používá se při skládání reportů z předem 
                                                  vypočtených kapitol
        f.write.textfile.novoid FileName          dtto, ale přeskáče prázdné řádky
        _fv                     A:W,A:W,...       de facto Writeln(f,A:W,A:W,...) včetně formátování se zápornou 
                                                  hodnotou. W=0 indikuje neformátovat. Mezi proměnnými se vždycky píše 
                                                  mezera a na konci CRLF.
        _fv.nolf                A:W,A:W,...       nevypisuje CRLF
        _fvh                    A:W,A:W,...       de facto Writeln(h,A:W,A:W,...)
        _fvh.nolf               A:W,A:W,...       nevypisuje CRLF
        f.compose               FileName,Label    vytvoří FileName přes lokální (!!!) proměnnou typu text a v aktuálním 
                                                  skriptu pak hledá Label: - až nalezne, vypíše všechno až do konce 
                                                  nebo řádku obsahujícího jenom tečku. Hodí se pro dynamické vytváření 
                                                  wizardů ze skriptů apod.
        b.write                 Count,Src         překopíruje Count (nanejvíše 10240 znaků) z proměnné Src do interního 
                                                  bufferu a binárně zapíše do b. Viz též b.seek. Používá se při skládání 
                                                  nějakých divokých binárních souborů.
        f.write.diff            Name              vezme hodnotu Name z kontextu Saved (tam se mohla dostat pomocí funkce 
                                                  save). Změří její délku. Potom vezme ev. přírůstek hodnoty Name v 
                                                  aktuálním kontextu skriptu a vypíše do f včetně CRLF; používá se 
                                                  pro vypočítání "dnešního přírůstku" do nějaké proměnné tak, že se 
                                                  napřed uschová starý stav platný typicky                                                 až do včerejška ...
        f.write.diff.prf        Name              analogie, přírůstek se ale chápe jako prefix a ne suffix.
        -------------------------------------------------------------------------------------------------------------


    Různé varianty čtení z textových souborů:

        Funkce                  ArgList           Popis
        -------------------------------------------------------------------------------------------------------------
        ?g.read                 Buffer,Label      přečte do Buffer obsah jednoho řádku z g, při eof nebo chybě skočí 
                                                  na Label
        g.skip                  Arg               přeskakuje řádky v g dokud nenerazí na řádek rovný Arg
        g.skip.lines            Count             přeskočí Count řádků
        g.read2eof              Buffer            načte do Buffer celý zbytek souboru, CRLF zakóduje pomocí \n
        b.read                  Count,Dst         načte Count (ale ne více než 10240 znaků) do interního bufferu a pak 
                                                  je jako string uloží do proměnné Dst
        b.seek                  Pos               seekne na Pos a nastaví _PreviousResult podle ev. chyby
        -------------------------------------------------------------------------------------------------------------

    Typické obraty:
    =======================================================
        ?g.open       c:/tmp/vstup.txt,Chyba
    Loop:
        ?g.read       Buffer,Done
        _call         ZpracovaniRadku
        goto          Loop
    Done:
        g.close
        exit
    Chyba:
        _quit         Nedá se otevřít "c:/tmp/vstup.txt" ...
    =======================================================
        ?f.create     c:/tmp/sestavaq.txt,Chyba
        f.write       -------------------------------------------------
        f.write       Sestava Q
        f.write       -------------------------------------------------
        f.write       Zavod         Hodiny      Poruchy       UkazatelQ
        f.write       -------------------------------------------------
        startsql      select Zavod,Poruchy,Hodiny,UkazatelQ from UkazatelQ order by Zavod
    Loop:
        ?getsql       EndLoop
        _fv           Zavod:5,Poruchy:-12,Hodiny:-12,UkazatelQ:-12
        goto          Loop
    EndLoop:
        stopsql
        f.write       -------------------------------------------------
        f.close
        viever        c:/tmp/sestavaq.txt
        exit
    Chyba:
        _quit         Nedá se otevřít "c:/tmp/sestavaq.txt" ...
    =======================================================


BulletRejstřík kapitoly
BulletNadřízená kapitola dokumentace / rejstřík


JLABS Aktualizováno dne 20000704. Komentář: info@jlabs.cz