22 Detaljnije tumacenje skripti i funkcija  upotrebljenih u skript fajlu Sound Recorder.jss. (nastavak 2.)

Skripta HotKeyHelp izgleda ovako:

Script HotKeyHelp()  
var
	string sTemp_L,
	string sTemp_S
If UserBufferIsActive () then
	UserBufferDeactivate ()
EndIf
;wn1="Sound Recorder"
if (StringContains (GetWindowName (GetRealWindow (GetFocus())), wn1)) ||
(! MenusActive ()) ||
(GetWindowClass (GetParent (GetFocus ())) != wcDialog) ||
(! DialogActive ()) then
	let sTemp_L =msgHotKeyHelp1_L + cScBufferNewLine 
	let sTemp_S = msgHotKeyHelp1_S + cScBufferNewLine 
;can get creative here.
	let sTemp_L =AddToString(sTemp_L,msgHotKeyHelp2_L)
	let sTemp_S = AddToString(sTemp_L, msgHotKeyHelp2_S)
	SayFormattedMessage(OT_USER_BUFFER, sTemp_L, sTemp_S)
else ; Default HotKeyHelp
	PerformScript HotKeyHelp()
endif
EndScript

Na pocetku skripte se u redovima:
var
	string sTemp_L,
	string sTemp_S

definisu dve string promenljive.

Posto je zadatak ove skripte da prikaze poruke u virtualnom pregledniku, potrebno je prethodno proveriti da li je mozda on vec aktivan. To je uradjeno u redovima:
If UserBufferIsActive () then
	UserBufferDeactivate ()
EndIf

Funkcija "UserBufferIsActive" ima celobrojnu povratnu vrednost koja je jedinica ili "true" ukoliko je virtualni preglednik aktivan, a nula ili "false" ukoliko on nije aktivan. U slucaju da je aktivan, bice deaktiviran funkcijom "UserBufferDeactivate".
U nastavku skripte se nalazi uslovna "If... Then... Else... EndIf" programska struktura u kojoj se u prvom bloku izvrsava "HotKeyHelp" specifican za Sound Recorder, a u drugom bloku se izvrsava standardni "HotKeyHelp".
Slozeni uslov na osnovu cije istinitosti se izvrsava prvi ili drugi blok naredbi je:
if (StringContains (GetWindowName (GetRealWindow (GetFocus())), wn1)) ||
(! MenusActive ()) ||
(GetWindowClass (GetParent (GetFocus ())) != wcDialog) ||
(! DialogActive ()) then

To su cetiri uslova povezana logickim operatorima "ili", (||), a citav uslov je ispunjen ukoliko je bilo koji od njih ispunjen.
Da pogledamo sta svaki od cetiri poduslova posmatra.
Prvi uslov:
(StringContains (GetWindowName (GetRealWindow (GetFocus())), wn1))

deluje prilicno glomazno. Sa malo analize, i poznavanja Jaws funkcija, stvari se mogu uprostiti i postati sasvim jasne.
Upotrebljena je funkcija "StringContains" koja ima za cilj da proveri da li se u nekom stringu, pojavljuje neki drugi string kao njegov deo. Funkcija ima dva string parametra od kojih je prvi string koji pretrazujemo, a drugi string cija se pojava u prvom ispituje. Funkcija ima povratnu vrednost koja predstavlja redni broj slova od kojeg se u prvom stringu pojavljuje drugi string. Ukoliko se drugi string ne nalazi u prvom, povratna vrednost je nula.
U nasem slucaju, prvi parametar je izraz:
GetWindowName (GetRealWindow (GetFocus()))

i kao rezultat tog izraza zelimo da dobijemo ime prozora.

Drugi parametar je konstanta:
wn1
koja je definisana u "SndRec32.jsm" fajlu ovako:
swn1 = "- Sound Recorder"
i predstavlja obavezni desni deo naslova Sound Recorder-a. To je string koji trazimo u naslovu prozora kako bismo utvrdili da li se fokus nalazi unutar njega.
Vracamo se objasnjenju prvog parametra funkcije "StringContains":
GetWindowName (GetRealWindow (GetFocus()))

gde je za dobijanje naslova prozora upotrebljena funkcija "GetWindowName". Ova funkcija kao svoju povratnu vrednost ima string koji predstavlja ime prozora, ili prazan string ukoliko prozor nema naslov. Funkcija ima jedan parametar tipa "handle". Do sada smo sretali string i int tipove promenljivih, a sada cemo reci ovde da je "handle" promenljiva koja sadrzi jedinstven broj nekog prozora na osnovu kojeg ga Windows identifikuje.
Posto je nama potreban "handle", ne bilo kojeg prozora, vec onog koji ima naslov, (real window), upotrebljena je funkcija "GetRealWindow". Ova funkcija kao svoju povratnu vrednost ima handle prozora koji ima naslov. Funkcija ima jedan parametar koji je takodje handle i koji sluzi kao startni prozor od kojega se krece u potragu za prozorom koji ima naslov.
I konacno, ovaj startni handle dobijamo upotrebom funkcije "GetFocus" koja nema parametara a povratna vrednost joj je handle prozora sa fokusom. Funkcija posmatra PC kursor ili oznacenu stavku, bez obzira na to koji je kursor trenutno aktivan. Treba je razlikovati od funkcije "GetCurrentWindow", koja daje handle prozora u kome se nalazi trenutno aktivni kursor.
  

Ako ste se umorili od sve ove zbrke, i gotovo da ste spremni da dignete ruke od svega, to nije nista neobicno i ne desava se samo vama. Zato, spremite sebi neki osvezavajuci napitak i odmorite se malo a zatim se vratite na gornja objasnjenja. Ne idite dalje dok ne budete sigurni da znate za svaku funkciju zasto je bas tu upisana, koliko ima parametara, koga su oni tipa i koji deo citavog izraza daje kao svoju povratnu vrednost bas taj tip parametra. Kada ovo jednom shvatite, bice vam lako da tumacite slicne izraze u postojecim skriptama, a dok upotrebljavate "Insert Function" dijalog za pisanje skripti, lakse cete se snaci u popunjavanju parametara po nivoima.

Vracamo se na delove naseg slozenog uslova.
Drugi uslov:
(! MenusActive ())

Upotrebljena je funkcija "MenusActive", ciji je zadatak da utvrdi da li je meni aktiviran ili nije. Ispred ove funkcije je upisan operator "!", (uzvicnik). Njegova je uloga da okrene logicki smisao vrednosti ispred koje se nalazi. Umesto uzvicnika, moze se upotrebiti i programska rec "not". Dakle, bez ovog predznaka, deo uslova bi bio ispunjen kada je meni aktivan, a uz upotrebu ovog predznaka, uslov je ispunjen u slucaju da meni nije aktivan.

Treci uslov:
(GetWindowClass (GetParent (GetFocus ())) != wcDialog)

slicno prvom, malo je slozeniji. Sa leve i desne strane operatora "!=", (uzvicnik jednako), nalaze se izrazi koji se uporedjuju. Upotrebom operatora "!=" uslov postaje ispunjen ukoliko su vrednosti sa njegovih strana razlicite. Ranije smo vec rekli da se za slucaj da posmatramo da li su dve vrednosti jednake upotrebljava operator "==", (dvostruki znak jednakosti).
Sa leve strane je izraz:
GetWindowClass (GetParent (GetFocus ())

ciji je zadatak da da string koji predstavlja ime klase prozora u kome je prozor sa fokusom.

A sa desne strane se nalazi konstanta:
wcDialog
koja je definisana u fajlu "SndRec32.jsh" kao
	wcDialog = "#32770".
Ovo je klasa prozora koji se pojavljuje aktiviranjem stavke "About Sound Recorder" iz help menija.

Da pogledamo sada izraz sa leve strane.
GetWindowClass (GetParent (GetFocus ()) 

Funkcija "GetWindowClass" nam daje ime klase nekog prozora u obliku stringa kao svoje povratne vrednosti. Ima kao jedini parametar handle prozora cije ime klase zelimo.
Ovaj handle dobijamo kao povratnu vrednost funkcije "GetParent" i to je handle prozora koji je kreirao dati prozor ciji cemo handle navesti kao njen jedini parametar. U nasem konkretnom slucaju koji se odnosi na About Sound Recorder prozor, to je handle upravo tog prozora koji je kreirao "OK" dugme, na kome se nalazi fokus. Handle "OK" dugmeta dobijamo kao povratnu vrednost funkcije "GetFocus".

Cetvrti uslov:
(! DialogActive ())

na potpuno analogan nacin kako se u drugom delu uslova utvrdjuje da li je aktivan meni, utvrdjuje se da li je aktivan dijaloski prozor.

Sada kada smo pogledali citav uslov od koga zavisi izvrsenje dva bloka naredbi da pogledamo i same blokove.
Prvi blok:
	let sTemp_L =msgHotKeyHelp1_L + cScBufferNewLine 
	let sTemp_S = msgHotKeyHelp1_S + cScBufferNewLine 

	let sTemp_L =AddToString(sTemp_L,msgHotKeyHelp2_L)
	let sTemp_S = AddToString(sTemp_L, msgHotKeyHelp2_S)
	SayFormattedMessage(OT_USER_BUFFER, sTemp_L, sTemp_S)

dodeljuje vrednosti string promenljivama i prikazuje ih kao poruke u virtualnom pregledniku. Konstante, odnosno poruke
msgHotKeyHelp1_L i msgHotKeyHelp1_S, kao i msgHotKeyHelp2_L i msgHotKeyHelp2_S definisane su u "SndRec32.jsm" fajlu.
Konstanta kojom se pri upisu stringa postize prelazak na novu liniju "cScBufferNewLine" definisana je u "Common.jsm" fajlu ovako:
cScBufferNewLine = "\n".

Za dodavanje drugog dela poruka upotrebljena je posebna funkcija koja je definisana u Sound Recorder.jss fajlu. To je funkcija "AddToString".

I konacno se poruke prikazuju u virtualnom pregledniku pomocu:
	SayFormattedMessage(OT_USER_BUFFER, sTemp_L, sTemp_S)

Ovu smo funkciju upoznali na prethodnom casu a ovde mozemo samo da napomenemo da je konstanta OT_USER_BUFFER kao prvi parametar funkcije, ta koja ukazuje Jaws-u da poruke treba prikazati u virtualnom pregledniku.

Drugi blok:
	PerformScript HotKeyHelp()

Sastoji se od samo jednog programskog reda i zaduzen je za izvrsavanje default-ne "HotKeyHelp" skripte za slucaj da kompletni posmatrani uslov nije ispunjen.

To je sve o ovoj skripti a na sledecem casu cemo nastaviti sa objasnjavanjem Sound Recorder.jss fajla.
 "Lekcija 23."

 "Skok na sadrzaj "