Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Informatica


Index » educatie » Informatica
» Functii ale utilizatorului


Functii ale utilizatorului


Functii ale utilizatorului

Functiile utilizatorului sunt module de program (macro in acest caz) care pot fi programate si izolate sub forma de functii in scopul reutilizarii facile: accepta intrari - argumente, parametri si returneaza iesiri - valoarea functiei. Functiile utilizatorului se executa in acelasi regim cu functiile predefinite AutoIt - prin apel de functie, care include argumentele ce vor servi ca parametrii de intrare, intr-o ordine stabilita de definitia functiei. Orice functie a utilizatorului returneaza o valoare! Daca aceasta nu e precizata de functie va fi in mod implicit 0. Structura de programare care constituie definitia unei functii este sugerata de exemplul:

Func functiaMea ($p1, $p2)



; blocul de instructiuni al functiei

Return $v

Endfunc

Apoi, in cadrul programului principal, sunt posibile apeluri ale functiei[1] cu argumente de diverse tipuri (preferabil tipurile asteptate de functie pentru a evita conversiile implicite imprevizibile):

functiaMea(5,'a') ; executarea functiei fara sa conteze valoarea returnata

$a=functiaMea(2,'pp')    ; executarea functiei si preluarea valorii returnate pentru

; utilizari viitoare

Elementele exemplului sunt:

  • functiaMea este numele functiei, ales de programator;
  • $p1, $p2 sunt intrarile functiei: doi parametri care vor primi valori de la argumentele din apelul functiei; valorile lor vor fi utilizate de blocul functiei in diverse prelucrari;
  • Return e punctul de finalizare a executiei functiei (comenzile din blocul functiei care urmeaza logic dupa Return vor fi ignorate);
  • $v este iesirea functiei: valoarea returnata; aceasta va fi un rezultat al operatiilor din blocul functiei si va putea fi utilizata la apelul functiei;
  • (5,'a') si (2,'pp') sunt doua perechi de argumente ale functiei, corespunzatoare celor doua apeluri ale functiei; argumentele vor transmite valori parametrilor de intrare:
    • $p1 va lua la primul apel valoarea 5, la al doilea valoarea 2
    • $p2 va lua la primul apel valoarea 'a', la al doilea valoarea 'pp'
  • functia trebuie sa fie pregatita sa primeasca si sa prelucreze orice valori posibile ale argumentelor, eventual sa trateze cazurile exceptionale prin testarea parametrilor la inceputul blocului functiei.

Programul principal poate sa lipseasca, caz in care fisierul AutoIt nu mai poate fi considerat un macro, ci o biblioteca de functii reutilizabile. Executarea sa nu va avea nici un efect (fara program principal nu exista nici apeluri de functii), insa fisierul va putea fi inclus in alte macrouri care au nevoie de functiile din biblioteca.

Numarul parametrilor nu este impus, poate fi chiar zero, caz in care functia se va apela fara argumente. Instructiunea Return poate lipsi, caz in care functia returneaza zero. Oricare din parametri si chiar valoarea returnata pot fi variabile masive.

Func adunare($p1,$p2,$p3)    ; definitia parametrilor functiei (intrarile)

Return $p1+$p2+$p3 ; returnarea valorii functiei (iesirea)

Endfunc

Dim $A[3]=[1,2,3]

$Suma=adunare($A[0],$A[1],$A[2])    ; apelul functiei (transmiterea intrarilor)

Acest exemplu apeleaza o functie in scopul de a calcula suma elementelor vectorului $A. Se observa ca:

numarul valorilor-argument transmise la apelul functiei coincide cu numarul parametrilor de intrare definiti;

valorile parametrilor sunt implicate in calculul sumei (blocul functiei), iar rezultatul este returnat ca valoare a functiei;

in urma apelului, valoarea functiei e atribuita variabilei $Suma.

Acelasi rezultat se obtine daca in loc sa se transmita 3 parametri, se defineste si transmite un singur parametru de tip variabila masiva:

