Číta nás cez 130 tisíc ľudí | Autori | O Inet.sk | OZ IPV | Referáty | Reklama | RSS
17. 2. 2010, Programovanie, Július Pastierik, 0 komentárov
Potrebujete opticky vidieť, koľko bude vaše makro ešte asi pracovať? Zobrazte si priebeh jeho vykonávania.
Pri časovo náročných makrách je výhodné, ak opticky vidíte, že makro ešte pracuje. Na tento účel sa používa tzv. panel priebehu, ktorý sa definuje v dialógovom okne a, následne, priamo v makre sa nastavuje aktuálna hodnota priebehu.
Pri vlastnej definícii tohto panelu sa nastavuje minimálna a maximálna hodnota priebehu. Okrem toho je vhodné, ak počas prípravy dialógového okna nastavíte aktuálnu hodnotu totožnú s maximálnou hodnotou, aby ste videli, ako bude vyzerať celý panel priebehu. Toto odporučenie je iba z toho dôvodu, aby ste nevložili iný údaj na miesto, kde sa počas behu makra bude vykresľovať vlastný priebeh.
Pretože OpenOffice.org sa sám stará o prepočítavanie aktuálnej hodnoty na počet vykreslených políčok a pretože minimálny, maximálny či aktuálny počet môžu byť ľubovoľné celé čísla, je používanie panelu priebehu veľmi jednoduché a pohodlné.
Samozrejme, niekedy viete už pri definícii panelu priebehu, akú minimálnu a maximálnu hodnotu môže priebeh nadobudnúť, no inokedy nie. Pokiaľ chcete takýto panel využiť, musíte v takomto prípade zistiť tieto hodnoty vo vlastnom makre.
Aby sme si ukázali príklad, kedy vopred neviete maximálnu hodnotu, budeme aplikovať tento panel v makre pre skrývanie a odkrývanie textu, ktoré sme si v počiatočnej verzii predstavili v článku „Makrá v OpenOffice.org – Skrývanie a odkrývanie textu“. Pretože v tomto makre pri odhaľovaní skrytého textu prechádzame všetky znaky je minimálna hodnota nula a maximálna hodnota je celkový počet znakov dokumentu.
Žiaľ, OpenOffice.org nám nedokáže vopred oznámiť počet skrytých znakov (nepočíta ich dokonca ani do celkového počtu znakov dokumentu) a preto sa môže stať, že ním oznámený počet znakov dokumentu je iný (môže byť teoreticky aj nulový), ako skutočný a preto ošetríme tento prípad v makre – ako pri počiatočnej hodnote, tak aj pri nájdení skrytého znaku.

A, aby sme makro dotiahli do čo maximálnej dokonalosti, vložíme do dialógu, ktorý zobrazuje priebeh aj tlačidlo „Preruš“, pomocou ktorého dokážeme, ak budeme vidieť, že makro by pracovalo extrémne dlho, prerušiť priebeh jeho vykonávania. Okrem toho, pokiaľ pri odkrývaní skrytých znakov nenastavujeme ich parametre, automaticky ich odkryjeme v celom dokumente bez toho, aby sme ho pracne prehľadávali znak po znaku.

dim dlg as object
dim pokracuj_dlgc as boolean ' Indikácia prerušenia hľadania pomocou tlačidla "Preruš" v dialógu priebehu
REM Makro pre nastavenie prerušenia hľadania
sub Prerus_Initiated
pokracuj_dlgc=FALSE ' Indikácia prerušenia hľadania
end sub
REM Makro pre skrytie označeného textu
sub Skry_text_Initiated
dim oKurzor as object
okurzor= ThisComponent.currentcontroller.getViewCursor() ' viditeľný kurzor
okurzor.CharHidden=TRUE ' Skrytie textu
end sub
REM Makro pre odkrytie textu v celom dokumente, pričom sa nastavia parametre podľa dialógu
sub Odkry_text_Initiated
dim oKurzor as object
dim este as boolean
dim pom_text as string
dim kolko, absolutne, znakov as long
dim dlgc, oUkazujPriebeh as object
oKurzor=StarDesktop.CurrentComponent.Text.CreateTextCursor() ' Vytvoríme nový textový kurzor, ktorým prejdeme celý dokument
oKurzor.gotoStart(false) ' Skočíme na začiatok dokumentu
kolko=0 ' Počet skrytých znakov
absolutne=0 ' Počet prehľadaných znakov
REM Ak označujeme a nič nenastavujeme, nemusíme prehľadávať dokument znak po znaku, ale v celom dokumente môžeme naraz nastaviť viditeľnosť znakov.
REM V tomto prípade však nezistíme počet a preto oznámime iba vykonanie odkrytia skrytých znakov
if dlg.model.OptionOdkry.State=1 and dlg.model.Check_Preciarkni.State=0 and _
dlg.model.Check_Podciarkni.State=0 and dlg.model.Check_Text.State=0 and dlg.model.Check_Pozadie.State=0 then ' Ak označujeme a nič nenastavujeme
okurzor.gotoEnd(True) ' Skočíme na koniec dokumentu a označíme ho
oKurzor.CharHidden=FALSE ' Zviditeľnenie textu
oKurzor.collapseToEnd() ' Zrušíme označenie textu a skočíme na jeho koniec
if dlg.model.Oznamovanie.State=1 then ' Ak oznamujeme ukončenie vyhľadávania
msgbox "Skryté znaky boli odkryté."
end if
exit sub ' Ukončenie procedúry
end if
znakov=ThisComponent.CharacterCount ' Celkový počet znakov v dokumente (Pozor, OO.o tu nepočíta skryté znaky!)
if znakov=0 then znakov=1 ' V teoreticky prázdnom dokumente nastavíme počet na jeden znak, aby nebola koncová hodnota totožná s počiatočnou (0)
DialogLibraries.LoadLibrary("JP_Skryty_text") ' Otvorenie knižnice
dlgc=CreateUnoDialog(DialogLibraries.JP_Skryty_text.Dialog_Cakaj) ' Otvorenie dialógu priebehu (s možnosťou prerušenia hľadania)
oUkazujPriebeh=dlgc.getModel().getByName("UkazujPriebeh") ' Panel priebehu v dialógu priebehu
oUkazujPriebeh.setPropertyValue("ProgressValueMin", 0) ' Nastavenie minimálnej hodnoty priebehu (0)
oUkazujPriebeh.setPropertyValue("ProgressValueMax", znakov) ' Nastavenie maximálnej hodnoty priebehu (celkový počet znakov v dokumente)
dlgc.setVisible(true) ' Zviditeľnenie dialógu priebehu
pokracuj_dlgc=TRUE ' Indikácia neprerušenia hľadania
do
absolutne=absolutne+1 ' Počet všetkých prehľadaných znakov
oUkazujPriebeh.setPropertyValue( "ProgressValue",absolutne) ' Nastavenie aktuálnej hodnoty priebehu (počet prehľadaných znakov)
este=oKurzor.goRight(1,true) ' Označíme jeden znak
if este then ' Ak sme označili znak
if oKurzor.CharHidden then ' Ak je znak skrytý
oUkazujPriebeh.setPropertyValue("ProgressValueMax", znakov+kolko) ' Úprava maximálnej hodnoty podľa aktuálneho počtu skrytých znakov
kolko=kolko+1 ' Počet nájdených skrytých znakov
if dlg.model.OptionVymaz.State=1 then ' Mažeme skryté znaky
oKurzor.string=""
else ' Označujeme skryté znaky
oKurzor.CharHidden=FALSE ' Zviditeľnenie textu
if dlg.model.Check_Preciarkni.State=1 then ' Chceme predtým neviditeľný text po zviditeľnení prečiarknúť
pom_text=trim(dlg.getControl("Box_Preciarkni").Text)
select case pom_text
case "None"
oKurzor.CharStrikeout=com.sun.star.awt.FontStrikeout.NONE
case "Single"
oKurzor.CharStrikeout=com.sun.star.awt.FontStrikeout.SINGLE
case "Double"
oKurzor.CharStrikeout=com.sun.star.awt.FontStrikeout.DOUBLE
case "Don't Know"
oKurzor.CharStrikeout=com.sun.star.awt.FontStrikeout.DONTKNOW
case "Bold"
oKurzor.CharStrikeout=com.sun.star.awt.FontStrikeout.BOLD
case "Slash"
oKurzor.CharStrikeout=com.sun.star.awt.FontStrikeout.SLASH
case "X"
oKurzor.CharStrikeout=com.sun.star.awt.FontStrikeout.X
end select
endif
if dlg.model.Check_Podciarkni.state=1 then ' Chceme predtým neviditeľný text po zviditeľnení podčiarknúť
pom_text=trim(dlg.getControl("Box_Podciarkni").Text)
select case pom_text
case "None"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.NONE
case "Single"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.SINGLE
case "Double"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.DOUBLE
case "Dotted"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.DOTTED
case "Don't Know"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.DONTKNOW
case "Dash"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.DASH
case "Long Dash"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.LONGDASH
case "Dash Dot"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.DASHDOT
case "Dash Dot Dot"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.DASHDOTDOT
case "Small Wave"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.SMALLWAVE
case "Wave"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.WAVE
case "Double Wave"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.DOUBLEWAVE
case "Bold"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.BOLD
case "Bold Dotted"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.BOLDDOTTED
case "Bold Dash"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.BOLDDASH
case "Bold Long Dash"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.BOLDLONGDASH
case "Bold Dash Dot"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.BOLDDASHDOT
case "Bold Dash Dot Dot"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.BOLDDASHDOTDOT
case "Bold Wave"
oKurzor.CharUnderline=com.sun.star.awt.FontUnderline.BOLDWAVE
end select
endif
if dlg.model.Check_Text.state=1 then ' Chceme predtým neviditeľný text po zviditeľnení zafarbiť
oKurzor.CharColor=(dlg.model.RT.value*256+dlg.model.GT.value)*256+dlg.model.BT.value ' Prepočet zadanej farby na číslo
endif
if dlg.model.Check_Pozadie.state=1 then ' Chceme predtým neviditeľný text po zviditeľnení podfarbiť
oKurzor.CharBackColor=(dlg.model.RP.value*256+dlg.model.GP.value)*256+dlg.model.BP.value ' Prepočet zadanej farby na číslo
endif
endif
endif
oKurzor.collapseToEnd() ' Zrušíme označenie znaku a skočíme na jeho koniec
endif
loop while (este and pokracuj_dlgc)' cyklus opakujeme, kým nebume za posledným znakom dokumentu a kým neprerušíme hľadanie
dlgc.dispose()
if dlg.model.Oznamovanie.State=1 then ' Ak vypisujeme počet
if dlg.model.OptionVymaz.State=1 then ' Ak sme mazali
msgbox "Vymazaných "+kolko+" skrytých znakov."
else ' Ak sme označovali
msgbox "Odkrytých "+kolko+" skrytých znakov."
endif
end if
end sub
sub Zmen_odkry_vymaz_Initiated
if dlg.model.OptionOdkry.State=1 then dlg.model.Odkry.Label="Odkry"
if dlg.model.OptionVymaz.State=1 then dlg.model.Odkry.Label="Vymaž"
end sub
REM Makro, ktoré zneviditeľní dialóg – t.j. nastaví, že sa má ukončiť čakací cyklus (volané stlačením klávesy "Koniec" v dialógu)
sub Koniec_Skry_Odkry_Initiated
dlg.setVisible(false )' Zneviditeľnenie dialógu
end sub
Rem Volanie dialógu a makra pre skrytie/odkrytie textu
sub Skry_Odkry_text
DialogLibraries.LoadLibrary("JP_Skryty_text")
dlg=CreateUnoDialog(DialogLibraries.JP_Skryty_text.Dialog_Skry_Odkry)
dlg.model.OptionOdkry.State=1 ' Štandardne budeme odkrývať skrytý text
dlg.model.OptionVymaz.State=0
dlg.model.Odkry.Label="Odkry"
dlg.model.Check_Preciarkni.State=0 ' Štandardne ponecháme odkrývaný text v pôvodnom tvare
dlg.model.Check_Podciarkni.State=0
dlg.model.Check_Text.State=0
dlg.model.Check_Pozadie.State=0
dlg.model.Oznamovanie.State=1 ' Štandardne budeme oznamovať koniec odkrytia textu
dlg.setVisible(true) ' zviditeľnenie dialógu – namiesto dlg.Execute(), aby sa dalo paralelne pracovať s textom
while dlg.isVisible() ' Cyklus, ktorý čaká na stlačenie klávesy "Koniec" v dialógu (kým je dialóg viditeľný)
wait 500 ' Časová medzera 500 milisekúnd (0,5 sec) na to, aby sa dalo paralelne pracovať s dokumentom
wend
dlg.dispose() ' Zatvorenie dialógu
end sub
| Dátum | Meno | Predmet |
|---|---|---|
| Prejsť na diskusiu | Pridať komentár | ||
| Diskusia momentálne neobsahuje žiadne komentáre | ||

Inet.sk – Internetový denník, ISSN 1336-1899
Copyright 2002 – 2010 Inet.sk, s. r. o., Všetky práva vyhradené, Neprešlo jazykovou úpravou
Partneri:
123velkoformatovatlac.sk
Aaavizitky.sk
Bilancia skrývky
BiznisHosting.sk
CinemaView.sk
Digitálne fotoaparáty
Digitlac.sk
Fotografie
Grafika.sk
HrajSa.sk
Katalog Pozri.sk
Kusi.sk
Manga.sk
Notebooky HP
Predaj PC komponenty
Reality Aaainfo.sk
Reklama.sk
Sladká kytica
StiahniTo.sk
Surf.sk
Toshiba PC akcia
Úvery Aaainfo.sk
Zájazdy