Programare in Jaws Scripting, aplicatii practice

Diverse limbaje, programare, scripting, coduri, unelte specifice etc.
Scrie răspuns
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Functia DldSelectItemInList () returneaza un integer egal cu al catelea item neordonat alfabetic a fost ales.

Urmatorul script va spune itemul ales, il voi explica putin dupa:

Inceput cod
Include "HJConst.JSH"

Const
sMenu = "Cafea|Ceai|Whisky|Pizza",
sTitle = "Alege din meniu"

Script SpuneItemAlesDinLista ()
Var
String sItem,
Int iItem
Let iItem = DlgSelectItemInList (sMenu, sTitle, FALSE)
Let sItem = StringSegment (sMenu, "|", iItem)
Say (sItem, OT_MESSAGE)
EndScript
Sfarsit cod

In primul rand nu am afisat pur si simplu un list view fara nici un efect, ci acel integer pe care il returneaza DlgSelectItemInList () l-am atribuit ca valoare variabilei iItem. Daca s-ar da enter pe Pizza, iItem va deveni 4.
Am folosit apoi functia StringSegment (), unde stringul este tot sMenu, semnul care delimiteaza itemii este bara verticala, iar al catelea segment sa fie extras este dat de iItem. Valoarea returnata de StringSegment () am atribuit-o lui sItem.
Sper ca am fost destul de inteligibil... Astept acum pe aceasta schema, avand dintr-un list view un string care contine segmentul extras, o mica agenda telefonica in care sa ni se citeasca numarul de mobil aflat dupa semnul egal intr-un fisier Ini. Inainte de egal consideram ca sunt numele persoanelor.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
AurelioMuth
Sergent
Mesaje: 33
Membru din: 25 Aug 2009, 10:53
Localitate: Italia
Contact:

Mesaj de AurelioMuth »

Manu, sper ca nu te superi daca iti scriu mai jos un script cu ceea ce mi-ai explicat mai sus, dar care nu este in forma pe care ai cerut-o.

Eu apucasem azi dimineata sa ma gandesc si sa fac sa functioneze ceea ce voiam inainte de a citi topicul tau.

Oricum as vrea sa te uiti la ceea ce iti scriu pentru ca mi-ar place sa stiu daca am inteles corect cum functioneaza chiar daca tema nu e respectata.

Inceput cod
Include "hjconst.jsh"
Const
sLimba = "Romaneste|Italiano|English"

Script test ()
Var
String sTest,
Int iTest1
Let iTest1 = DlgSelectItemInList (sLimba, "Test", false)
Let sTest = StringSegment (sLimba, "|", iTest1)
If sTest == "Italiano" Then
SayString ("Ciao!")
ElIf sTest == "Romaneste" Then
SayString ("Salut!")
ElIf sTest == "English" Then
SayString ("hallo!")
EndIf
EndScript
Sfarsit cod
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Aproximativ in acelasi fel am lucrat in Pontes Casino, If-uri per alegere. Adica alegi de la bar sandvis, ti se iau din buzunar 5 euro, alegi cafea, se iau 2 euro etc.
Este perfect cand numarul de segmente este clar definit, nu este preluat dintr-un Ini care tot creste ca numar de optiuni.

Tu ai facut practic fara rost un rand in plus, ce rost mai avea sTest?
Puteai merge pe sistemul:

Inceput cod
If iTest1 == 1 Then
SayString ("Salut!")
ElIf iTest1 == 2 Then
SayString ("Ciao!")
ElIf iTest1 == 3 Then
SayString ("Hallo!")
EndIf
Sfarsit cod

O cale si mai simpla ar fi crearea inca a unei constante:

sEnunturi = "Salut!|Ciao!|Hallo"

Nu mai e nevoie de If neaparat. ia sa vedem solutia.
Mentionez ca tot scriptul poate avea chiar doar doua randuri pentru a spune salutul in functie de limba. Deci se poate doar cu doua randuri in interiorul scriptului, plus constantele de sus.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
AurelioMuth
Sergent
Mesaje: 33
Membru din: 25 Aug 2009, 10:53
Localitate: Italia
Contact:

Mesaj de AurelioMuth »

Da, ai dreptate ca este un pic cam intortochiat, dar mie imi trebuia pentru altceva.

Cu privire la topicul dinainte de al meu privitor la mica agenda telefonica.
Nu reusesc sa citesc, doar ceea ce se afla inainte de egal - numele contactelor. numerele de dupa egal nu imi iasa deloc.
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Pai daca ai cheia intr+o variabila string... nimic mai simplu, faci chiar ce am facut luni, adica un IniReadString () in care al doilea parametru sa fie variabila cu numele, deci cheia.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
AurelioMuth
Sergent
Mesaje: 33
Membru din: 25 Aug 2009, 10:53
Localitate: Italia
Contact:

Mesaj de AurelioMuth »

Manu, di npacate nu imi reuseste.
am facut pentru inceput un script cu care sa introduc numele si numerele aferente.
Apoi am facut un alt script cu care sa dau posibilitatea sa se aleaga numele dintr-un listview si pe baza numelui sa dea ca raspuns numarul de telefon.
Am folosit functiile IniReadSectionKeys si DlgSelectItemInList pentru prima parte a scriptului. mi se parea logic.dar apoi nu pot sa scot rezultatul pe care il vreau. am incercat si cu inireadstring dar nu merge.
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Agenda telefonica, cod complet

Mesaj de Manu »

OK, cred ca nu te-ai concentrat destul, era chiar foarte simplu, partea mai greu de inteles ar fi cea cu gasirea numelui sub forma de string din list view.
Pun mai jos doua scripturi, unul pentru introducere in baza de date si unul pentru interogare corecta. Comentarii dupa sfarsitul codului.

Inceput cod
Include "HJConst.JSH"

Script InserareNumere ()
Var
String sNume,
String sNumar
InputBox ("Numele persoanei", "Nume", sNume)
Pause ()
InputBox ("Numarul de telefon", "Numar", sNumar)
Pause ()
If StringIsBlank (sNume) || StringIsBlank (sNumar) Then
SayString ("Nu ati completat unul dintre campuri, deci nu a fost adaugat nimic in agenda.")
Else
IniWriteString ("Agenda", sNume, sNumar, "Agenda.INI")
SayString ("Ati introdus " + sNume + " cu numarul " + sNumar)
EndIf
EndScript

Script InterogareAgenda ()
Var
Int iNume,
String sToateNumele,
String sNume,
String sNumar
Let sToateNumele = IniReadSectionKeys ("Agenda", "Agenda.INI")
Let iNume = DlgSelectItemInList (sToateNumele, "Alege un nume", TRUE)
If iNume == 0 Then
SayString ("Ati apasat escape")
Else
Let sNume = StringSegment (sToateNumele, "|", iNume)
Let sNumar = IniReadString ("Agenda", sNume, "Nimic", "Agenda.INI")
SayString (sNume + " are numarul " + sNumar)
EndIf
EndScript
Sfarsit cod

Oricine copiaza codul de mai sus in Default.JSS si pune cate o combinatie de taste pentru ambele scriptulete , va avea cea mai simpla agenda cu putinta, valabila oriunde ar fi pe calculator cu JAWS pornit. La combinatia asignata primului script va fi intrebat pe rand numele si numarul de telefon, apoi acestea vor fi automat introduse in baza de date. Apasand combinatia de taste pentru al doilea script, va aparea o lista cu toate numele aranjate alfabetic, iar la apasarea unui enter pe unul dintre ele, ni se spune numele si numarul existente in baza de date.
In abele scripturi exista cate un If care verifica:
1. Daca unul dintre stringurile sNume sau sNumar este gol, atunci nu se introduce nimic in baza de date. Asta in cazul ca s-a apasat escape sau din greseala s-a apasat enter pe unul dintre campuri fiind gol.
2. In al doilea script se verifica daca variabila iNume este egala cu 0, adica daca s-a apasat escape pe list view si nu s-a mai interesat utilizatorul de vreun numar.
Atentie! daca se pune codul de mai sus in Default.JSS, nu mai este necesar primul rand, Include "HJConst.JSH".

Acum putem discuta pe aceste scripturi despre ce nu ar fi clar. Trebuie putina concentrare pentru a patrunde jongleria cu variabilele.
Astept intrebari, imi place foarte mult sa discut concret pe un script.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
AurelioMuth
Sergent
Mesaje: 33
Membru din: 25 Aug 2009, 10:53
Localitate: Italia
Contact:

Mesaj de AurelioMuth »

Ok, acum merge. Uitasem de StringSegment. Merci!

Daca iti mai vine in minte, tie ori poate altuia, mai puneti diverse provocari.
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Provocarea mea pentru toti cei interesati ar fi dezvoltarea acestei agende. Tot cu list view, un script pentru a alege un nume pe care sa il putem modifica cu tot cu numarul aferent.
De asemenea ar mai trebui un script pentru stergerea numerelor.
Daca am mai seta ca fisierul asa-zis baza de date sa fie pe Partitia D, ar fi chiar util unora, o agenda mai rapida neavand, practic o combinatie de taste actioneaza suficient. Eventual putem pune ca la o combinatie de taste sa fie valabil totul, adica sa apara un meniu din care sa alegem: Adaugare numar, Modificare, Stergere, Gasire etc.. Practic se poate face un list view care sa actioneze prin PerformScript toate celelalte scripturi.
Deocamdata, pe baza celui de-al doilea script de mai sus, sa incercam crearea unui script pentru modificarea unui numar existent.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
AurelioMuth
Sergent
Mesaje: 33
Membru din: 25 Aug 2009, 10:53
Localitate: Italia
Contact:

Mesaj de AurelioMuth »

Salutare,

Deocamdata am reusit sa fac pe langa scriptul de consultare a agendei, unul pentru modificarea unui numar si unul pentru stergerea unuia.

Nu tineti cont de estetica. Pun mai jos scripturile care la mine functioneaza.

Inceput cod
Include "hjconst.jsh"
Globals
String sNume,
Int iNume,
String sNrtel,
String sContact

Script ModificaContact ()
SayString ("Alege un nume al carui numar vrei sa-l schimbi.")
Let sContact = IniReadSectionKeys ("Agenda1", "AgendaMea.ini")
Pause ()
Let iNume = DlgSelectItemInList (sContact, "alege un nume", true)
Pause ()
Let sNume = StringSegment (sContact, "|", iNume)
Pause ()
Let sNrtel = IniReadString ("Agenda1", sNume, "Contact negasit", "AgendaMea.ini")
Pause ()
InputBox ("Scrie noul numar", "Numar", sNrtel)
Pause ()
IniWriteString ("Agenda1", sNume, sNrtel, "AgendaMea.ini")
SayString (sNume + ", acum " + "are numarul " + sNrtel)
EndScript

Script StergeContact ()
SayString ("Alege un nume pe care vrei sa-l stergi.")
Let sContact = IniReadSectionKeys ("Agenda1", "AgendaMea.ini")
Pause ()
Let iNume = DlgSelectItemInList (sContact, "alege un nume", true)
Pause ()
Let sNume = StringSegment (sContact, "|", iNume)
Pause ()
IniRemoveKey ("Agenda1", sNume, "AgendaMea.ini")
SayString ("Contact sters.")
EndScript

Sfarsit cod
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Foarte bhine, deci... sunt clare acum treburile.
Hai sa vedem cum am face sa fie afisate numerele in User-Buffer. Ori sa se poata alege ca numerele sa fie spuse in modul spelling.
Sa facem in Ini o sectiune pentru setari, din care sa isi ia nivelul de setare, iar in functie de aceasta prin If-uri sa anunte numar cu numar, simplu fluent, in virtual buffer etc..

Deci, se pot face multe, practic e un limbaj de programare cuc are daca ai rabdare poti merge oricat de departe.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Pentru a mai exersa putin cateva functii built-in, pun mai jos un script care spune cate numere sunt in agenda noastra de telefon. Scritpul ar functiona pentru orice fisier INI, se numara practic cheile.

Inceput cod
Script TotalNumereInAgenda ()
Var
Int iTotalNumere,
String sTotalNumere
Let iTotalNumere = StringSegmentCount (IniReadSectionKeys ("Agenda", "Agenda.ini"), "|")
Let sTotalNumere = IntToString (iNumere)
SayString ("In agenda sunt in total " + sTotalNumere + " numere de telefon")
EndScript
Sfarsit cod
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Grifnas
Sergent major
Mesaje: 59
Membru din: 12 Mar 2008, 19:54
Localitate: Nasaud

Mesaj de Grifnas »

manu scrie:Hai sa vedem cum am face sa fie afisate numerele in User-Buffer.
Deocamdata, doar virtualizarea numarului de telefon...

Inceput cod

Include "HJConst.jsh"

Globals
string sName,
string sNumber,
string sAllNames,
string sResult,
int iName

Script AddsAgenda ()
InputBox ("Introduceti numele.", "Full name", sName)
InputBox ("Introduceti numarul de telefon.", "Phone number", sNumber)
IniWriteString ("Agenda", sName, sNumber, "Agenda.txt")
SayString ("Salvat>")
EndScript

Script ReadsAgenda ()
Let sAllNames = IniReadSectionKeys ("Agenda", "Agenda.txt")
Let iName = DlgSelectItemInList (sAllNames, "Alege numele", TRUE)
Let sName = StringSegment (sAllNames, "|", iName)
Let sNumber = IniReadString ("Agenda", sName, sNumber, "Agenda.txt")
If UserBufferIsActive () then
UserBufferDeactivate ()
EndIf
SayFormattedMessage (ot_USER_BUFFER, sNumber)
EndScript
Sfarsit cod
Grigore Frisan
Avatar utilizator
Manu
General de divizie
Mesaje: 4120
Membru din: 02 Feb 2007, 01:15
Localitate: Cluj-Napoca
Contact:

Mesaj de Manu »

Dupa ce avem scripturi pentru fiecare particica, astfel incat totul sa fie clar pentru o agenda simpla, va trebui sa ne hotaram la variabilele comune, la numele fisierului etc..
Eventual sa mai facem un combo de setare initiala, incare sa aleaga utilizatorul daca vrea agenda pe partitia D sau normal in locul implicit.
S-ar putea eventual crea sectiuni diferite: pentru ID-uri de Skype, ID-uri de mesenger, Adrese postale etc, iar la introducere sa intrebe in care se vrea adaugarea.
Errare humanum est, sed perseverare diabolicum...
In forum linguae Latinae venite! (via est: www.limbalatina.ro)
Stefan_Ilioaica
Capitan
Mesaje: 503
Membru din: 12 Sep 2009, 21:00
Localitate: Bucuresti

Mesaj de Stefan_Ilioaica »

ce se mai aude de pontes truker?
Stefan
Scrie răspuns