Memo položky a zpracování textů
Položka typu memo
Databázový
soubor je tabulka se stejně dlouhými záznamy. Každý typ položky má svou
konstantní délku, kromě znakového typu,( který má stanoven maximální délku
254 znaků). To představuje značnou nevýhodu při databázovém zpracování
rozsáhlejších informací. Přinejmenším by každý záznam musel být tak
dlouhý jako nejdelší text. Důsledkem tohoto počínání by bylo velké plýtvání
pamětí a pomalá manipulace s databázovým souborem. Proto byla zvolena
technika založená na myšlence ukládání textové informace do zvláštního
souboru (budeme mu říkat soubor typu FPT - FoxPro Text). Je to textový soubor
s přímým přístupem, jednoduché konstrukce, jaký známe z programování v
jazyku Pascal nebo C s tím, že jsou povoleny všechny kombinace ascii kódu, včetně
binární nuly. V databázi je pouze směrník, ukazující na místo v souboru
FPT, kde je textová informace uložena. Tato technika umožňuje uložit do
textového souboru jakoukoliv informaci (akustickou, obrazovou, s oblibou se
touto technikou ukládají do databázového souboru programy v textovém i binárním
tvaru).
Informace,
příslušející jednomu směrníku, se nazývá memo položka (pojmenování
memo má historický původ, pozor při programování nezaměňovat se zkrácením
slova memory na čtyři znaky). Velikost směrníku je deset číslic.
Velikost
memo položky není prakticky omezena. Pro standardní verzi však velikost nad
64000 byte může v některých speciálních případech způsobovat potíže při
spolupráci s paměťovými proměnnými. Programově lze hospodaření s
prostorem na disku ovlivňovat příkazem:
SET BLOCKSIZE TO <expN>
Určuje velikost bloků pro
ukládání memo položek. Je-li zadané číslo v rozsahu 1 až 32, ukládání
je po blocích velikosti <expN>*512 bytů. Je-li číslo <expN> větší
než 32, memo položky se ukládají do bloků velikosti <expN> bytů.
Standardní hodnota je 64.
Velikost bloku pro ukládání
memo položek v zadané pracovní oblasti lze zjisti funkcí:
SYS(2012[,<alias>])
Soubor FPT může mít
nevhodnou velikost, způsobenou aktualizací, zejména rušením, memo položek.
Na optimální velikost lze soubor upravit příkazem:
PACK MEMO
V případě, že byl použit
příkaz PACK (bez klauzule MEMO), provede se i činnost určená příkazu PACK
MEMO.
Manipulace s memo položkami
Na
rozdíl od tvrzení manuálů, včetně firemních, můžete manipulovat s memo
položkou jako s libovolnou položkou či paměťovou proměnnou znakového
typu, včetně použití systémových funkcí. Její obsah lze zobrazovat,
vypisovat, modifikovat, přesouvat. Podle jejího obsahu lze provádět indexování
(musí být ve výrazu spojena s jinou databázovou položkou), je možné ji
použít v každém výrazu kde je přípustný znakový typ.
Protože
jde o rozsáhlejší informaci, vyskytují se přirozené odlišnosti. V první
řadě je nutno memo položku chápat jako text, který musí být členěn do
řádků. Jednak zadaných při pořizování (zapsaný konec řádku) jednak
podle měnící se šířky prostoru, vyhrazeného pro zobrazení. Tuto šířku
lze dynamicky programovat příkazem, který není výhradně určen pro memo
položky, ale téměř vždy s používá při práci s memo položkami:
SET MEMOWIDTH TO <expN>
Výraz <expN> určí
maximální možnou šířku řádku memo položek a výrazů typu C delších
než 254 znaků při výstupu příkazy ? |??, DISPLAY a LIST. Řádky jsou
nestejné délky jelikož nedochází k dělení slov. Příkaz ovlivňuje
hodnoty vrácené funkcemi závislými na číslováni řádků: ATCLINE(),
ATLINE(), MEMLINES() a MLINE().
Zobrazení memo položky
DETAIL souboru FOXHELP
SET HELP TO
&& Odpojení od systému HELP
USE FOXHELP
&& Otevření
GO 50
&& Vyhledání 50. záznamu
SET MEMOWIDTH TO 65
&& Nastavení zobrazovací šířky řádků
? DETAIL
&& Vlastní zobrazení
Interaktivní manipulace s memo položkami
Pro pořízení a aktualizaci
obsahu memo položky se nejčastěji programuje příkaz:
MODIFY MEMO <memo položka1> [, <memo položka2>
...]
[RANGE <expN1>, <expN2>]
[NOEDIT] [SAVE]
[NOWAIT]
[[WINDOW <okno1>] [IN [WINDOW]
<okno2> | SCREEN]]
Umožní interaktivní
modifikaci obsahu zadaných memo položek. Pro každou vyjmenovanou memo položku
otevře editační okno a umožní upravovat nebo prohlížet její obsah. Lze
modifikovat memo položky z více pracovních oblastí jedním příkazem, pak
jména položek zadáme s kvalifikátorem (alias). Modifikujeme-li jednu memo
položku, pak po opuštění editačního okna se okno zavře. Zadáním fráze
SAVE v tomto případě ponechá editační okno otevřené a je možno se do něj
vrátit. V případě zadání více jak jedné memo položky se implicitně
nastaví fráze SAVE a NOWAIT. NOEDIT jen prohlížení obsahu memo položek.
KlauzuleL RANGE zobrazí jen část memo položek od bytu <expN1> do
<expN2>. Klausule WINDOW přenese vlastnosti okna (rozměry, barvy apod.)
na memo položku. Klausule IN WINDOW pouze umístí do okna.
Příklad na úpravu memo
položky souboru Foxhelp
SET HELP TO
&& Odpojení od systému HELP
USE FOXHELP
&& Otevření
GO 50
&& Vyhledání 50. záznamu
DEFINE WINDOW WWWW FROM 10,10 TO 20,50 FLOAT CLOSE
MODIFY MEMO DETAIL WINDOW
wwww
Jinou variantu interaktivní
modifikace memo položky použijeme při konstrukci dialogu, kdy potřebujeme
aktualizovat memo položku nebo delší text (potřebujeme použít jediného příkazu
READ pro různorodé typy vstupů. S výhodou požijeme příkazu:
@ <řd,sl> EDIT <var>
[FUNCTION <expC1>] [DEFAULT
<expr>]
SIZE <expN1>, <expN2> [,
<expN3>]
[DISABLE | ENABLE]
[MESSAGE <expC3>]
[VALID <expL1>[ERROR
<expC4>]] [WHEN <expL2>]
[NODODIFY] [SCROLL] [TAB]
[COLOR SCHEME <expN4> | COLOR
<seznam dvojic barev>]
Příkaz je analogii příkazu
GET. Je určen pro vstup a aktualizaci textu. Vytvoří na obrazovce nebo v okně
pravoúhelník, jehož levý horní roh je zadán souřadnicemi <řd,sl>.
Rozměry jsou určeny klausulí SIZE, která určuje výšku <expN1> a šířku
<expN2> editovatelné oblasti. Je-li <expN1>=1, založí se jednořádkový
prostor, v němž se text může zobrazovat převíjením (scroll). Klávesa
Enter pak ukončuje editaci. <expN3> určuje počet znaků, které lze
editovat. Příkaz zobrazí a umožní aktualizovat text uložený v proměnné,
prvku pole nebo databázové položce (včetně memo). V klausuli FUNCTION
<expC2> jsou povoleny pouze editační symboly 'I' (centrování textu v
editovatelné oblasti) nebo 'J' (zarovnání textu vpravo).
Příkaz
využívá všech vlastností editoru FoxPro. Pro ukončení editace a uložení
změn slouží Tab nebo Ctrl+Tab. <expL1> umožňuje i řízení ukončení
editace memo položky. Při <expL1>=.T. ukončí Tab nebo Ctrl+Tab editaci
a uloží opravený text. Pokud <expL1>=.F. ,vypíše se v pravém horním
rohu výstraha, kterou jsme vyzváni k další opravě textu. Stlačení Escape
v této situaci provede uložení (pro jiné než memo položky opravy naopak
neuloží). Standardní znění výstrahy můžeme změnit vlastním textem
<expC4> uvedeným ve frázi ERROR. Pokud se <var> nevejde do
editovatelné oblasti, zobrazí fráze SCROLL v pravé hraně oblasti převíjecí
pruh. TAB ponechá význam klávesy Tab jako tabelačního znaku, ukončení
editace s uložením je možné pouze kombinacemi Ctrl+Tab.
@ 5,10 EDIT popis SIZE 10,40, odkud SCROLL TAB
CLOSE MEMO <memo položka1> [,
<memo položka2> ...] | ALL
Příkaz zavře okna otevřená
pro editaci vyjmenovaných memo položek. Fráze ALL způsobí zavření všech
oken otevřených pro editaci memo položek. Při zavírání se uloží
provedené opravy.
Zapsání obsahu výrazu do memo
položky
Provádí
se běžným příkazem REPLACE ...WITH ... , který přepíše výrazem znakového
typu obsah memo položky. Připsání k původnímu obsahu zajistíme klausulí
ADDITIVE.
Zapsání memo položky do paměťové
proměnné nebo prvku pole
Provádí
se běžným přiřazovacím příkazem. Proměnná je znakového typu, délky
memo položky. Ve standardní verzi se do proměnné zapíše maximálně 64000
bytů memo položky.
Speciální systémové funkce pro
práci s memo položkami
Speciální
systémové funkce pracují s dynamickým řádkem jako s informační
jednotkou. Toho lze využít při cyklickém zpracování obsahu memo položky:
MEMLINES(<memo položka>)
Vrací počet řádků v
zadané memo položce. Na počet řádků má vliv hodnota nastavená v příkazu
SET MEMOWITDH. Pro zadání memo položky v jiné než aktuální pracovní
oblasti je třeba zadat jméno s alias.
m_radek = MEMLINES(chorobopis.diagnoza)
MLINE(<memo položka>, <expN1> [,
<expN2>])
Vrací obsah řádku memo
položky. Hodnota <expN1> určuje řádek buď vzhledem k počátku memo
položky nebo k řádku zadanému parametrem <expN2>. Pro zadání memo
položky v jiné než aktuální oblasti je třeba zadat jméno s alias. memo
položky. Pro zadání řádku lze použít systémové proměnné _MLINE.
?MLINE(chorobopis.diagnoza, 1, _MLINE)
ATCLINE(<expC1>, <expC2>)
V řetězci <expC2>
hledá první výskyt podřetězce <expC1>. Nalezne-li jej celý uvnitř
jednoho z řádků, vrací číslo řádku, v opačném případě vrací nulu.
Nerozlišuje velká a malá písmena, pokud to nejsou diakritické znaky.
ATLINE(<expC1>, <expC2>)
Jako ATCLINE(), ale rozlišuje
malá a velká písmena.
RATLINE(<expC1>, <expC2>)
jako ATLINE(), ale hledá od
konce.
Kopírování textového souboru do
memo položky
Jde
o velice častou úlohu, kdy obsahem memo položky je celý soubor (například
rozkaz, zpráva, směrnice apod.). Pokud tento soubor je pořizován v T602, pak
musí vystoupit přes EXPORT a ASCII1 (jde o odstranění řídicích znaků
T602). Obecně lze vkládat jakýkoliv soubor, nemusí mít tvar textového
souboru (Pascal).
Vkládání se řeší jako připojování
s výmazem předchozího obsahu:
APPEND MEMO <memo položka> FROM <soubor>
[OVERWRITE]
Obsah souboru se přidá k
obsahu memo položky. Klausule OVERWRITE způsobí přepsání původního
obsahu.
APPEND MEMO diagnoza FROM lek_zprava OVERWRITE
Kopírování memo položky do
souboru
COPY MEMO <memo položka> TO <soubor>
[ADDITIVE]
Kopíruje obsah memo položky
do textového souboru. Jestliže <soubor> existuje, obsah memo položky
<memo položka> z aktuální věty buď přepíše obsah souboru nebo se přidá
na jeho konec (parametr ADDITIVE). Jestliže <soubor> neexistuje, vytvoří
se a obsah <memo položka> se do něj uloží. Implicitní přípona cílového
souboru je TXT.
COPY MEMO diagnoza TO POPIS
Cvičení
Přepsání řádků
memo položky do pole
Sestavte
proceduru, která uloží do tabulky TAB memo položku T souboru KK.DBF tak, že
vynechá prázdné řádky. V programu i proceduře použijte makrosubstituce
pro předání jména tabulky.
SET TALK OFF
&& Vypnutí tisku mezivýsledků
USE kk
&& Otevření souboru s memo
GO 30
&& Vyhledání 30. záznamu
rad=300
&& Počet řádků tabulky
PUBLIC TAB[rad]
&& Deklarace tabulky
TAB=''
&& Vyprázdnění tabulky
DO prepis WITH
'tab',rad,65,'t'
&& Volání procedury
&&
! Všimnete si předání !
CLEAR
&& !
parametrů !
i=1
&& Po návratu výmaz obrazovky
DO WHILE
LEN(TAB[i])>0 && V cyklu zobrazení tabulky
?TAB[i]
&& Jednotlivé řádky tabulky
i=i+1
ENDDO
PROCEDURE prepis
&& Deklarace procedury
PARAMETERS ta,N,s,me
&& Formální parametry
* ta = jméno tabulky
!! Všimnete si způsobu
* n = počet řádků tabulky !! práce se jmény tabulek
* s =
šířka řádků !!
při použití formálních
* me = jméno memo položky !! parametrů !!!
SET MEMOWIDTH TO s
&&
Nastavení požadované šířky
j=1
&& Index řádkování tabulky
R=IIF(MEML(&me)>s,s,MEML(&me))
&& Ošetření přeplnění tabulky
FOR i=1 TO R
&& Přes všechny řádky memo
IF
!EMPTY(MLINE(&me,i))
&& Test prázdného řádku
sss=MLINE(&me,i)
&& Obsah i.řádku memo
&ta[j]=sss
&& Do j.řádku tabulky
j=j+1
&& Další řádek tabulky
ENDIF