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