Func adunare($V

$S=0

For $i=0 to Ubound($V)-1

$S+=$V[$i]

Next

Return $S

Endfunc

Dim $A[3]=[1,2,3]

$Suma=adunare($A)

Rezultatul obtinut este acelasi cu al exemplului anterior, difera doar metoda:

  • s-a definit si transmis un singur argument (parametru), de tip vector;
  • blocul functiei contine un ciclu de parcurgere a vectorului in cadrul caruia se calculeaza sum aprin acumulare.

Functiile utilizatorului pot folosi doua tipuri de parametri (si argumente), similar cu functiile predefinite:

  • parametrii obligatorii sunt definiti ca in exemplele anterioare, valorile lor trebuie transmise obligatoriu ca argumente in apelul functiei, altfel functia esueaza si returneaza 0;
  • parametrii optionali sunt definiti la sfarsitul listei parametrilor prin atribuiri de valori implicite (folosite atunci cand apelul functiei neglijeaza argumentele optionale).

Func adunare($V, $limita=4)

$S=0

For $i=0 to $limita

$S+=$V[$i]

Next

Return $S

Endfunc

Dim $A[5]=[1,2,3,4,5]

$n=2

$SumaLimitata=adunare($A,$n)

$SumaTotala=adunare($A)

In acest exemplu, avem doua apeluri, primul cu valoarea 2 pentru argumentul optional, al doilea neglijeaza argumentul optional (care va primi implicit valoarea 4). Argumentul optional va fi transmis parametrului $limita care e folosit in functie pentru a indica valoarea finala, de oprire a ciclului FOR. In final:

variabila $SumaLimitata va stoca valoarea 6 (suma elementelor cu indicii 0-2 din vector, conform argumentului optional);

variabila $SumaTotala va stoca valoarea 15 (suma tuturor elementelor vectorului, cu indicii 0-4, conform valorii implicite a argumentului neglijat de al doilea apel);

O alta versiune a acestui mecanism se obtine folosind cuvantul cheie Default, care este un loctiitor temporar pentru valoarea implicita a unui parametru.

Func adunare($V, $limita=Default)

If $limita=Default Then $limita=Ubound($V)-1

$S=0

For $i=0 to $limita

$S+=$V[$i]

Next

Return $S

Endfunc

Dim $A[5]=[1,2,3,4,5]

$n=2

$SumaLimitata=adunare($A,$n)

$SumaTotala=adunare($A)

Valoarea Default va fi atribuita implicit atunci cand argumentul optional lipseste din apelul functiei. Blocul functiei trateaza lipsa argumentului (deci prezenta valorii Default) printr-o structura IF care atribuie o valoare de lucru implicita parametrului. Valoarea de lucru atribuita in acest exemplu este indicele ultimului element din vector, utilizat apoi in parcurgerea prin FOR. Avantajul acestei metode este ca structura IF permite sa se atribuie parametrului optional si expresii in care intervin parametrii obligatorii. Spre exemplu, in lipsa lui Default, nu ar fi fost posibila o definitie ca cea de mai jos:

Func adunare($V, $limita=Ubound($V)-1

deoarece valoarea parametrului $V nu este disponibila decat incepand cu prima linie a blocului functiei!

Datorita parametrilor optionali, e posibil ca numarul de argumente cu care s-a apelat functia sa fie mai mic decat numarul parametrilor din definitia functiei. In blocul functiei se poate folosi macrovariabila @NUMPARAMS pentru a obtine numarul argumentelor transmise de apelul curent al functiei:

Func adunare ($p1,$p2=0,$p3=0)

$S=$p1+$p2+$p3

Return 'Suma celor ' & @NUMPARAMS & ' argumente este ' & $S

EndFunc

MsgBox(0,'',adunare(2,3))

Rezultatul afisat in caseta de dialog va fi 'Suma celor 2 argumente este 5'

Parametrii unei functii pot fi:

  • de tip read-write, implicit, caz in care valoarea lor poate fi modificata in blocul functiei;
  • de tip read-only, daca in definitia functiei parametrul e insotit de cuvantul Const, caz in care valoarea sa poate fi DOAR citita in blocul functiei (parametrului nu i se vor putea atribui valori).

Func adunare($V, $limita)

$limita=2

$S=0

For $i=0 to $limita

$S+=$V[$i]

Next

Return $S

Endfunc

Dim $A[5]=[1,2,3,4,5]

$Suma=adunare($A,4)

In acest exemplu parametrul limita este de tip read-write: desi i s-a transmis valoarea 4, in blocul functiei ii este modificata valoarea la 2, asadar se calculeaza doar suma elementelor cu indicii 0-2. Daca definitia functiei ar arata astfel:

Func adunare($V, Const $limita)

atunci ar apare o eroare la atribuirea:

$limita=2

datorita faptului ca se incearca modificarea unui parametru read-only. Daca se doreste transmiterea unei constante ca argument al unei functii, parametrul corespunzator trebuie obligatoriu sa fie declarat de tip Const.

Argumentele indicate prin variabile pot fi transmise spre o functie prin doua metode:

  • prin valoare, implicit, caz in care parametrul si argumentul sunt considerate variabile diferite cu aceeasi valoare (parametrului i se atribuie valoarea variabilei argument); parametrul va fi considerat o variabila noua, locala functiei, care contine o copie a valorii argumentului;
  • prin referinta, daca in definitia functiei apare cuvantul cheie ByRef, caz in care parametrul si argumentul sunt una si aceeasi variabila; modificarile aduse la parametru vor afecta si variabila-argument.

Exemplu:

Func f1($p)

$pini=$p ; memorarea valorii initiale a parametrului

$p*=2 ; modificarea parametrului

$rez=$p

MsgBox(0,'mesaj din functie' _

,'Valoarea parametrului la intrare in functie:' & $pini & @CRLF & _

'Valoarea parametrului la iesirea din functie:' & $p)

Return $rez ; valoarea returnata (dublul parametrului)

Endfunc

$arg=5

$argini=$arg ; memorarea valorii initiale a argumentului

$dublu=f1($arg) ; apelul functiei

Msgbox(0,'mesaj din afara functiei','Val returnata:' & $dublu & @CRLF _

&'Val argumentului la apel:'& $argini & @CRLF _

& 'Val argumentului dupa apel:' & $arg)

S-a exemplificat transmiterea argumentelor prin valoare. Explicatii:

apelul de functie transmite argumentul cu valoarea 5;

blocul functiei calculeaza dublul argumentului si il returneaza.

Datorita transferului prin valoare, $arg si $p sunt considerate variabile diferite. Modificarea parametrului $p in blocul functiei, nu afecteaza variabila argument. Acest lucru e verificabil in cele doua mesaje generate:

  • din interiorul functiei se genereaza valoarea parametrului la intrare si la finalizarea functiei (se observa modificarea datorita atribuirii $p*=2);

  • dupa apelul functiei se genereaza rezultatul returnat, valoarea initiala a argumentului si valoarea finala a argumentului (se observa ca a ramas 5).

In cazul transferului prin valoare, parametrii functiei vor fi creati ca variabile Local, deci vizibile doar in interiorul functiei, indiferent daca exista variabile globale cu acelasi nume. Asadar, e posibil ca argumentul si parametrul sa aiba acelasi nume - ele vor fi considerate variabile diferite, cu vizibilitate diferita! Asadar, exemplul anterior ofera acelasi rezultate daca numele parametrului este identic cu al argumentului:

Func f1($arg)

$pini=$arg ; memorarea valorii initiale a parametrului

$arg*=2 ; modificarea parametrului

$rez=$arg

MsgBox(0,'mesaj din functie' _

,'Valoarea parametrului la intrare in functie:' & $pini & @CRLF & _

'Valoarea parametrului la iesirea din functie:' & $arg)

Return $rez ; valoarea returnata (dublul parametrului)

Endfunc

$arg

$argini=$arg    ; memorarea valorii initiale a argumentului

$dublu=f1($arg) ; apelul functiei

Msgbox(0,'mesaj din afara functiei','Val returnata:' & $dublu & @CRLF _

&'Val argumentului la apel:'& $argini & @CRLF _

& 'Val argumentului dupa apel:' & $arg)

Din cele doua casete de dialog obtinute, se remarca faptul ca valoarea argumentului dupa apel ramane cea initiala ($arg=5), desi o variabila cu acelasi nume, a fost modificata in interiorul functiei ($arg*=2). Transferul prin valoare face ca cele doua variabile $arg sa fie considerate variabile diferite. Variabila locala $arg (si modificarea suferita de aceasta) nu sunt vizibile in afara functiei! Acesta este si un exemplu privind faptul ca variabilele locale permit evitarea conflictelor de nume prin diferenta de vizibilitate, CHIAR si cand argumentul si parametrul au acelasi nume.

La transferul prin referinta, in schimb, argumentul si parametrul sunt una si aceeasi variabila, CHIAR daca au nume diferite! Orice modificare suferita in cadrul functiei de parametru, se rasfrange asupra argumentului. Singura schimbare introdusa in exemplul anterior va fi definirea parametrului prin ByRef:

Func f1(ByRef $p)

$pini=$p ; memorarea valorii initiale a parametrului

$p*=2 ; modificarea parametrului

$rez=$p

MsgBox(0,'mesaj din functie' _

,'Valoarea parametrului la intrare in functie:' & $pini & @CRLF & _

'Valoarea parametrului la iesirea din functie:' & $p)

Return $rez ; valoarea returnata (dublul parametrului)

Endfunc

$arg=5

$argini=$arg ; memorarea valorii initiale a argumentului

$dublu=f1($arg) ; apelul functiei

Msgbox(0,'mesaj din afara functiei','Val returnata:' & $dublu & @CRLF _

&'Val argumentului la apel:'& $argini & @CRLF _

& 'Val argumentului dupa apel:' & $arg)

Interpretorul considera ca $p si $arg sunt aceeasi variabila. Modificarea suferita de $p are loc si asupra lui $arg, ceea ce se poate verifica prin cele doua mesaje:

  • primul mesaj e identic cu cazul anterior, indica faptul ca parametrul si-a modificat valoarea:

  • al doilea mesaj e schimbat - de data aceasta indica faptul ca modificarea parametrului $p s-a aplicat si argumentului $arg (mai exact, cele doua nume de variabile reprezinta aceeasi locatie de memorie, cu aceeasi informatie).

Pentru claritatea codului sursa, se practica adesea ca:

  • la transferul prin valoare, parametrul sa primeasca alt nume decat argumentul (pentru a sugera ca sunt variabile diferite);
  • la transferul prin referinta, parametrul sa primeasca acelasi nume cu argumentul (pentru a sugera ca e vorba de aceeasi variabila).

Este important de retinut ca definitiile functiilor utilizatorului NU pot fi imbricate intre ele! Asadar, nu e posibila o constructie precum:

Func f1()

Func f2(.)

; blocul functiei f2

Endfunc

; blocul functiei f1

Endfunc

In schimb, functiile utilizatorului pot contine apeluri ale altor functii ale utilizatorului, ca in exemplul:

Func f1()

;blocul functiei f1

f2()

Endfunc

Func f2()

;blocul functiei f2

Endfunc

; aici incepe programul principal

$a=f1() ; apel al functiei f1, care la randul ei va apela functia f2

Lucrul cu functii ale utilizatorului acorda o importanta crescuta modului de declarare a variabilelor si vizibilitatii acestora. O variabila declarata de o functie ca fiind Local sau Dim, va fi vizibila doar in acea functie (daca e Local, va evita conflictele de nume, permitand folosirea unui nume de variabila care exista deja in afara functiei). In exemplificarea vizibilitatii vom apela la functia IsDeclared, care testeaza existenta (deci vizibilitatea) unei variabile in punctul dorit al programului. Pornim de la un exemplu similar celui precedent:

Func f1($p)

$pini=$p ; memorarea valorii initiale a parametrului

$p*=2 ; modificarea parametrului

$rez=$p

MsgBox(0,'Vizibilitate in interiorul functiei a variabilei pini:',IsDeclared('pini'))

Return $rez ; valoarea returnata (dublul parametrului)

Endfunc

$arg=5

$argini=$arg ; memorarea valorii initiale a argumentului

$dublu=f1($arg) ; apelul functiei

MsgBox(0,'Vizibilitate in afara functiei a variabilei pini:',IsDeclared('pini'))

Variabilele locale ale functiei f1 sunt:

  • $p (s-a aratat deja ca parametrii transferati prin valoare sunt considerati variabile locale ale functiei);
  • $pini (valoarea initiala a parametrului), deoarece este initializata direct in functie si nu are instructiune de declarare (ceea ce inseamna ca e declarata cu Dim, deci locala[3]);
  • $rez din aceleasi motive ca $pini - declarata prin Dim (implicit) direct in functie

Caracterul local al celor trei variabile poate fi confirmat prin faptul ca sunt vizibile in functie (deci pot apare in orice expresii din blocul functiei) dar sunt invizibile in afara sa (provoaca eroare de vizibilitate daca apare in expresii din afara functiei). Pentru aceasta sugeram modul de utilizare a functiei IsDeclared:

  • Are ca argument de tip string numele unei variabile (fara $);
  • Returneaza -1 daca variabila e vizibila local;
  • Returneaza 1 daca variabila e vizibila (globala sau declarata in afara functiei);
  • Returneaza 0 daca variabila e invizibila.

Exemplul anterior testeaza vizibilitatea variabilei locale $pini, pentru $p si $rez functioneaza identic. Vizibilitatea e testata in doua puncte

  • In interiorul functiei (primul mesaj), testul va indica faptul ca IsDeclared returneaza -1, deci $pini e vizibila local;
  • In afara functiei (al doilea mesaj), testul va indica faptul ca IsDeclared returneaza 0, deci $pini e invizibila in afara functiei; aceasta inseamna ca urmatorul exemplu va da eroare de vizibilitate:

Func f1($p)

$pini=$p ; variabila creata local

$p*=2 ; modificarea parametrului

$rez=$p

Return $rez ; valoarea returnata (dublul parametrului)

Endfunc

$arg=5

$dublu=f1($arg) ; apelul functiei

MsgBox(0,'Valoarea actuala a variabilei este:', $pini')) ; eroare!

$a=$pini+3    ; eroare!

Eroarea de vizibilitate va fi detectata la ultimele doua linii, cele doua tentative de utilizare a variabilei in afara domeniului de vizibilitate. Problema dispare daca $pini va fi declarata Global:

Func f1($p)

Global $pini=$p ; variabila globala

$p*=2

$rez=$p

MsgBox(0,'Vizibilitate in interiorul functiei a variabilei pini:', _

IsDeclared('pini')

Return $rez

Endfunc

$arg=5

$argini=$arg ; memorarea valorii initiale a argumentului

$dublu=f1($arg) ; apelul functiei

MsgBox(0,'Vizibilitate in afara functiei a variabilei pini:',IsDeclared('pini'))

De data aceasta, cele doua teste vor afisa:

  • Valoarea 1 in mesajul din interiorul functiei, deci vizibilitate totala;
  • Valoarea 1 in mesajul din afara functiei, deci vizibilitate totala.

Ce se intampla insa cu variabilele create in programul principal, de exemplu $argini? Vizibilitatea acesteia in interiorul functiei va fi testata prin exemplul:

Func f1($p)

$pini=$p

$p*=2

$rez=$p

MsgBox(0,'Vizibilitate in interiorul functiei a variabilei $argini:', _ IsDeclared('argini'))

MsgBox(0,'Vizibilitate in interiorul functiei a variabilei $b:', _

IsDeclared(' b')

Return $rez

Endfunc

$arg=5

$argini=$arg ; variabila locala programului principal

$dublu=f1($arg) ; apelul functiei

$b=100 ; variabila local programului principal, creata dupa apel!

MsgBox(0,'Vizibilitate in afara functiei a variabilei $argini:',IsDeclared('argini'))

MsgBox(0,'Vizibilitate in afara functiei a variabilei $b:',IsDeclared('b'))

Testele pentru argini dau rezultatele:

  • In interiorul functiei are vizibilitate globala (1);
  • In afara functiei are vizibilitate globala (1).

Testele pentru $b dau rezultatele:

  • 0: in interiorul functiei e invizibila, deoarece variabila nu exista la momentul apelului functiei (a fost creata in instructiunea urmatoare apelului);
  • 1: in afara functiei e vizibila, de la momentul initializarii pana la final.

Concluzii:

  • Nici o variabila nu este vizibila in portiunea de algoritm care precede crearea sa (declararea sau initializarea);
  • Orice variabila creata in programul principal (chiar si locala), e vizibila in toate functiile apelate dupa crearea sa (variabilele din programul principal sunt tratate ca globale de toate functiile);
  • Variabilele create de functii pot fi:
    • Globale, caz in care sunt vizibile in toate functiile apelate dupa crearea lor si in portiunea de program principal executata dupa crearea lor;
    • Locale, caz in care nu sunt vizibile decat in functia care le-a creat, dupa instructiunea la care a avut loc crearea. La aceasta categorie se incadreaza si parametrii de intrare ai functiilor, precum si:
      • Variabile locale declarate cu Dim (sau create prin initializare, fara Dim) - in cazul in care exista deja o variabila globala cu acelasi nume, NU se creeaza o variabila noua, ci functia va utiliza variabila globala! In aceasta categorie se inscriu si parametrii transferati prin referinta.
      • Variabile locale declarate cu Local - in cazul in care exista deja o variabila globala cu acelasi nume, va fi ignorata, nu va fi afectata si se va crea o variabila noua, cu acelasi nume dar vizibilitate diferita! In aceasta categorie se inscriu si parametrii transferati prin valoare.

O categorie speciala de functii ale utilizatorului sunt functiile predefinite ale utilizatorului. E vorba de functii construite dupa principiile prezentate in acest capitol, dar care sunt publicate in cadrul pachetului AutoIt, in regim open-source, de catre diversi utilizatori. Sunt functii ale utilizatorului deoarece nu sunt recunoscute implicit de interpretor (necesita copierea definitiilor de functii din directorul Include, in care sunt stocate) si sunt functii predefinite, deoarece sunt publicate in pachetul AutoIt, gata de a fi reutilizate, inclusiv cu comentarii si documentatie Help anexate.

X.3.9. Directive

Directivele sunt instructiuni care nu au un impact direct asupra algoritmului AutoIt, ci configureaza modul sau de executie. Numarul directivelor AutoIt este redus, cel mai relevant aspect fiind posibilitatea de includere a fisierelor externe in codul sursa al unui macro.

Directivele #cs si #ce delimiteaza un bloc de comentarii AutoIt, asadar o portiune a codului sursa care va fi ignorata de intepretor. Structurile #cs-#ce pot fi imbricate. Exemplu:

#cs

Comentariu sau cod sursa ignorat

#ce

Directiva #NoTrayIcon indica faptul ca pictograma AutoIt nu va apare in zona Tray a barei de sarcini Windows (asa cum se intampla in mod implicit la executarea unui macro). Dezactivarea directivei poate fi realizata prin functia Opt('TrayIconHide',0). Intre aparitia directivei si apelul functiei, pictograma AutoIt de pe bara Tray va fi invizibila:

#NoTrayIcon

Sleep(5000)

Opt('TrayIconHide',0)

Sleep(5000)

Acest exemplu lanseaza un macro fara pictograma Tray, apoi dupa 5 secunde apare pictograma, apoi dupa alte 5 secunde dispare datorita opririi executiei.

Directiva #RequireAdmin specifica faptul ca rularea macroului va fi posibila doar sub contul de administrator.

Directiva #include permite concatenarea unui fisier extern cu macroul curent, la pozitia la care apare directiva. Motivele includerii unui fisier extern pot fi multiple:

  • Includerea unor portiuni de cod sursa reutilizabil memorate in alt fisier;
  • Includere unor fisiere de comentarii;
  • Includerea unor definitii de functii memorate in alte fisiere, spre exemplu importarea bibliotecilor functiilor predefinite ale utilizatorului (atasate pachetului AutoIt in directorul Include). Fara aceasta incluziune, functiile respective nu pot fi executate de interpretor, nefiind recunoscute implicit de acesta.

Formele directivei sunt:

#include 'Cale '

#include <fisier.extensie>

Prima versiune permite sa se indice calea completa a fisierului care se va include. A doua versiune este folosita pentru includerea bibliotecilor de functii. Functioneaza in conditiile in care:

bibliotecile sunt stocate in directorul Include (al directorului de instalare AutoIt);

bibliotecile sunt stocate in acelasi director cu macroul care le solicita;

daca sunt stocate altundeva, acel director trebuie sa fie precizat in registrul Windows HKEY_CURRENT_USERSoftwareAutoIt v3AutoIt (atributul Include);

In cazul acestei forme, exista riscul ca acelasi fisier sa fie inclus de mai multe ori (daca apar copii ale sale atat in Include cat si in celelalte doua locatii), ceea ce va provoca o eroare de functie dublu definita; evitarea acestui risc se realizeaza folosind directiva #include-once[4].

Directiva #include-once nu apare in macroul care solicita includerea, ci pe prima linie a fisierului care trebuie inclus! Aparitia sa previne dubla includere a fisierului care contine directiva. Exemplu:

Codul fisierului BibliotecaMea.au3 (salvat in directorul AutoIT3/Include):

#include-once ; previne dubla includere a fisierului

Func functiaMea()

MsgBox(0,'','Functie apelata din fisierul inclus!')

Endfunc

Codul fisierului MacroPrincipal.au3:

#include <BibliotecaMea.au3>

#include <BibliotecaMea.au3>    ; eroare potentiala de functie dublu definita!

MsgBox(0,'','Urmeaza apelul functiei incluse!')

functiaMea()

Executarea acestui exemplu ar provoca eroare de functie dublu definita daca BibliotecaMea.au3 nu ar contine directiva #include-once. Prezenta directivei face ca a doua directiva #include, in loc sa provoace eroarea, sa fie ignorata.

O metoda alternativa de includere este folosirea functiilor de acces la disc, in locul directivei #include (ex: functia FileInstall). Spre deosebire de #include, care realizeaza includerea la nivel de interpretor, FileInstall asigura includerea la momentul compilarii.

X.3.10. Functii predefinite de evaluare

Functiile de evaluare au rolul de a converti un sir de caractere in variabila, expresie sau apel de functie si de a returna valorile acestora. Acestea au o utilitate deosebita in AutoIt, deoarece sunt numeroase cazurile in care macrourile citesc de la diverse aplicatii Windows, text care ar putea reprezenta in anumite situatii expresii calculabile in AutoIt.

Functia Eval trateaza un sir de caractere ca un nume de variabila si returneaza valoarea acelei variabile (daca ea exista). Practic, se poate considera ca functia converteste un string la un nume de variabila si ii citeste valoarea.

$a=2 ; atribuie 2

$b=Eval('a') ; atribuie 2

$b2='a'

$c='a' ; atribuie 'a'

$d=Eval($c) ; atribuie 2

$ax=5 ; atribuie 5

$f=Eval($c&'x') ; atribuie 5

Observatii:

  • Variabila $b primeste o valoare obtinuta prin convertirea caracterului 'a' la variabila $a, variabila care avea din instructiunea anterioara valoarea 2;
  • Acelasi lucru se intampla in cazul variabilei $d - valoarea sa se obtine prin convertirea valorii variabilei $c (caracterul 'a') in variabila $a.
  • In ultimul caz, sirul e obtinut prin concatenarea variabilei $c cu caracterul 'x', obtinandu-se 'ax' care convertit la variabila ofera valoarea 5.

Functia nu poate detecta nume de variabile masive. Succesul functiei depinde de existenta variabilei obtinute prin conversie. Din acest motiv se recomanda ca inaintea utilizarii Eval sa se faca un test de existenta a variabilei, cu functia IsDeclared.

Esecul Eval are ca efect returnarea sirului '' si comutarea macrovariabilei @error la o valoare nenula. Urmatorul exemplu simuleaza cu ajutorul functiei Eval, lucrul cu vectori:

$p1=2

$p2=3

$p3=4

$S=0

For $i=1 to 3

$S+=Eval('p'& $i)

Next

In scopul calcularii sumei, acest exemplu parcurge un sir de 3 variabile printr-un ciclu FOR, similar cu parcurgerea unui vector. Se poate observa folosirea functiei Eval in construirea numelui variabilelor dupa regula 'p' concatenat cu un indice numeric.

Functia Assign poate fi considerata complementara functiei Eval. Ca si Eval, Assign converteste un sir de caractere la un nume de variabila. Daca rolul lui Eval este sa citeasca valoarea variabilei obtinute, rolul lui Assign este sa scrie (sa atribuie) o valore in variabila obtinuta. Ca si Eval, Assign nu poate lucra cu variabile masive.

Dim $a, $b='a'

Assign ($b, 'xx')

In acest exemplu, functia atribuie valoarea 'xx' variabilei $a, desi aparent atribuirea are loc asupra variabilei $b! In realitate, variabila $b e inlocuita cu valoarea sa string 'a' care apoi este convertita la variabila $a, conform mecanismului prezentat la functia Eval Valoarea variabilei $b ramane neafectata, adica 'a'!

Dim $v1

Assign ('v1',True)

In acest exemplu, sirul 'v1' e convertit la variabila $v1, careia i se atribuie valoarea True. Assign returneaza 1 in caz de succes, 0 in cat de esec. Situatiile considerate esec depind de un al treilea argument, optional, numeric:

0 (implicit) - Daca variabila nu exista, este creata (succes);

1 - Variabila e creata cu vizibilitate Local (succes);

2 - Variabila e creata cu vizibilitate Global (succes);

4 - Daca variabila nu exista, functia esueaza si se returneaza 0.

Asadar, e posibil ca variabila obtinuta sa nu fi fost declarata sau initializata anterior, caz in care Assign o creeaza, cu exceptia cazului in care argumentul optional e 4. Exemplu:

$a=Assign ('p',3,2)

If $a Then MsgBox(0,'Variabila p a fost creata cu succes si are valoarea',$p)

Acest exemplu creeaza variabila $p, o declara Global si ii atribuie valoarea 3. Atragem atentia ca la executarea acestui exemplu, interpretorul AutoIt va provoca un avertisment (variabila $p nedeclarata!). Avertismentul se poate ignora (butonul Continue Anyway) si aparitia casetei MsgBox va confirma faptul ca intr-adevar variabila a fost creata de catre Assign.

$a=Assign ('p',3,4)

If $a Then MsgBox(0,'Variabila p a fost creata cu succes si are valoarea',$p)

In schimb in acest exemplu, datorita argumentului 4, lipsa variabilei nu va mai fi compensata prin crearea sa si caseta MsgBox nu va mai apare (datorita valorii 0 returnate de functie). Existenta anterioara a variabilei poate fi verificata de functia IsDeclared.

Functia Execute este similara cu Eval. Comparatie:

  • Eval converteste un sir de caractere intr-un nume de variabila si ii returneaza valoarea (daca exista);
  • Execute converteste un sir de caractere intr-o expresie si ii returneaza valoarea (daca expresia poate fi calculata).

Functia returneaza valoarea expresiei in caz de succes, iar in caz de esec returneaza '' si comuta @error la o valoare nenula. Expresia convertita poate contine orice valori, variabile, operatori, macrovariabile, functii ale utilizatorului si cea mai mare parte a functiilor AutoIt predefinite (nu poate contine o serie de functii ca MsgBox, InputBox, GUI). Exemple:

$a='2+3' ; se atribuie valoarea string '2+3'

$b=Execute('2+3') ; se atribuie valoarea numerica 5

$c=Execute($a) ; se atribuie valoarea numerica 5

$d='Int'

$e='(2.7)'

$f=Execute($d & $e) ; se atribuie valoarea numerica 2

In ultima atribuire, argumentul functiei e obtinut prin concatenarea celor doua variabile precedente, rezultatul fiind sirul 'Int(2.7)'. Execute converteste acest sir in expresia Int(2.7), al carei rezultat este partea intreaga 2. Un exemplu similar este urmatorul:

$a='Exe'

$b='cute'

$c='(''$a & 1'')' ; s-au dublat ghilimelele interioare

$d=Execute($a & $b & $c) ; se atribuie 'Exe1'

Argumentul functiei Execute este aici obtinut prin concatenarea celor trei variabile string. Rezultatul concatenarii este sirul 'Execute('$a & 1')' (am folosit apostroafe pentru delimitarea sirului, pentru evitarea confuziei cu ghilimelele interioare - in atribuirea lui $c, in acelasi scop s-a apelat la dublarea ghilimelelor). Mai departe, acest sir de caractere a fost convertit la expresia Execute ('$a & 1'), care provoaca un al doilea apel al functiei. Al doilea apel are ca efect convertirea sirului ' $a & 1' la expresia $a & 1, care e calculata cu rezultatul 'Exe1'. Acesta e si rezultatul atribuit. Mai jos rezumam succesiunea conversiilor realizate:

$d=Execute($a & $b & $c) =Execute('Exe' & 'cute' & '('$a & 1')')

=Execute('Execute('$a & 1')')

=Execute('$a & 1')

=$a & 1

='Exe' & '1'

='Exe1'

Functia Call e similara cu Eval si Execute - converteste un sir de caractere intr-un nume de functie, in plus, ii transmite lista parametrilor necesari functiei. In caz de succes se returneaza valoarea returnata de functia extrasa din string. In caz de esec, se comuta @error la 1.

O restrictie importanta este ca functia extrasa din sirul de caractere NU POATE FI o functie predefinita AutoIt, ci doar o functie dintre cele definite de utilizator. Daca se doreste apelul in acest mod al unei functii predefinite, exista variantele:

  • Sa se foloseasca Execute pe o expresie care contine functia predefinita dorita;
  • Sa se foloseasca Call pe o functie a utilizatorului care contine apelul functiei predefinite dorite.

Exemplu:

Func functiaMea ($p1,$p2,$p3)

Return $p1+$p2+$p3

Endfunc

$a1='functia'

$a2='Mea'

$b=Call ($a1 & $a2, 1,2,3)

Dim $V[4]=['CallArgArray',1,2,3]

$c=Call($a1 & $a2, $V)

In prima parte a exemplului s-a definit o functie a utilizatorului cu numele functiaMea, trei parametri si care returneaza suma parametrilor. Apoi, s-au realizat doua apeluri ale acestei functii, numele sau fiind extras din sirul concatenat $a1& $a2='functiaMea'. Valorile atribuite lui $b si $c sunt egale (6 - suma parametrilor) - prin cele doua apeluri Call sugeram ca lista parametrilor transmisi functiei poate sa fie indicata pe doua cai:

Prin enumerarea valorilor;

Printr-un vector care contine valorile de transmis. Vectorul are o forma speciala - lungimea sa trebuie sa fie mai mare cu 1 decat numarul parametrilor si primul element sa aiba valoarea 'CallArgArray'. Aceasta forma e necesara pentru a evita confuziile cu situatiile in care parametrul transmis este chiar o variabila masiv! Exemplu:

Func functiaMea ($p1,$p2,$p3)

Return $p1+$p2+$p3

Endfunc

$a1='functia'

$a2='Mea'

Dim $V[3]=[ 1,2,3]

$c=Call($a1 & $a2, $V)

Daca vectorul nu contine elementul special 'CallArgArray', variabila $V va fi transmisa parametrului $p1, iar ultimii doi parametrii vor ramane fara valoare (caz in care apelul esueaza datorita lipsei parametrilor si returneaza 0).

Call nu poate transmite functiei obtinute parametri de tip ByRef.

Este evident ca nu sunt necesare functii inverse pentru Eval, Call si Execute. Conversia unui nume de variabila sau a unei expresii in string se realizeaza simplu, prin plasarea ghilimelelor.

Functia AdlibEnable este asemanatoare cu Call - converteste un sir de caractere intr-un apel de functie, pe care apoi o executa intermitent la fiecare 250 milisecunde. Durata intervalului poate fi stabilita printr-un argument optional numeric:

$i=0

Func functiaMea (

$i+=1

ToolTip('Functia se executa a' & $i & '-a oara')

Endfunc

AdlibEnable ('functiaMea', 1000)

Sleep (7000)

Functia definita genereaza o eticheta informativa la pozitia cursorului, prin care se indica a cata oara s-a apelat functia. Executarea intermitenta a functiei se finalizeaza odata cu terminarea macroului. Din acest motiv, s-a adaugat functia Sleep pentru amanarea terminarii cu 7 secunde, interval in care functiaMea are timp sa se execute de 6 ori (6 afisari ale etichetei informative).

Reamintim si faptul ca variabila $i, initializata in afara functiei, are vizibilitate suficienta incat sa fie folosita si in functiaMea, deci nu e necesar sa fie declarata Global (orice variabila locala e vizibila in functiile subordonate modulului in care s-a facut declaratia).

Spre deosebire de Call, AdlibEnable nu returneaza valoarea functiei apelate si nu transmite parametri, din ratiuni de performanta in ce priveste executarea intermitenta.

Functia AdlibDisable, fara argumente si fara valoare returnata, opreste executarea intermitenta a ultimului apel AdlibEnable, inainte de terminarea macroului:

$i=0

Func functiaMea (

$i+=1

ToolTip('Functia se executa a' & $i & '-a oara')

Endfunc

AdlibEnable ('functiaMea', 1000)

Sleep (7000)

AdlibDisable()

MsgBox(0,'','Executia intermitenta a fost oprita)

Sugeram faptul ca functia AdlibEnable nu e atat importanta pentru conversia pe care o face (de la string la apel de functie), ci pentru caracterul intermitent al apelului de functie. Functia capata importanta deosebita in testarea software, deoarece permite verificarea intermitenta a unor conditii de mediu imprevizibile, cum ar fi starea Not Responding al unei ferestre.

X.4.1.7. Functia Opt

Aceasta functie are rolul de a configura comportamentul interpretorului AutoIt. Functia permite activarea si dezactivarea unui numar important de optiuni de executie a macrourilor. Forma generala a functiei este:

Opt('sir caractere', $comutator)

unde:

  • 'sir caractere' este o valoare string predefinita, ce identifica optiunea la care se refera functia, conform tabelului de optiuni de mai jos;
  • comutatorul are o valoare numerica; pentru majoritatea optiunilor va fi 1sau 0, care corespund activarii, respectiv dezactivarii optiunii indicate de primul argument; pentru unele optiunii exista si alte valori posibile pentru comutator;

Optiune

Comutator

'CaretCoordMode'

Stabileste modul de masurare a coordonatelor pentru functiile ce lucreaza cu pozitia punctului de insertie (forma a cursorului ce apare in zonele ce permit editarea textului):
0 = coordonate relative la fereastra activa

1 = coordonate absolute (implicit)
2 = coordonate relative la suprafata interna a ferestrei active

'ColorMode'

Stabileste modul de codificare a culorilor:
0 = RGB hexazecimal (0xRRGGBB) (implicit)
1 = RGB ordonat LE (0xBBGGRR)

Amintim ca R, G, B corespund culorilor rosu, verde, albastru, din care se alcatuiesc toate culorile afisate pe monitor.

'ExpandEnvStrings'

Stabileste modul de tratare a sirurilor de caractere:
1 = constructiile delimitate cu % vor fi considerate variabile de mediu si vor fi inlocuite cu valoarea lor in sirul de caractere;

0 = sirurile de caractere sunt considerate literale, tratate ca atare, ignorand constructiile speciale (implicit)

'ExpandVarStrings'

Similara cu optiunea anterioara, dar constructiile speciale sunt cele delimitate cu @ (substituite cu macrovariabile) si $ (substituite cu variabile):
1 = activeaza substituirile
0 = sirurile sunt tratate literal (implicit)

'FtpBinaryMode'

Stabileste modul de transfer FTP

1 = binar (implicit)
0 = ASCII

'GUICloseOnESC'

1=la tastarea ESC pe o interfata GUI se genereaza mesajul $GUI_EVENT_CLOSE (implicit), adica se inchide fereastra activa;

0=mesajul nu e generat (ESC nu inchide fereastra GUI).

'GUICoordMode'

Stabileste modul de pozitionare a unui obiect GUI.
1 = coordonate relative la suprafata ferestrei GUI
0 = coordonate relative la coltul stanga sus al obiectului GUI anterior.
2 = coordonate relative la coltul dreapta jos al obiectului GUI anterior (pozitonare tabelara)

'GUIDataSeparatorChar'

Stabileste caracterul de delimitare a elementelor in folosirea GUICtrlSetData. Implicit este '|'.

'GUIOnEventMode'

1=Activeaza programarea GUI prin metoda OnEvent

0=Activeaza programarea GUI prin metoda MessageLoop (implicit)

'GUIResizeMode'

Stabileste modul de redimensionare a obiectelor GUI
0 (implicit)
<1024 = diferite metode, conform functiei GUICtrlSetResizing

'GUIEventOptions'

Stabileste comportamentul ferestrelor la evenimente.
0 (implicit) = comportament implicit la minimizare, maximizare, restaurare si dimensionare.
1 = comportamentul implicit al ferestrelor e suprimat, se genereaza doar notificarea evenimentului

'MouseClickDelay'

Stabileste numarul de milisecunde care trebuie sa treaca intre doua clicuri consecutive (implicit 10)

'MouseClickDownDelay'

Stabileste numarul de milisecunde necesare apasarii unui clic (implicit 10).

'MouseClickDragDelay'

Stabileste numarul de milisecunde de la inceputul si sfarsitul unei operatii Drag (implicit 250).

'MouseCoordMode'

Stabileste modul de utilizare a coordonatelor in lucrul cu cursorul:
0 = relativ la fereastra activa;

1 = absolut (implicit);
2 = relativ la suprafata interna a ferestrei active

'MustDeclareVars'

1 = Toate variabilele trebuie declarate explicit inaintea initializarii
0 = Declaratiile de variabile cu Dim sunt considerate implicite (implicit)

'OnExitFunc'

Sir de caractere care reprezinta numele functiei ce gestioneaza terminarea executiei macroului (implicit e 'OnAutoItExit').

'PixelCoordMode'

Stabileste modul de folosire a coordonatelor in functiile care lucreaza cu pixeli:
0 = coordonate relative la fereastra activa

1 = coordonate absolute (implicit)
2 = coordonate relative la suprafata interna a ferestrei active

'RunErrorsFatal'

1 = Macroul se va finaliza cu o eroare fatala daca functiile Run sau Run Wait esueaza datorita lipsei fisierului solicitat (implicit)
0 = Macroul va comuta macrovariabila @error la 1 daca functiile Run sau Run Wait esueaza.

'SendAttachMode'

0 = permite simularea tastarii simultane cu DOWN si UP in codurile de taste ale functiei Send (implicit)
1 = nu permite simularea tastarii simultane cu DOWN si UP in codurile de taste ale functiei Send

Functia ControlSend nu e afectata

'SendCapslockMode'

1 = AutoIt detecteaza starea tastei CapsLock si o restaureaza dupa simularea tastarii cu Send (implicit)

0 = AutoIt nu detecteaza si nu restaureaza starea tastei CapsLock la executarea functiei Send

'SendKeyDelay'

Stabileste numarul de milisecunde care trebuie sa treaca intre doua simulari de taste apasate consecutiv. Implicit este 5.

'SendKeyDownDelay'

Stabileste numarul de milisecunde care trebuie sa treaca la simularea apasarii unei taste pentru ca aceasta sa fie receptata. Implicit valoarea este 5 (tastare normala, aproape instantanee), dar pentru aplicatii care gestioneaza intarzieri sau apasari prelungite ale tastelor (ex: jocuri) valoarea poate fi modificata.

'TCPTimeout'

Stabileste numarul de milisecunde dupa care functiile TCP se opresc daca nu are loc nici un transfer de date (implicit 100).

'TrayAutoPause'

Optiunea functioneaza doar daca exista meniu tray implicit activat
0 = macroul nu se intrerupe la clic pe pictograma tray
1 = macroul se intreurpe la clic pe pictograma tray (implicit).

'TrayIconDebug'

1 = foloseste pictograma tray pentru a afisa linia de cod curenta in timpul executiei, in scopul depanarii

0 = dezactiveaza aceasta functionalitate a pictogramei tray (implicit)

'TrayIconHide'

Ascunde sau activeaza pictograma tray

0 = activare (implicit)
1 = dezactivare

'TrayMenuMode'

Stabileste functionarea meniului pictogramei tray a macroului, prin cumularea valorilor:
0 = meniul implicit (Script Paused/Exit) este adaugat la meniul utilizatorului, dublu clic pe tray returneaza identificatorul optiunii tray implicite

1 = meniul implicit e dezactivat
2 = optiunile de meniu tray create de utilizator nu se activeaza la clic

4 = meniul tray nu returneaza elementul implicit

8 = meniul tray nu contine optiuni de tip radio (cu o singura varianta selectabila)

'TrayOnEventMode'

Comuta notificarile functiilor handler pe bara tray
0 (implicit) = dezactivare
1 = activare

'WinDetectHiddenText'

Stabileste modul in care sunt tratate ferestrele invizibile la detectarea GUI
0 = Textul ascuns nu e detectat (implicit)
1 = Textul ascuns e detectat

'WinSearchChildren'

Stabileste modul in care sunt tratate ferestrele copil la detectarea GUI
0 = Se detecteaza doar obiecte din ferestrele parinte (implicit)
1 = Se detecteaza si obiecte din ferestrele copil

'WinTextMatchMode'

Stabileste metoda de comparare intre un string cautat si textul ferestrelor in operatii de detectare GUI.
1 = Comparare completa (implicit)
2 = Comparare rapida, interpretorul are acces doar la textele cheie (de pe butoane, optiuni etc.) nu si la textul tastat in zonele de editare

'WinTitleMatchMode'

Stabileste metoda de comparare intre un string cautat si titlurile de ferestre la detectarea ferestrelor.
1 = Partial, de la stanga la dreapta, in ideea ca stringul este doar inceputul titlului (implicit)
2 = Se verifica daca stringul face parte din titlu
3 = Comparare completa
4 = Metode avansate, parametrizate (vezi capitolul privind manipularea ferestrelor)

-1 pana la -4 = Aceleasi metode, aplicate doar pe litere mici.

'WinWaitDelay'

Stabileste cat dureaza intreruperea unui macro dupa o operatie de manipulare a ferestrelor (implicit 250).



Nu conteaza daca definitiile functiilor apar inainte de apelurile acestora sau dupa. Se recomanda sa apara inainte, pentru claritatea codului sursa.

Reamintim ca parametrii cu transfer prin valoare sunt considerati variabile locale ale functiei

Reamintim ca diferenta intre Dim si Local e ca ultima evita conflictele de nume permitand declararea unei variabile care are acelasi nume cu una din afara functiei.

Evident, riscul de functie dublu definita nu apare doar la dubla includere a unui fisier, ci si in cazuri cum ar fi existenta a doua functii diferite cu acelasi nume, in fisiere incluse diferite.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate