Makrá v OpenOffice.org 3/V. – Počítame reťazce

Július Pastierik  /  20. 04. 2006, 00:00

V dnešnom dieli seriálu o programovaní makier v OpenOffice.org si budeme hovoriť o interaktívnom zadávaní reťazcov pomocou funkcie „InputBox“.

Ako sme už spomínali v časti „Makrá v OpenOffice.org 3/I. – Správy“, pre interaktívne zadávanie údajov máme v OpenOffice.org tri základné možnosti – správy, vstupné funkcie a dialógy. O správach sme si toho popísali v predchádzajúcich štyroch dieloch už dosť a preto sa teraz zameriame na vstupné funkcie.

Vstupné funkcie

Pri programovaní makier v OpenOffice.org máme k dispozícii iba jednu vstupnú funkciu „InputBox“, ktorá vracia zadaný reťazec. Táto funkcia má tri vstupné parametre:

InputBox("Nápovedný text","Nadpis okna","Štandardná hodnota")
Hoci táto funkcia dokáže vrátiť iba reťazec, je to úplne postačujúce, pretože prípadný prevod na iný typ premenných je v jazyku StarOffice Basic vyriešený veľmi jednoducho. Jednotlivé parametre nebudeme teraz teoreticky rozoberať, ale v niekoľkých dieloch si na konkrétnych príkladoch radšej ukážeme praktické použitie tejto funkcie. Myslím si, že z týchto príkladov pochopí ich význam každý bez osobitnej potreby vysvetľovania.

Spočítavame textové reťazce

Ako prvý príklad, v ktorom vynikajúco využijeme možnosti funkcie „InputBox“ je makro pre spočítanie počtu výskytov textových reťazcov. Každý z nás má svoje „obľúbené“ výrazy (napr. u mňa je to slovo „samozrejme“ vrátane jeho synoným), ktoré, chtiac-nechtiac, prenáša aj do písomného prejavu. Pravdaže (a znovu je tu moje „samozrejme“ – teraz v slove „pravdaže“), toto môže prekážať a preto ako dobrá pomôcka môže byť zistenie ich počtu. Pre vlastné spočítanie by sme mohli použiť „fintu“ náhrady toho istého reťazca za ten istý, pričom by sme zistili počet týchto „výmien“. Takéto riešenie je však veľmi nepraktické, pretože v prípade, že máme príslušný výraz napísaný raz veľkými písmenami, inokedy malými a inokedy zas iba s veľkým písmenom na začiatku, príslušná výmena by toto formátovanie zrušila a všetko by sa nahradilo rovnakým textom. Preto je vhodnejšie, ak si na zistenie vlastného počtu urobíme vlastnú funkciu „Spocitaj_hladanim“. Na to nám stačí veľmi jednoducho upraviť napr. funkciu „Vymen_hladanim“, kde vynecháme tie časti, v ktorých nahrádzame nájdený reťazec, a výsledok môže vyzerať napríklad takto:

REM Funkcia spočíta počet výskytov reťazca Co
function Spocitaj_hladanim(Co as string, Regularne, Cele_slova, Velke_pismena as Boolean) as long
 dim nasiel as object
 dim kolko as long
 Hladaj.searchString=Co
 Hladaj.SearchRegularExpression=Regularne
 Hladaj.SearchWords=Cele_slova
 Hladaj.SearchCaseSensitive=Velke_pismena
 kolko=0
 nasiel = Dokument.findFirst(Hladaj)
 Do While NOT isNull(nasiel)
  if len(nasiel.String)>0 then
   kolko=kolko+1
  end if
  nasiel = Dokument.findNext( nasiel.End, Hladaj)
 Loop
 Spocitaj_hladanim=kolko
end function

Vlastná procedúra pre zadanie hľadaného reťazca a následné spočítanie jeho výskytu potom môže vyzerať napríklad takto (predpokladajme, že funkciu „Spocitaj_hladanim“ sme uložili do modulu „Formatovanie_funkcie“):

sub Spocitaj_slova
 dim slovo as string
 dim kolko as long

 slovo= inputbox("Zadajte reťazec, ktorý chcete spočítať:","Počet výskytov reťazca","")

 Formatovanie_funkcie.Init
 kolko=Formatovanie_funkcie.Spocitaj_hladanim(slovo,False,True,False)

 msgbox("Reťazec „"+slovo+"“ sa vyskytuje "+kolko+" krát.",0,"Počet výskytov reťazca")

end sub

Pri takejto práci je však pohodlnejšie, ak si označíme hľadaný reťazec do bloku, a makro nám ho následne automaticky ponúkne ako štandardnú hodnotu, ktorú stačí iba „odklepnúť“. Na tento účel využijeme systémovú objektovú premennú „getCurrentSelection“, pomocou ktorej získame prístup k označenému textu. Pochopiteľne, v makre musíme pamätať aj na to, že žiadny text neoznačíme. Výsledné makro potom môže vyzerať takto.

Vstup reťazca

sub Spocitaj_slova
 dim slovo, oznacene as string
 dim kolko as long

 dim dokument, vyber as object

 dokument=thisComponent ' aktuálny dokument
 vyber=dokument.getCurrentSelection() ' aktuálny vyber

 oznacene="" ' V prípade, že nebude označený žiadny text, bude štandardný text prázdny

 ' Ak je počet označených častí nenulový
 if vyber.getCount()>0 then
  ' Vyberieme označený reťazec a orežeme ho o okrajové medzery
  oznacene=trim(vyber.getByIndex(0).getString())
 endif

 slovo= inputbox("Zadajte reťazec, ktorý chcete spočítať:","Počet výskytov reťazca",oznacene)

 Formatovanie_funkcie.Init
 kolko=Formatovanie_funkcie.Spocitaj_hladanim(slovo,False,True,False)

 msgbox("Reťazec „"+slovo+"“ sa vyskytuje "+kolko+" krát.",0,"Počet výskytov reťazca")

end sub


Počet výskytov reťazcaNa budúce: Prevádzame číslo na text, alebo konečne makro, ktoré využijeme aj v module „Calc“.


Neprehliadnite: