Július Pastierik / 29. 12. 2010, 00:00
Ladíte makrá a potrebujete ich spúšťať pomocou výberu ich názvu zo zoznamu? Naprogramujte si makro, ktoré to umožní.
Pri ladení makier je ich spúšťanie pomerne nepohodlné – neustále sa musí vyhľadávať cez menu Nástroje – Makrá – Spustiť makro... Navyše, niektoré makrá síce chceme spúšťať pravidelne, ale nechceme ich mať priradené k žiadnej klávesovej skratke, menu či panelu nástrojov. Medzi takéto makrá môžeme zaradiť napr. procedúry zisťovanie vlastností premenných OpenOffice.org pomocou knižnice XrayTool (posledná verzia 5.2).
Zo všetkých uvedených dôvodov si túto knižnicu rozšírime o nové funkcie – o možnosť zadávania a spúšťania makier, ktorých názov zadáme do zoznamu. Pre ukážku si zároveň pripravíme dve funkcie, pomocou ktorých budeme zisťovať (s využitím knižnice XrayTool) hádam najčastejšie používané premenné – StarDesktop a ThisComponent:
sub xr_StarDesktop dim op : op=StarDesktop BasicLibraries.LoadLibrary("XrayTool") xray(op) end sub sub xr_ThisComponent dim op : op=ThisComponent BasicLibraries.LoadLibrary("XrayTool") xray(op) end sub
Pre vlastné spúšťanie makier pomocou ich názvu musíme ešte uviesť, že prostredie OpenOffice.org Basic vyžaduje, aby boli zadané spolu s knižnicou aj modulom, v ktorej ich máme zadefinované. Pretože mnohokrát ladíme makrá v knižnici Standard a module Module1, budeme pri zadávaní názvov makier predpokladať, že pokiaľ názov knižnice a modulu nezadáme, chceme použiť tieto. Okrem toho si ešte uľahčíme prácu aj tým, že pokiaľ zadáme iba názov modulu, budeme predpokladať knižnicu Standard. Aby sme si ukázali čo najviac možností OpenOffice.org Basic, zoznam budeme, samozrejme, udržiavať abecedne usporiadaný.
Ostatné možnosti ako je ukladanie zoznamu do pracovného súboru, testovanie pokusu zápisu neprázdneho záznamu a pod. sú priamo viditeľné v okomentovanom zdrojovom texte, takže ich už nemusíme špeciálne pripomínať:
dim oDlg as object
dim bZmena as boolean
REM Procedúra pre uloženie zoznamu "xray funkcií" z dialógu do pracovného súboru
sub zapis_xray_funkcie
dim sf, outStream, outFile ' Pre zápis do súboru
dim sNazov$, kde$
dim oZoznam: oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
kde=basiclibraries.getLibraryLinkURL("XrayTool") ' Adresár, kde je rozšírenie nainštalované
sNazov=left(kde,len(kde)-10)+"jp_xraytool_set.txt" ' Súbor s textom
sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
outStream = sf.openFileWrite(sNazov)
outFile = createUnoService("com.sun.star.io.TextOutputStream")
outFile.OutputStream = outStream
outFile.Encoding = "UTF-8" ' Súbor bude v UTF-8 aby bola dobrá diakritika
outStream.truncate() ' Vymazanie predchádzajúceho obsahu
for i=0 to oZoznam.ItemCount-1 ' Zapíšeme všetky záznamy
kde=trim(oZoznam.Items(i))
if kde<>"" then
if i<oZoznam.ItemCount-1 then
outFile.writeString(kde+chr$(13))
else
outFile.writeString(kde)
endif
endif
next i
outStream.closeOutput
outFile.closeOutput
end sub
REM Procedúra pre načítanie zoznamu "xray funkcií" do dialógu
sub citaj_xray_funkcie
dim riadok$
dim sNazov$, kde$
dim sf, inStream, inFile ' Pre čítanie z lokalizačného súboru
dim oZoznam: oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
on error resume next
kde=basiclibraries.getLibraryLinkURL("XrayTool") ' Adresár, kde je rozšírenie nainštalované
sNazov=left(kde,len(kde)-10)+"jp_xraytool_set.txt" ' Súbor s textom
if fileexists(sNazov) then ' Ak súbor existuje, tak ho načítame
sf = createUnoService("com.sun.star.ucb.SimpleFileAccess")
inStream = sf.openFileRead(sNazov)
inFile = createUnoService("com.sun.star.io.TextInputStream")
inFile.InputStream = inStream
inFile.Encoding = "UTF-8" ' lokalizačný súbor musí byť v UTF-8, inak nebude dobrá diakritika
Do While not inFile.IsEOF
riadok = trim(inFile.readLine) ' namiesto Line Input #subor, riadok
if riadok<>"" then oZoznam.AddItem(riadok,oZoznam.ItemCount) ' Ak je záznam neprázdny, pridáme ho do dialógu
loop
' Zatvorenie definičného súboru – namiesto close #subor
inStream.closeInput
inFile.closeInput
end if
oZoznam.Text=oZoznam.Items(0) ' Nastavíme sa na prvý záznam
end sub
REM Procedúra pre pridanie novej položky do zoznamu "xray funkcií"
sub Vloz_xray_Initiated
dim oZoznam : oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
dim sNovy$ : sNovy=trim(oDlg.model.NovyXray.Text) ' Nový záznam
dim bExistuje as boolean : bExistuje=false
dim iPoloha : iPoloha=0
if sNovy<>"" then ' Ak je zadaný názov
' Zistíme, či je záznam v tvare knižnica.modul.funkcia (teda musí obsahovať dve bodky).
i1=instr(sNovy,".")
i2=instr(i1+1,sNovy,".")
if (i1=0) and (i2=0) then sNovy="Standard.Module1."+sNovy ' Nezadaná ani knižnica ani modu – pridáme "Standard.Module1."
if (i1>0) and (i2=0) then sNovy="Standard."+sNovy ' Nezadaná knižnica – pridáme "Standard."
for i=0 to oZoznam.ItemCount-1 ' Zistíme, či záznam existuje a zároveň zistíme abecednú polohu nového záznamu
bExistuje=bExistuje or (lcase(sNovy))=lCase(trim(oZoznam.Items(i)))
if lcase(sNovy)>lCase(trim(oZoznam.Items(i))) then iPoloha=i+1 ' Ak je nový záznam "väčší" ako starý, tak ho vložíme zaň
next i
if not bExistuje then
oZoznam.AddItem(sNovy,iPoloha)
oDlg.model.NovyXray.Text=""
bZmena=True
else
msgbox "Zray funkcia "+sNovy+" je už vložená."
end if
else
msgbox "Názov musí byť zadaný!"
end if
end sub
REM Procedúra pre vymazanie aktuálnej položky zo zoznamu "xray funkcií"
sub Vymaz_xray_Initiated
dim oZoznam : oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
dim sMazany$ : sMazany=trim(oZoznam.Text)
for i=0 to oZoznam.ItemCount-1
if sMazany=trim(oZoznam.Items(i)) then
oZoznam.removeItems(i,1)
bZmena=True
exit sub
endif
next i
end sub
REM Procedúra pre spúšťanie iných makier zadaných ich názvom
REM Názov musí obsahovať knižnicu, mosul a názov procedúry (napr. XrayToool._JP.Xray_ThisComponent)
sub spusti_makro(sMakro as string)
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, "vnd.sun.star.script:"+sMakro+"?language=Basic&location=application", "", 0, Array())
end sub
REM Procedúra pre otvorenie dialógu
sub Vyber_xray
dim sFunkcia$ : sFunkcia=""
DialogLibraries.LoadLibrary("XrayTool")
oDlg=CreateUnoDialog(DialogLibraries.XrayTool.JP_Dialog)
citaj_xray_funkcie
bZmena=false
if oDlg.Execute() then
if bZmena then zapis_xray_funkcie
oZoznam=oDlg.getControl("ZoznamXray") ' Zoznam "xray funkcií" v dialógu
sFunkcia=trim(oZoznam.Text)
endif
oDlg.dispose() ' Zatvorenie dialógu
if sFunkcia<>"" then spusti_makro(sFunkcia)
end sub
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk