Pagina 4 din 10

Scris: 01 Feb 2010, 02:52
de Manu
Weekend-ul acesta mi-am mai facut timp pentru Trucker, daca tot mi-a trecut durerea de masea si mai este si vacanta.
Am lucrat sambata cateva ore sa pigulesc pozitii pe ruta Londra - Bucuresti.

Sa o iau sistematic cu ceea ce am facut pana in prezent.
Am realizat in Excel un tabel cu 4 randuri si multe coloane. Fiecare coloana contine in cele patru celule urmatoarele informatii: pe primul rand localitatea sau numele drumului unde nu este localitate, pe al doilea rand este doar numele drumului, pe al treilea rand se afla kilometrul corespunzator, iar pe al patrulea si deocamdata ultimul rand se afla tara corespunzatoare pozitiei.
Am facut astfel pentru a fi sigur ca nu atribui gresit valori unei pozitii, de exemplu coloana Cluj-Napoca are pe cele trei randuri de sub numele orasului: "E60" - ruta europeana care trece pe aici, apoi "3005" care ar fi borna de kilometraj, practic atatia kilometri sunt din londra pe ruta constituita, iar pe ultimul rand este "Romania", tara in care ne aflam.
Dupa aceea am salvat fisierul in format CSV, adica un fel de text unde apare intre celule semnul ";" (punct si virgula). Cu functia Find and Replace din Notepad am inlocuit punct si virgula cu bara verticala, astfel ajungand sa am 4 stringuri din acelea cu mai multe segmente delimitate de bare verticale. Pe acestea le-am atribuit constantelor: pentru sRuta stringul cu numele localitatilor, pentru sRoad stringul cu numele drumurilor, pentru sKM stringul cu bornele de kilometraj si pentru sCountry stringul cu tarile.
E clar ca cele patru stringuri au un numar egal de segmente, de aceea am si inceput treaba in excel pentru a nu ma incurca. Teoretic a ramas tot un tabel.

Conteaza acum principiul de functionare al deplasarii printre segmente, ceasul l-am tratat mai sus.
Avem o variabila de tip integer pe care am denumit-o iLoc, iar aceasta este incrementata cu cate unu dupa metoda Let iLoc = iLoc + 1. Apoi, in functia string segment iLoc va fi al treilea parametru. Folosind de patru ori functia StringSegment, doar primul parametru variand, vom schimba pozitia pe toate cele patru randuri de tabel.

Pun mai jos doar scriptul de deplasare in forma lui actuala, una foarte rudimentara. Dupa cod mai sunt cateva explicatii edificatoare, fara ele nu prea se poate intelege functia definita.

Inceput cod:

Function TruckForward ()
Let iLoc = iLoc + 1
If iLoc > iTotalLocuri Then
Let iLoc = iTotalLocuri
EndIf
Let sLoc = StringSegment (sRuta, "|", iLoc)
Let sRoadA = StringSegment (sRoad, "|", iLoc)
Let sKMA = StringSegment (sKM, "|", iLoc)
Let sCountryA = StringSegment (sCountry, "|", iLoc)
EndFunction

Sfarsit cod

sLoc, sRoadA, sKMA si sCountryA sunt variabilele pentru pozitia actuala, lor li se atribuie valorile din segmentele lungi in urma aplicarii functiei StringSegment ().
Pentru a nu trece de Bucuresti undeva in vant, am mai facut o mica improvizatie, cu ocazia asta invatam si o functie noua.
Am introdus variabila iTotalLocuri, acesteia atribuindu-i-se o valoare egala cu numarul total de locatii. Exista in AutoStartEvent () functia aplicata:
Let iTotalLocuri = StringSegmentCount (sRuta, "|")
Aceasta functie numara cate segmente delimitate de bare verticale exista in stringul lung sRuta, adica, la origine, in primul rand de Excel. Nu am scris manual numarul total de locatii, pentru a fi posibila in viitor introducerea de noi locatii pe ruta, fara sa fie necesara renumararea segmentelor.
Apoi, cum variabila iLoc tot creste cu cate o unitate cand i se spune, in functia de deplasare a fost introdus un If care sa verifice de fiecare data daca iLoc nu ajunge sa fie mai mare decat iTotalLocuri, moment in care nu ar mai fi segmente in cele patru stringuri lungi. Cand se ajunge aici, in mod fortat iLoc este adus la valoarea iTotalLocuri, deci ramane tot timpul la capat, in Bucuresti pe Calea Victoriei, la kilometrul 3427. Printr-un procedeu asemanator nu inainteaza nici timpul in momentul in care nu exista deplasare.
In posturi viitoare as putea pune coduri mai multe, insotite de continutul constantelor si de mesajele inglobate. Sa vedem, poate cel mai simplu ar fi sa le punem in fisiere TXT care se deschid in pagina noua actionand un link de aici.
Oricum, deseara facem si la curs cate ceva despre formatare, astfel ajungand mai la zi, deci devenind inteligibil pentru mai multi modul de impartire a informatiilor pe fisiere diferite.

Sper ca zilele acestea sa fac si kit de instalare pentru a putea testa in mod practic lucrurile, deocamdata si sursa va fi vizibila, astfel incat oricine poate veni cu idei si in urma incercarilor direct pe cod.

Dezactivare citire automata la incarcarea paginilor de WEB

Scris: 03 Feb 2010, 14:14
de Manu
Parca Gelu era cel care spunea in timpul ultimului curs de Scripting ca ar vrea ca la incarcarea unei pagini in Internet Explorer sau Mozilla sa nu mai inceapa automat citirea continutului dupa ce se anunta numarul de landmark-uri, heading-uri si link-uri. Ei bine, are dreptate, e mult mai comod, cand se incarca o pagina si mergi de langa calculator sa nu se apuce sa citeasca, sa turuie intruna continutul, mai ales ca de obicei nu ne intereseaza informatia chiar din acel loc in care se nimereste sa fie cursorul.
Am cautat ceva pana sa gasesc unde s-ar face asta, iar dupa ce am pierdut mult timp studiind scripturile pentru VIRTUAL, am descoperit ca de fapt de acolo se fac trimiteri catre o setare dintr-un fisier extern, un fisier de tip .JSI cu care nu prea am lucrat noi in mod direct.

Pe scurt, pentru a rezolva problema nu trebuie decat urmatoarele:
A se merge din Meniul Start, din Program, Jaws, cu ajutorul Explore JAWS, in Shared Settings, adica in ENU cu fisierele legate de scripting venite din fabrica. Cu alte cuvinte, a se merge in ENU din All users.
Acolo exista un folder numit PersonalizedSettings in care intram.
Gasim fisierul numit "virtual.JSI" pe care il deschidem in Notepad pentru a-i aplica o modificare simpla.
Acest fisier are doar doua randuri care se refera stric doar la citirea automata a continutlui la incarcarea unei pagini.
Continutul fisierului "virtual.JSI" arata astfel:

Inceput cod

[Virtual Options]
SayAllOnDocumentLoad=1

Sfarsit cod

Nu trebuie decat sa schimbam acel 1 in 0, sa salvam fisierul, inchidem Notepad, repornim JAWS si am scapat.

Pentru cei interesati, sa retina ca in HJConst.JSH sunt definite ca si constante:
1 = TRUE,
0 = FALSE
Deci, in cazul de fata am schimbat din TRUE in FALSE, din adevarat in fals referitor la citirea automata dupa incarcarea paginilor.

Fisierele JSI (JAWS Script Initialization) stocheaza diferite setari personalizate. In astfel de fisiere se pot face setari pentru fiecare site in parte, diferite preferinte de afisare a continutului, de verbalizare etc..
Aflati pe orice site se poate apasa Insert + Shift + V pentru a deschide dialog box-ul Personalized Settings. Setarile efectuate iar in considerare toate paginile unui site, nu doar pagina curenta. De exemplu, daca aflandu-ne pe pontes.ro pe acest mesaj (deci pe forum) si setam ca totusi la incarcare sa ni se citeasca automat continutul, si cand vom merge in Divertisment ni se va citi automat tot continutul.
De asemenea, din Personalized Settings dialog box se poate seta ca o pagina sa isi faca refresh-ul automat sau nu; deci, aflandu-ne pe livescore.com de unde multi obisnuim sa aflam rezultate, putem seta sa nu se mai faca refresh automat, ei avandu-l setat la doua secunde, timp care uneori nu ne este suficient pentru a vedea toate rezultatele de la un moment dat din Europa League unde joaca atat de mult eechipe.

Informatii in engleza despre Personalized Settings se gasesc aici.

Scris: 03 Feb 2010, 23:44
de Cornel
Daca vrea cineva sa stie cate secunde arata ceasul calculatorului, iata mai jos, un script pe care il puteti copia, urmand pasii urmatori: asadar, copiati codul cuprins intre randurile: Inceput cod si Sfarsit cod, fixati-va pe fereastra desktop, sau my documents, sau my computer, tastati comanda insert + cifra zero, se va deschidefisierul sursa; tastati apoi control + shift + d, pentru a se deschide fisierul default, fixati-va cu control + end la sfarsitul acestui fisier, dati enter de doua ori si lipiti codul pe care l-ati copiat. Infine, fixati-va pe unul din randurile acestui cod pe care l-ati lipit in fisierul default, tastati control + d mergeti cu tabul pana la assign to, unde aplicati o comanda prin care acest script e invocat, bunaoara, ef2; mai dati un tab, pentru a ajunge la o.k. button si, normal, enter. In sfarsit, salvati schimbarile survenite prin lipirea scriptului cu ctrl + s.

Inceput cod

script Secundar ()
Var
string sSecunde
let sSecunde = SysGetTime ("ss")
SayString (sSecunde)
EndScript

Sfarsit cod

Scris: 04 Feb 2010, 00:34
de Mira
Imi place ca lumea e interesata de scripturi, acum si eu sunt pasionata si incerc sa inteleg cat mai mult din toate.
Pun si eu un script pe care l-am facut pentru tema 5, aici Jaws spune ora ca la insert + f12, dar mai spune si un mesaj. Ceea ce a scris cornel mai sus pentru instalarea scriptului este valabil in totalitate.

Inceput cod

Script SalutaInFunctieDeOra ()
Var
String sOra,
Int iOra
SayString (SysGetTime ("H,mm") )
Let iOra = StringToInt (sysGetTime ("H"))
If iOra <= "6" Then
SayString ("E tarziu si inca nu dormi? Rau faci. Maine dimineata nu o sa te trezesti si, vai, cate treburi ai de facut")
ElIf iOra <= "12" Then
sayString ("Sper ca te-ai trezit. Nu mai lenevi in pat! E timpul sa te trezesti. Ai foarte multe de facut azi.")
ElIf iOra <= "19" Then
SayString ("Salut! E dupa-amiaza! Daca nu ti-ai rezolvat treburile pana acum, nu-i bai, mai ai timp pana la 20")
ElIf iOra <= "23" Then
SayString ("E seara. Gata cu treburile pe azi! E timpul sa te relaxezi.")
EndIf
EndScript

Sfarsit cod

De tema asta am fost foarte incantata ca am reusit sa o fac. :D

Title viewer

Scris: 07 Feb 2010, 08:50
de Grifnas
In randurile de mai jos, inserez codul unui script care virtualizeaza titlul ferestrei curente...

Deci, ca si in cazul altor scripturi, inserati acest cod in fisierul ".jss" al unei aplicatii sau, daca doriti sa poata fi folosit in toate aplicatiile instalate pe calculatorul vostru, in "default.jss"...
Nu uitati sa scrieti, in fisierul respectiv, in cel in care veti insera acest cod, linia:

Inceput cod
Include "hjconst.jsh"
Sfarsit cod

Asadar... codul propriu-zis al script-ului despre care vorbeam:

Inceput cod
Script TitleViewer ()
Var
String sMsg_l,
String sMsg_s
Let sMsg_l = "Titlul ferestrei curente este: " + GetAppTitle () + ". Se virtualizeaza titlul. Dupa vizualizare, apasati Escape!"
Let sMsg_s = GetAppTitle () + ", Se virtualizeaza."
SayFormattedMessage (OT_MESSAGE, sMsg_l, sMsg_s)
Pause ()
If UserBufferIsActive () then
UserBufferDeactivate ()
EndIf
SayFormattedMessage (OT_USER_BUFFER, GetAppTitle ())
EndScript
Sfarsit cod

Astept comentarii, critici si, de ce nu?!, corecturi!...

Scris: 07 Feb 2010, 10:23
de Manu
Eu zic ca scriptul e ok, complet, are si mesaje dedicate in functie de nivelul utilizatorului.
Poate fi foarte util, mai ales in Default.JSS, unde se poate pune o combinatie de taste valabila apoi in orice program. Se intampla de multe ori sa nu se inteleaga pe ce fereastra suntem, ce fisier este deschis, astfel va aparea un mesaj virtualizat care poate fi citit pe litere si apoi inchis cu Escape. Pentru cine nu stia, Winamp are in scripturi asa ceva. Cand nu se intelege melodia care canta, se apasa Insert si de doua ori T rapid succesiv si apare un mesaj virtualizat cu ceea ce se pronunta la un simplu Insert + T.
Luni exact despre virtualizare vom vorbi.

tema pentru cursul de scripting

Scris: 08 Feb 2010, 11:02
de AurelioMuth
Salut Manu, am aflat abia joi, 4 februarie de curs si am descarcat lectiile pana la a VIII-a. azi am terminat-o pe a VII-a si vreau sa iti pun aici tema cu cronometrul.
Eu am rezolvat altfel problema cu vorbitul promptului. acum imi spune fara nici o problema de la inceput pana la sfarsit cronometrajul.
Ca si taste calde am pus Control+Space.
Iata scriptul:

Inceput cod
Script Cronometro ()
Var
String sStop,
String sBeep,
Int iBeep,
Int iStop,
Int iUrca
InputBox ("Pentru cat timp vrei cronometrul?", "secunde", sStop)
InputBox ("La cate secunde vrei sa auzi bip?", "Scrie aici:", sBeep)
Let iStop = StringToInt (sStop)
Let iBeep = StringToInt (sBeep)
Let iUrca = 0
While iUrca < iStop
SpeechOff ()
Delay (10)
SpeechOn ()
Let iUrca = iUrca + 1
SayInteger (iUrca)
If iUrca % iBeep == 0 Then
Beep ()
EndIf
EndWhile
Pause ()
SayString ("Tempo scaduto!")
EndScript
Sfarsit cod

Sper sa fie ok.
As vrea, daca poti, sa-mi dai ceva sugestii pentru a face un cronometru care sa mearga pana il opresc eu.
Pe curand!

Scris: 08 Feb 2010, 15:54
de Manu
Este chiar perfect!
Poate ca detii recordul la durata de invatare a scripturilor, doar in 3/4 zile... Cum ai reusit? Ai stat si ai avut timp si de ascultat si de facut practic lucrurile?

In legatura cu metoda de oprire a cronometrului oricand, solutia mea ar fi crearea unei variabile Int iFinish care inainte de While sa aiba valoarea 0.
Se creeaza la While inca o conditie, adica se completeaza ceea ce este acum cu urmatoarea secventa:
&& iFinish == 0
Asadar, cronometrul va functiona atata vreme cat variabila iFinish este 0.
Pentru a o face sa nu mai fie 0, cream inca un scriptulet de forma:
Inceput cod
Script ForceStop ()
Let iFinish = 1
EndScript
Sfarsit cod
Deci, apasand combinatia de taste pentru scriptul ForceStop, iFinish devine 1 din 0, iar a doua conditie la While nu mai este indeplinita.

Felicitari pentru invatarea atat de rapida a scriptingului, am fost placut surprins cand am vazut ca a mai aparut un scripter.

Scris: 14 Feb 2010, 14:44
de Bordanc_Nicu
As dori sa stiu de unde se pot lua cursurile de Jaws scripting?
Si as mai avea o intrebare:
La apasarea, insert plus f12 de doua ori rapid, se pronunta data. S-ar putea, eventual la apasarea altor taste tot de doua ori, sa spuna secundele?

Scris: 14 Feb 2010, 16:03
de Manu
Inregistrarile sunt in urmatorul folder:
Jaws Scripting pe server

In legatura cu aceeasi combinatie de taste repetata treburile stau cam in felul urmator, asta pentru cei care deja au invatat sa faca scripturi.
Exista o functie IsSameScript () care verifica daca in de curs de 500 de milisecunde s-a apasat din nou combinatia de taste care a actionat scritpul in derulare. Pentru ceas de exemplu, scriptul facut de Freedom Scientific arata in felul urmator:

Inceput cod

Script SaySystemTime ()
var
string sTimeOrDate
If (IsSameScript ()) then
Let sTimeOrDate = FormatString (cmsgGetSysDate, SysGetDate ())
Else
Let sTimeOrDate = FormatString (cmsgGetSysTime, SysGetTime ())
endIf
SayUsingVoice ( VCTX_MESSAGE, sTimeOrDate, ot_user_requested_information)
EndScript

Sfarsit cod

Deci, dupa cum se vede, intr-un IF se verifica daca s-a actionat de doua ori acelasi script, adica SaySystemTime (), iar cand raspunsul este TRUE, se returneaza data, cand este FALSE, adica la ELSE, se spune ora.

Scris: 14 Feb 2010, 20:57
de Bordanc_Nicu
Multumesc mult!!!
Vreau sa ma apuc si eu de jaws scripting!

Scris: 17 Feb 2010, 16:56
de Manu
O provocare pentru cand avem timp ar fi sa gasim daca se poate citi si eventual scrie un fisier .INI pe server... Daca am reusi acest lucru... am ajunge sa putem face cu adevarat jocuri online cu parteneri la distanta...
In cel mai simplu mod incercat, adica cu URL-ul catre fisierul INI pus intre ghilimele ca ultim parametru la functia IniReadString () nu a mers... Ori trebuie sa scriem putin altfel, mai ales ca pentru un fisier din calculator se folosesc doua Back-Slash-uri intre foldere...
Le-am trimis un mail si celor de la Freedom Scientific, poate au amabilitatea sa imi raspunda... am scris de pe un calculator cu JAWS cu licenta.

Scris: 18 Feb 2010, 16:25
de AurelioMuth
as avea 2 intrebari:

1. listview se face doar citind cheile unei sectiuni dintr-um fisier ini?
2. La exercitiul cu IniReadSectionKeys rezultatul interogarii este un numar. cum putem citi tot randul respectivei sectiuni pe baza acestui numar?

Merci.

PS. As mai vrea sa stiu daca pot merge in contemporan doua PlaySound-uri si cum se intrerupe un playsound pentru a face loc altuia.

Scris: 18 Feb 2010, 17:44
de Manu
1. List view se poate face din orice, conteaza ca primul parametru sa fie un string care contine segmente delimitate de bare verticale.
De exemplu putem crea o constanta de tipul:
sMeniu = "Cafea|Suc|Bere|Sandvis"
Apoi un list view care sa contina optiunile din sMeniu va arata astfel:
DlgSelectItemInList (sMeniu, "Alege ceva din meniu", FALSE)
Se va afisa un list view cu optiunile continute de sMeniu neordonate alfabetic.

2. Intrebarea a doua nu prea am inteles-o... Poate o reiei sub alta forma.

3. Functia PlaySound () da drumul la un sunet care va fi redat in intregime; daca intervine un alt PlaySound (), sunetul aflat in redare va fi oprit.
Deci, pentru a opri un sunet redat prin PlaySound (), este nevoie de un alt sunet care sa intervina. O solutie ar fi crearea unui script care sa aiba un PlaySound ("empty.wav"), unde fisierul "empty.wav" sa fie un track gol de o milisecunda.
Functiile aflate in script dupa PlaySound continua sa ruleze dupa ce sunetul este pornit, asadar, daca e nevoie ca inainte de toate sa fie redat intregul fisier audio si abia apoi sa se continue performarea scriptului, trebuie un Delay (xx), unde xx sa fie timpul egal cu al lungimii fisierului WAV.

Scris: 18 Feb 2010, 21:31
de AurelioMuth
Pai, de exemplu, cum ai scris tu sMeniu cu cele cateva obtiuni de ales.
apare lista, tu alegi un produs si jaws-ul trebuie sa spuna ce ai ales.

Nu inteleg partea asta din urma. cum il faci sa spuna produsul ales de tine.
Mie imi spune toate produsele.

Sper ca m-am facut inteles.