VaxNt/ProDB.PGuide.Soubory
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.
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.
Př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" ...
=======================================================