Stănese Daniel -Ioan [629579]

UNIVERSITATEA “LUCIAN BLAGA” SIBIU
FACULTATEA DE INGINERIE
INGINERIA SISTEMELOR MULTIMEDIA

PROIECT DE DIPLOMĂ

Îndrumător: Conf.dr.ing. Sima Dorin

Absolvent: [anonimizat], 201 9 –

UNIVERSITATEA “LUCIAN BLAGA” SIBIU
FACULTATEA DE INGINERIE
INGINERIA SISTEMELOR MULTIMEDIA

PROIECT DE DIPLOMĂ
Bullseye – Aplicație de dezvoltare și
îmbunătățire a memoriei vizuale î n C#

Îndrumător: Conf.dr.ing. Sima Dorin

Absolvent: [anonimizat], 201 9 –

Cuprins
1. Prezentarea temei ………………………….. ………………………….. ………………………….. ………………………….. . 3
2. Considerente teoretice ………………………….. ………………………….. ………………………….. ……………………. 7
2.1 .Net ș i C# ………………………….. ………………………….. ………………………….. ………………………….. …… 7
2.2 WinForm ………………………….. ………………………….. ………………………….. ………………………….. …… 14
2.2.1 Form Designer Window ………………………….. ………………………….. ………………………….. ……. 16
2.2.2 ToolBox Window ………………………….. ………………………….. ………………………….. ……………. 17
2.2.3 Window Controls ………………………….. ………………………….. ………………………….. ……………. 19
2.3 Nuget ………………………….. ………………………….. ………………………….. ………………………….. ………… 22
2.4 Microsoft SQL Server ………………………….. ………………………….. ………………………….. ……………….. 24
3. Rezolvarea temei de proiect ………………………….. ………………………….. ………………………….. ……………. 26
3.1 Plan inițial ………………………….. ………………………….. ………………………….. ………………………….. ….. 26
3.2 Mediul de dezvoltare ș i limbajul de programare ………………………….. ………………………….. …………. 28
3.3 Structura bazei de date ………………………….. ………………………….. ………………………….. ……………… 33
3.4 Framework -uri ………………………….. ………………………….. ………………………….. …………………………. 40
3.4.1 Dezvoltare UI ………………………….. ………………………….. ………………………….. ………………… 40
3.4.2 Webcrawler ………………………….. ………………………….. ………………………….. …………………….. 44
3.5 Arhitectura și funcț ionalita tea aplicaț iei ………………………….. ………………………….. …………………….. 46
3.5.1 Algoritmi ………………………….. ………………………….. ………………………….. ……………………….. 46
3.5.2 Construcția interfeț ei ………………………….. ………………………….. ………………………….. ………… 55
3.6 Calitatea ș i designul ………………………….. ………………………….. ………………………….. …………………. 59
4. Concluzii ………………………….. ………………………….. ………………………….. ………………………….. ………….. 61
5. Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ……….. 64

2
Tabelul Figurilor

Fig.1 Arhitectura framework -ului .Net
Fig.2 Arhitectura Common Language Runtime
Fig.3 Exemplu Form Designer Window
Fig.4 Exemplu Properties Window
Fig.5 Algoritmul de funcționare NuGet î ntre creator, host și utilizator
Fig.6 Sondaj de popularitate a aplicațiilor destinate Desktop -ului
Fig.7 Autentificare î n SQL Server Management Studio
Fig.8 Tabelul „Account” cu datele utilizatorului
Fig.9 Tabelul „ UserTestScore ”
Fig.10 Tabelul „ Health ”
Fig.11 Elementele de control din framework -ul Bunifu
Fig.12 Elemente din framework -ul Bunifu la executarea aplicaț iei
Fig.13 Categoria de Login a aplicaț iei
Fig.14 Categoria de Meniu a aplicaț iei
Fig.15 Repartiz area în categoria M edium
Fig.16 Testul de culoare Ishihara
Fig.17 Test pentru detectarea astigmatismului

3
1. Prezentarea temei

Contactul nostru cu mediul înconjurător se realizează prin intermediul analizatorilor, sisteme
complexe formate din receptori, căi de conducere a informației și “unitatea de bază” – creierul – care
prelucrează, stochează informația și întocmește un răspuns adecvat diferitelor situații de viață. Creierul
uman , printr -o activitate polivalentă greu de imaginat a neuronilor , combină, analizează, structurează,
într-un cuvânt prelucrează complex semnalele nervoase purtătoare de informație, primite de la organele
de simț, dând omului capacitatea de a vedea, a auzi, a miros i, a gusta și a recepta ta ctil, termic, dureros
mediul fizico -chimic ambiant. Toate aceste semnale ajunse la nivel cortical devin senzații, iar apoi
procesate psihic devin percepții și reprezentări. Acestea toate combinându -se vor constitui în timp un
întreg semnificativ , o imagine plină de sens și înțeles despre lumea din jur . Factori entropici interni și
externi tind însă în permanență să perturbe percepția noastră a realității. La toate acestea se adaugă adesea
și o incorectă apreciere a capacităților noastre bio -psihologice. Ast fel, nu rareori din păcate, din cauza
neglijenței noastre nu luăm în considerare repercursiunile acțiunilor proprii, până când un organ cedează
sau începe să nu mai funcționeze corect, la parametrii optimi . Din acel moment, cu greu, prin proceduri
anevoioase și costisitoare pot apărea ameliorări, dar practic niciodată revenirea la starea de bine inițială…
Unul din cele mai importante organe senzoriale, o “minune” în ce privește perfecțiunea alcătuirii
sale, irecuperabil și, odată degradat, practic imposibil de „recondiționat” , îl constituie o chiul uman. Cu
greu poate fi găsit în componența corpului omenesc un alt organ atât de complex. Ochiul, ca și organ
senzorial, face parte din analizatorul vizual. Vederea furnizează peste 90% din informațiile primite din
mediului înconjurător. De aceea acesta are o importanță fiziologică și psihologică considerabilă, nu
numai în diferențierea luminozității, formei și culorilor obiectelor, dar și în orientarea în spațiu ,
menținerea echilibrului și a tonusului cortical – adică a atenției – cu alte cuvinte, a racodării corecte la
realitate. Alcătuirea anatomică a ochiului, cu tunicile sale (sclerotică, coroidă și iris, retina), cu mediile
sale refringente (cornee transpare ntă, umoare apoasă, cristalin și corpul vitros) și funcționalitatea acestora
ne duc cu gândul la o cameră de luat vederi practic perfectă. Nu mai puțin uimitoare sunt finețea și
acuratețea proceselor fotochimice din retină, mecanismul fotoreceptor și adapt area receptorilor vizuali.
Rezultatul este o vedere clară, cromatică, cu un câmp vizual binocular și stereoscopic. Modul în care
vedem este un proces extrem de complex. Avem aici în atenție calea retino -corticală. Principiul de
funcționare și al formării i maginii la analizatorul vizual poate fi rezumat astfel : lumina din mediul

4
înconjurător se reflectă de un obiect oarecare . Imaginea acestuia trece prin corneea transparentă a
ochiului, apoi prin lentila biconvexă a cristalinului unde, ca urmare a indicelui de refracție al acestuia,
imaginea rezultată este inversată și micșorată. Aceasta se proiectează ca atare pe pata galbenă a retinei, în
zona de maximă acuitate vizuală (foveea centralis). Aici, în celulele fotoreceptoare, stimulii luminoși
sunt transformaț i în influxuri electrice nervoase care prin nervul optic și celelalte căi senzitive optice,
transmit informația până la aria vizuală corticală din zona occipitală. Ajunsă aici, stimulii electrici se
transformă în senzații de lumină, culoare și formă coresp unzătoare imaginii inițiale a obiectului
vizualizat . Lumina constituie de fapt baza a tot ceea ce vedem. Fară lumină suntem practic orbi.
Simțul vizual este foarte important și în viața psihică a omului, în funcțiile sale de cunoaștere.
Vizualul are un ro l decisiv în “starea de magie” a primului moment când facem cunoștință cu cineva .
Expresiile faciale , gesturile și limbajul corpului reprezintă o mare parte din prima impresie creată de o
persoană anume . Foarte rapid, în fracțiuni de secundă, oamenii decid dacă găsesc pe cineva atractiv sau
nu.
În cazul afectării simțului vederii, de exemplu la o amenii orbi , o parte din informația vizuală
pierdută poate fi recuperată prin intermediul altor simțuri. Astfel, printr -o pregătire intensivă, ei pot folosi
auzul pentru a se orienta î n spațiu sau simțul mirosului pentru a recunoaște oameni și locuri.
Pentru f aptul că mai înainte vedeau , oameni i care și -au pierdut vederea datorită bolii sau
accidentului își pot aminti culorile pentru tot restul vieții. Oamenii care au fost orbi de la naștere nu au o
idee corectă despre culori, dar înțeleg încă sensul de lumină și întuneric .
Grija față de ochi și vedere a devenit de mult proverbială. Metode și proceduri de protejare a
ochilor sunt deci esențiale pentru a evita reduce rea acuității vizuale sau, in extremis, pierderea vederii cu
totul, datorită diferitelor afecțiuni ale ochilor, cum ar fi cataracta și glaucomul.
Creierul care funcționează bine și este considerat sănătos are nevoie de o vedere sănătoasă. Având
în vedere faptul că nervul optic conectează ochii și creierul, este necesară o relație sănătoasă și co –
dependentă între aceste organe și sisteme vitale . Prin menținerea ochilor sănătoși, vă mențineți sănătatea
creierului – îmbunătățindu -vă astfel calitatea vieții !
Ecrane de calculator, televizoare, display -uri de tot felul, tablete și telefoane mobile fac tot mai
mult parte din viața noastră obișnuită. Devenim tot mai “vizuali” și dependenți psihologic de văz. De
aceea importanța văzului nu poate fi scoasă în evid ență suficient de mult. Folosim calculatorul pentru a
îndeplini o serie de sarcini curente, cum ar fi cumpărăturile zilnice și plata facturilor sau comunicarea cu
alte persoane. Computerele, fără îndoială, fac viața mai ușoară și economisesc mult timp, da r există un

5
preț care trebuie plătit. Dureri de cap, dureri de spate și de gât, atrofiere musculară și ochii inflamați sunt
afecțiuni asociate frecvent cu statul prea mult în fața ecranului unui computer pentru o lungă perioadă de
timp. Cei mai mulți dintr e noi au experimentat aceste probleme de sănătate într -o oarecare măsură, dar
oamenii care sunt în mod special predispuși acestor afecțiuni sunt cei care folosesc calculatoarele în
munca lor zilnic ă. În rândul acestor meserii se includ trad ucătorii, contab ilii, lucrătorii în general la birou
și specialiști i IT. Din fericire aceștia nu sunteți condamnați aprioric la durere și boli oculare pentru că
există câteva modalități simple de evi tare a acestora .
După o sesiune îndelungată de ore de lucru , majoritatea utilizatorilor de computere se plâng de
ochii infalmați , de roșeață conjunctivală, arsură și furnicături, dureri de cap, somnolență, apatie. Cei mai
mulți dau semne, de asemenea, de simptome de vedere încețoș ată și senzația de ochi uscați.
Motivul acestui disconfort este faptul că lucrul în fața unui computer vă forțează ochii să se
concentreze în permanență și să se a dapteze la baleiajul de pe ecran, la imaginile care sunt într -o continua
schimbare și la radiația luminoasă destul de intensă . Ochii trebuie să se adapteze la ceea ce văd pentru ca
interpretarea imaginilor să fie corect făcută de creier . Sarcina este deosebit de solicitantă și grea pentru
diferiții mușchi ai ochilor, care necesită un efort mare de încordare, continuă, pentru a păstra o stare de
acuitate vizuală prelungită în fața ecranului de calculator. Aceasta este o sarcină mult mai grea decât, de
exemplu, pentru citirea unui ziar. Ochii trebuie să se miște într -un mod natural și să nu fie fixați într -un
singur punct vreme îndelungată . Mai mult, sursa de lumină a ecranul unui computer are o intensitate
semnificativă, ceea ce poate contribui la senzația de oboseală a ochilor. Mo nitoarele mai vechi pot
provoca astfel, o anumită pâlpâire a imaginilor (generată de baleiajul electronic generator al imaginii) ,
ceea ce nu este numai iritant sau solicitant pentru creier , dar poate provoca o supărătoare iritație a
ochilor. Alți factori nocivi sunt iluminatul excesiv sau slab în cameră, postura incorectă în timpul muncii
și o stație de lucru necorespunzătoare.
Pentru aceste motive de îngrijorare față de sănătatea ochilor, aplicația „Bullseye” oferă
posibilitatea utilizatorului de a putea verifica și păstra calitatea vizuală bună a utilizatorului, oferind 5
teste care acoperă afecțiunile cele mai întâlnite pentru ochiul uman. Deși oamenii au acces larg la o
cantitate mare de informație procurată de pe Web, multă informație legată de afecțiuni oculare descriu
simptome relativ comune și, în general, cu un verdi ct vag, imprecis sau foarte dur. În contrapondere la
informațiile imprecise referitoare la afecțiunile oculare prezente pe internet, această aplicație oferă
informații importante și profesionale în identificarea unei potențiale afecțiuni oculare. La finalu l testelor,
utilizatorul poate verifica scorul pentru fiecare afecțiune : miopie, cataractă , prufunzimea culorii (Color

6
Blind Test), astigmatism și hipermetropie. Testele au fost concepute pentru a exista o șansa relativ mică
de a se putea „trișa”. Bineînț eles, aplicația oferă rezultate mai precise în funcție de colaborarea
utilizatorului și de intențiile sale. Dupa verificarea scorului, utilizatorul are opiunea “Health” (vindecare)
care ofera în funcție de scorul obținut, trei calificative :
 “Good” unde ut ilizatorul a primit un scor peste un anumit prag și în timp de 10 zile va
primi mesaje și sfaturi cum să -și mențină calitatea vizuală la un standard ridicat.
 “Medium” în care utilizatorul pornește un timer din oră în oră care îi va bloca ecranul
pentru un timp determinat.
 “Bad” unde prezicem că utilizatorului îi va fi afectată acuitatea vizuală și va vedea foarte
rău, deschizându -se astfel un pop -up cu o hartă a orașului curent și cu toate clinicile de
oftalmologie din acesta.
Această aplicație este de stinată oricărui tip de utilizator, dar țintește preponderent spre domeniile de
activitate ale celor care lucrează în birou sau au de -a face zilnic cu munca afișată pe un monitor. Este de
asemenea destinată și oamenilor vârstnici pentru a putea identifica problemele oculare posibile, dar și
pentru a putea menține o calitate vizuală la un nivel cât mai înalt.

7
2. Considerente teoretice
2.1 .Net și C#
.NET vine în trei părți: .NET Framework , .NET Core și Xamarin . Aceste componente combinate
constituie platforma de dezvoltare .NET. Fiecare dintre ele conține framework -uri și biblioteci pentru a
construi diverse aplicații. [3]
Se bazează pe programarea orientată pe obiecte ( POO ). POO este un model de dezvoltare cu un
plan de a descompune softwa re-ul în bucăți mai mici, care sunt mai ușor de manipulat și combinat . POO
introduce datele în obiecte, adică în câmpurile de date, și descrie comportamentul și conținutul obiec telor
prin declarația de clase.
O structură care este alcatuită din module, ajută la definirea comportamentului obiectelor și a
interacțiunilor acestora fără a gestiona atributele interioare ale obiectului. POO simplifică programarea,
făcând codul ușor de testat și răspunzând la problemele comune din domeniul limbajelor de progra mare .
De asemenea, elimină programarea inutilă și în general, constituie mai puțin stufos și greoi pentru
dezvoltatori. .NET permite reutilizarea codului și a comp onentelor, economisind timp și nu în ultimul
rând, costul dezvoltării.
Un mediu integrat de dezvoltare (IDE) este un pro dus pentru programatori, care ușurează
dezvoltarea aplicațiilor prin furnizarea tuturor instrumentelor necesare pentru scri erea și testarea
software -ului.
Visual Studio este un IDE Microsoft folosit pentru construirea, procesare a și publicarea de
aplicații pe toate platformele, inclusiv Android și iOS. Visual Studio este integrat cu .NET și oferă
caracteristicile unui mediu specific limbajului.
Caracteristici le cele mai importante ale Visual Studio IDE:
 Este folosit ca un singur IDE pentru toate aplicațiile .NET
 IDE are integrate funcții de compilare și procesare
 Soluția programului poate fi utilizată pentru aplicații bazate pe cod scris în diferite limbaje
de programare
 Visual Studio permite personalizarea mediului în funcție de preferințele utilizatorilor
În plus, Visual Studio Marketplace oferă o gamă largă de extensii de editor de la Microsoft și alți
furnizori pentru a permite colaborarea în echipă, integrarea continuă, conexiunile terților, gestionarea

8
dezvoltării cloudului e tc. Framework -ul .Net este prima și cea mai veche implementare a platformei.
Acesta include trei modele principale de aplicații – WPF , Windows Forms , ASP.NET Forms și Biblioteca
de clasă de bază.
Framework -ul .Net este o platform ă de dezvoltare software realiz ată de Microsoft. Framework -ul
a fost creat pentru a crea aplicații, care ar funcționa pe platforma Windows. Prima versiune a framework –
ului .Net a fost lansată în anul 2002.
Versiunea a fost nu mită .Net 1.0. Framework. Aceasta a funcționat foarte mu lt timp de atunci , iar
versiunea curentă este 4.7.1.Acesta poate fi folosit ă pentru a crea atât aplicații bazate pe forms , cât și pe
Web. Serviciile Web pot fi de asemenea de zvoltate utilizând .Net . Framework -ul sprijină, de a semenea,
diverse limbaje de programare, cum ar fi Visual Basic și C #. În acest caz dezvoltatorul poate alege și
selecta limba jul adecvat pentru a dezvolta aplicația cerută.
Arhitectura de bază a framework -ului .Net contine cele 3 secțiuni:

Fig.1 Arhitectura framework -ului .Net

9
Arhitectura framework -ului .Net se bazează pe următoarele componente che ie;
1. Timpul comun al limbajului ( Common Language Runtime ) [1]
Common Language Infrastructure sau CLI este o platformă pe care sunt executate programele .Net. CLI
are următoarele caracteristici cheie:
 Manipularea excepțiilor – Excepțiile sunt erori care apar atunci când se execută aplicația.
Exemple de excepții sunt în cazul în care o aplicație încearcă să deschidă un fișier de pe mașina local ă,
dar fișierul nu este prezent sau d acă aplicația încearcă să preia unele înregistrări dintr -o bază de date, iar
conexiunea la baza de date nu este validă.
 Garbage Collection – “Colectarea gunoiului ” este procesul de eliminare a resurselor
nedorite atunci când acestea nu mai sunt necesare. Aceast a este metoda și soluț ia oferita de la cei din
.NET pentru a vă asigura că memoria utilizată de o aplicație este eliberată complet când aplicația nu
mai este utilizată. Înainte de .NET, aceasta a fost cea mai mare parte responsabilitatea programatori lor,
iar câteva erori simple în cod ar putea genera ca rezultat blocuri mari de memorie care dispar în mod
ciudat, ca urmare a faptului c ă sunt alocate unui loc greșit di n memorie. Asta înseamnă de obicei o
încetinire progresivă a computerului.
Garbage Col lection oferita de la cei din .NET, funcționează prin inspectarea memoriei
computerului dvs. Într-un mod repetat și eliminând orice nu mai este necesar. Nu există o perioadă
stabilită pentru acest lucru; se poate întâmpla de mii de ori pe secundă, o dată l a câteva secunde sau de
mai multe ori într -un mod repetat . Exempl e de colectare a gunoiului reprezintă de fapt un handle de
fișiere care nu mai este necesar. Dacă aplicația a terminat toate operațiile pe un fișier, atunci handler -ul
fișierului nu mai este necesar. Conexiunea la o posibila bază de date nu mai este n ecesară.
 Lucrul cu diverse limbaje de programare
Limba jul – primul nivel este limbajul de programare în sine, cele mai frecvente fiind VB.Net și C #.
Aici e xistă un compilator care va fi separat pentru fiecare limbaj de programare. Deci, în cazul limbajului
VB.Net, va exista un compilator separat VB.Net. În mod similar, pentru C #, veți avea un alt compilator.
Traducător ul comun de limbaj este stratul final d in .Net care ar fi folosit pentru a rula un program .net
dezvoltat în orice limbaj de programare. În final , compilatorul ulterior va trimite programul pe stratul CLI
pentru a rula aplicația .Net.

10

Fig.2 Arhitectura Common Language Runtime
2. Biblioteca de clasă (Class Library )
.NET Framework include un set de biblioteci de clasă standard. O bibliotecă de clasă este o colecție de
metode și funcții care pot fi utilizate pentru realizarea scopului principal.
De exemplu, există o bibliotecă de clasă cu metode care să se ocupe de toate operațiile la nivel de fișier.
Astfel , există o metodă care poate fi folosită pentru a citi textul dintr -un fișier. În mod similar, există o
metodă de scr iere a textului într -un fișier. [8]
3. Limbaje ( Languages )
Tipurile de aplic ații care pot fi construite în cadrul .Net sunt clasificate pe larg în următoarele categorii.
WinForms – Aceasta este utilizată pentru dezvoltarea aplicațiilor bazate pe form -uri, care functionează ca
o aplicație finală pe mașina locală a utilizatorului un de aceasta a fost creată . Notepad este un exemplu de
aplicație bazată pe client.
ASP.Net – Acesta este folosit pentru dezvoltarea de aplicații bazate pe web, care sunt făcute pentru a rula
pe orice browser, cum ar fi Internet Explorer, Firefox sau Chrome.

11
Aplicația Web va fi procesată pe un server, care va avea instalat Internet Information Services.
Internet Information Services sau IIS este o componentă Microsoft care este utilizată pentru a executa o
aplicație Asp.Net .
Rezultatul execuției este apoi trim is către utilizator , iar ieșirea este afișată în browser.
ADO.Net – Această tehnologie este utilizată pentru a dezvolta aplicații pentru a interacționa cu baze de
date cum ar fi Oracle sau Microsoft SQL Server.
Microsoft asigură întotdeauna că framework -urile .Net respectă toate sistemele de operare Windows
acceptate. [9]
Având în vedere limbajul de programare folosit, C # este un limbaj dezvoltat de Microsoft, cu
intenția de a fi un limbaj de programare simplu și ușor de utilizat. Este un limbaj de programa re modern
orientat pe obiecte, dezvoltat în anul 2000 de Anders Hejlsberg la M icrosoft ca un rival al Java (cu care
este destul de asemănător ). Acesta a fost creat deoarece compania Sun (ulterior cumpărat ă de Oracle) nu
dorea ca Microsoft să facă schimbări în Java, deci Microsoft a ales să își creeze propriul limbaj de
programare . C # a crescut rapid de când a fost creat pentru prima dată, cu un sprijin susținut din partea
Microsoft, ajutându -l să obțină un număr mare de rezultate; acum este un ul dintre cel e mai folosite
limbaje de programare din lume.
Încă de la crearea sa, mulți programa tori au început să -l folosească pentru ușurința de utilizare,
similitudinea cu C / C ++ și pentru că accelerează substanțial timpul de dezvoltare pentru multe proiecte
de programare.
Chiar și așa, mulți programatori C și C ++ au refuzat să -l folosească, plângându -se că este prea
lent, fără a permite accesul direct la hardware -ul calculatorului și fiind legat de framework -ul .NET al
Microsoft.
Principalul punct forte de vânz are a l produsului C # este ușurința de utilizare și capacitatea de a
accelera considerabil timpul de dezvoltare. De exemplu, dacă ați crea un program pentru Desktop în
Windows cu un GUI (Graphical User I nterface ) configurat manual , ar putea dura câteva ore până la o zi
întreagă cu C ++, totuși dacă ați folosit C # pentru a crea același program, ar dura aproximativ 30 de
minute. Aceasta este puterea lui C #.
C # realizează acest lucru prin pre -scrierea tuturor elementelor codului (codul care trebuie scris
înainte de a începe să c odificați programul) pentru a putea sări peste toate lucrurile care merg într -un mod
mai lent și a ajunge direct la posibilitatea codării programului real și afișarea rezultatelor .

12
Un alt motiv pentru timpul rapid de dezvoltare al lui C # se datorează faptului că majoritatea
fiecărui C # IDE vine cu un editor GUI încorporat. Acest lucru vă permite să editați cu ușurință GUI
pentru programul dvs. cu puțină programare implicată.
Este un limbaj cu scop general conceput pentru dezvoltarea d e aplicații pe platforma Microsoft și
necesită să funcționeze cadrul .NET pe sistemul de operare Windows. C # este adesea gâ ndit ca un hibrid
care ia cel mai bun aspect din limbajul C ș i C ++ pentru a crea un limbaj modernizat conform standard –
ului prezent . Deși framework -ul .NET suportă și alte limbaje de codificare, C # a devenit rapid una dintre
cele mai folosite dintre ele .
C # poate fi folosit pentru a crea aproape orice, dar este deosebit de dezvoltat pe partea de
construcții de aplicații și jocuri d esktop Windows. C # poate fi, de asemenea, utilizat pentru a dezvolta
aplicații web și a devenit din ce în ce mai uzitat și pentru dezvoltarea dispozitivelor mobil. Instrumentele
cross -platform, cum ar fi Xamarin, permit aplicațiilor scrise în C # să fie u tilizate pe aproape orice
dispozitiv mobil. [1]
Limbajul de programare C# este folosit pe scară largă pentru a crea jocuri folosind motorul de joc
Unity, care este astăzi cel mai popular motor de joc. Mai mult de o treime din jocurile de top sunt
realizate cu Unity și există aproximativ 770 de milioane de utilizatori activi de jocuri , care au fost folosit
motorul Unity.
C # este un limbaj foarte popular pentru crearea acestor aplicații, ceea ce reprezintă o alegere
excelentă pentru orice programator care s peră să intre în industria dezvoltării jocurilor. Acest limbaj de
programare are multe caracteristici care ușurează învățarea. Este un limbaj de nivel înalt, relativ ușor de
descifrat și de înțeles , cu multe dintre cele mai complexe sarcini abstracte, deci programatorul nu trebuie
să-și facă griji pentru ele. C # este un limbaj complex, iar mastering -ul poate dura mai mult timp decât la
alte limbaje mai simple, cum ar fi Python. Acest lucru înseamnă că utilizatorii au nevoie să învețe o
cantitate substanția lă de cod pentru a crea programe avansate, ceea ce ar putea fi un factor neatrăgător
pentru unii utilizatori noi. Fiind puternic, flexibil și bine construit, aceste lucruri au ridicat limbajul la
rangul în care a devenit rapid unul dintre cele mai populare limbaje de programare disponibile. Astăzi,
este al patrulea limb aj de programare cel mai folosit , cu aproximativ 31% din toți dezv oltatorii care îl
utilizează în mod regulat. Este, de asemen ea, cea de -a treia comunitate ca mărime pe StackOverflow
(care a fost construită folosind C #), cu peste 1,1 milioane de subiecte de discuție .
Această popularitate se traduce într -o piață de locuri de muncă care este într -o continuă creștere –
mai mult de 17.000 de locuri de muncă C # sunt anun țate în fiecare lună (la nivel global), cu un salariu

13
mediu de peste 72.000 de dolari. Când vine vorba de oportunități, numai pentru SUA, există mai mult de
6.000 de locuri de muncă anunțate în fiecare lună, cu un salariu anual de 92.000 dolari. De altfel și în
România cererea este foarte mare pentru cunoscătorii acestui limbaj.
În termeni simpli, C # este un limbaj de programare, în timp ce .NET este framework -ul pe care
este construit acest limbaj . Microsoft a creat .NET (Network Enabled Technology), iar dezvoltatorii
.NET vor putea beneficia de limbaje de programare cum ar fi C #. D e fapt, .NET acceptă multe limbaje
de programare și definește regulile și biblioteci le asociate pe care aceste limbaje le vor folosi.
Framework -ul .NET este instrumentul de ge stionare pentru o bibliotecă partajată de cod pe care
dezvoltatorii o pot folosi astfel încât să nu fie nevoiți să scrie cod de la zero de fiecare dată. .NET este
ambalat cu zeci de mii de bucăți de cod partajat care permite dezvoltatorilor să utilizeze fu ncții comune.
În plus, este oferit și un mediu de rulare pentru aplicații. Și alte platforme și limbaje de programare (de
exemplu cei de Java ) fac același lucru.
Avantaje ale limbajului C#:
– Odată învățat, ajută mai târziu la însușirea altor limbaje de programare mai grele (de ex. C sau C
++). Stilul de programare al lui C # este foarte asemănător cu alte limbaje C.
– Deoarece de obicei C #> VB.Net, e probabil s ă fie mai dificil de a găsi un job C #, în loc de unul
VB.Net.
– Probabil că majoritate a exemp lelor online pentru limbaje le .Net sunt în C #.
– În situația în care se a lucr ează cu alți programatori (comercial sau open source), atunci
cunoașterea C # va fi probabil un beneficiu pentru cei în cauză . Acest lucru se datorează faptului
că mulți programat ori au codat destul de mult (și încă fac cod) într -un limbaj C.
– Limba jul C # este mai puțin verbal (nu este la fel de limpede) ca limba jul BASI C (de ex. VB.Net,
VB6, etc) . Aceasta este mai mult preferința programatorului decât orice altceva.
Dezavantaje:
– nu ar fi cel mai bun limbaj de programare pentru noii veniți, cu care să înceapă programarea (C #
are o sintaxă mai compli cată). Ar fi prefera bil să înceapă cu VB.Net și mai târziu să s e inițieze în C #
.Net.
– În C # se utiliz ează semi-colonii [; ] la sfârșitul fiecărei linii de cod scrise . Intervine obișnuința
după o vreme, dar este un pas în plus pe care nu -l oferă VB.Net (și de asemenea în multe alte limbaje ).
– Este case sensitive . Pot exista în același timp „sometext”e ș i variabile „SomeText”. Acest lucru
poate provoca erori sau pierdere de foarte mult timp cu corectarea acestora .

14
– C # nu este 100% același cu VB.Net în capabilități. Cu alte cuvinte, dacă încercați să transformați
un proiect C # .Net într -un proiect VB.Net (sau invers), este posibil să întâmpinați dificultăți. Asigurați –
vă că alegeți limbajul de programare pe care doriți să -l utilizați cu adevărat.
– În C #, comanda „switch” necesită o comandă " break " de fiecare dată când verificați o valoare.
Comanda „case” în VB.Net nu necesită acest lucru. Comanda „switch” în C # nu are aceeași atribuire și
funcționalitate ca și cea din VB.Net, deoarece acestea sunt diferent e.
– C # utilizează paranteze de tip curly -brackets {} care definesc începutul și sf ârșitul funcțiilor cum
ar fi funcțiile, pentru fiecare afirmație, pentru declarații etc. Parantezele de tip curly -brackets pot deveni
dezordonate dacă nu aveți grijă să nu le confundați cu alte paranteze de tip curly -brackets care sunt
pentru altceva în co dul existent.

2.2 WinForm
Windows Forms este un set de biblioteci gestionate în .NET Framework concepute pentru a
dezvolta aplicații client puternic dezvoltate . Este un API grafic pentru a afișa date și a gestiona
interacțiunile utilizatorilor cu o implementare mai ușoară și o mai bună se curitate în aplicațiile client.
Acesta oferă o bibliotecă vastă de clienți și prezint ă o interfață pentru a accesa elementele de
interfață grafice Windows native și grafica din codul gestionat. Este construit cu o ar hitectu ră bazată pe
evenimente, similară cu cea a clienților Windows și prin urmare, aplicațiile sale așteaptă o intrare a
utilizatoru lui pentru executarea acesteia.
Windows Forms este similar cu biblioteca Microsoft Foundation Class (MFC) în dezvoltarea d e
aplicații client. Acesta oferă un pachet format dintr -un set de clase C + + pentru dezvoltarea aplicațiilor
Windows. Totuși acesta nu oferă un framework de aplicare implicit, cum ar fi MFC.
Fiecare control din aplicația Windows Forms este o instanță concr etă a unei clase. Structura unui
control în GUI și comportamentul acestuia sunt gestionate folosind metode și handlere . Windows Forms
oferă o varietate de comenzi, cum ar fi casete text, butoane și pagini web, împreună cu opțiunile de a crea
controale pers onalizate. De asemenea, conține clase pentru crearea de obiecte geometrice , fonturi, icon-
uri și alte obiecte grafice (cum ar fi linia și cercul).

Windows Forms Designer este un instrument, în Visual Studio.NET, folosit pentru a insera
controalele într -o formă și pentru a le aranja conform layout -ului dorit, cu prevederea de adăugare a

15
codului pentru a le gestiona evenimentele care implementează inte racțiunile utilizatorilor. Datele
gestionate în tabel care sunt legate de XML, baza de date etc. pot fi afișate utilizând controlul DataGrid
View sub formă de rânduri și celule.

Setările aplicației reprezintă o altă caracteristică a Windows Forms pentru a crea, a stoca și a
menține informațiile de stare în execuție într -o formă XML care poate fi utilizată pentru a prelua setările
preferate de utilizator, cum ar fi pozițiile barei de instrumente și listele cele mai recent utilizate. Aceste
setări pot fi reu tilizate într -o aplicație viitoare. Pentru dezvoltarea unei aplicații de tip Windows Forms
este inclus și faptul că :
– Clasele Windows Forms pot fi extinse, folosind moștenirea, pentru a proiecta un framework
de aplicații care să asigure un nivel ridicat de abstractizare și reutilizare a codurilor.
– Form -urile trebuie să fie compacte, iar controalele pe acestea să fie limitate la o dimensiune
care să ofere funcții minime. În plus, crearea și eliminarea controal elor dinamic poate reduce
numărul de controale statice.
– Form -urile pot fi împărțite în bucăți ambalate în ansambluri care se pot actualiza automat și se
pot gestiona cu ușurință cu efort minim.
– Oferă scalabilitate și flexibilitate cu ușurință pentru depana re și întreținere.
– Aplicațiile Windows Forms ar trebui proiectate pe baza nivelului de încredere necesar,
necesității de a solicita permisiuni și de a gestiona excepțiile de securitate ori de câte ori este
necesar.
– Formularul Windows nu poate fi trecut pes te limita domeniului aplicației, deoarece nu este
conceput pentru a fi rulat în toate domeniile de aplicații.
Prezentarea prin intermediul Windows Framework (WPF) este cea mai recentă tehnologie de redare a
interfețelor utilizator în aplicațiile Windows GU I cu funcții precum suportul 2D / 3D, vizualizarea
interactivă a datelor și lizibilitatea conținutului. Se bazează pe obiecte DirectX, mai degrabă decât pe
GDI (Graphic Device Interface), pentru furnizarea unui model de programare în care interfața cu
utilizatorul este separată de logica de programare . Cu toate acestea, cu capacitatea de a interacționa cu
WPF (ori de câte ori este necesar), Windows Forms este o alegere bună pentru aplicații care nu necesită
GUI bogat în medii și alte caracteristici WPF cum ar fi șabloane de date / control, funcții tipografice și
redare de text.

16
2.2.1 Form Designer Window
Când se crează un proiect nou, care este o aplicație Windows From , Visual Studio .NET va
deschide proiectul în vizualizarea Designer. De asemenea, puteți selecta opțiunea Designer din
meniul Vizualizare unde se află toate clasele, referințele și toate componentele necesare rulării
proiectului. Designerul de Forme consti tuie de obicei ferestrele din mijlocul mediului Visual Studio
.NET care conține r eprezentarea obiectului formei aplicației [5]. Pe scurt prezintă output -ul aplicației.
Se poate observa în figura de mai jos:

Fig.3 Exemplu Form Designer Window
InitializeComponent este o metoda scrisa a utomat de catre Form Designer câ nd c reați / modificați
formularele. Fiecare fișier Forms (de ex. Form1.cs) are un fișier de designer (de exemplu,
Form1.designer.cs) care conține metoda InitializeComponent, cu rol în suprascrierea formularului
generic. Dispose și declararea tuturor obiectelor de interfață cu ut ilizatorul, cum ar fi butoane, etichetele
și forma în sine.

17

public Form1() {
InitializeComponent();
}
Metoda InitializeComponent conține codul care creează și inițializează obiectele interfeței utilizator trase
pe suprafața formularului cu valorile furnizate de dvs. (programatorul) utilizând Gridul proprietății
Formatorului. Datorită acestui fapt, nu încercați niciodată să interacț ionați cu formularul sau comenzile
înainte de apelul către InitializeComponent. De asemenea, veți găsi aici instrucțiun ile de instalare
necesare pentru a conecta comenzile și pentru a forma evenimentele pentru gestionarea anumitor
evenimente pe care le -ați scris pentru a răspunde acțiunilor utilizatorului. Codul conținut în Form1.cs și
fișierele Form1.Designer.cs face parte din aceeași clasă datorită conceptului de clase parțiale care ar
putea păstra două sau mai multe fișiere ale codului împreună ca un sin gur bloc de cod.
2.2.2 ToolBox Window
Fereastra ToolBox conține o gamă largă de controale care se poate mări dacă dorim să folosim
framework -uri care adaugă alte controale .NET Framework și care pot fi adăugate la o aplicație.
Adăugarea unui control la o aplicaț ie la timpul de proiectare este la fel de ușor ca tragerea controlului din
ToolBox și plasarea acestuia pe formularul aplicației în fereastra Form Designer.
Properties Window – conține toate proprietățile publice ale comenzii selectate în fereastra Form
Designer. Puteți modifica aceste proprietăți introducând valori în comenzile TextBox de lângă numele
proprietăților. Dacă proprietatea are un număr limitat de valori, atunci lângă numele proprietății care
conține valorile posibile pentru proprietate este a fișată o casetă drop -down .

18

Fig.4 Exemplu Properties Window
O proprietate este o informație care caracterizează sau descrie starea unui contr ol. Ar putea fi
legat de locație sau ar putea modifica dimensiunea sa. Ar putea fi setat cu o anumita culoarea sau orice
alt aspect vizual care îi dă sens. Proprietățile unui obiect pot fi modificate fie la momentul proiectării, fie
la timp ul de execuție. Aceasta înseamnă că puteți seta câteva proprietăți la m omentul proiectării și altele
în timpu l de execuție.
Pentru a manipula proprietățile unui control la momentul proiectării, mai întâi selectați -l din
formular. În timp ce este selectat un control, utilizați fereastra de proprietăți pentru a manipula
proprietățile controlului la momentul proiectării.
În cele d in urmă, dacă valoarea proprietății este o colecție de obiecte sau un obiect complex, este
posibil să existe o elipsă situată lângă numele proprietății. Am folosit proprietățile pentru fiecare element
existent în aplicație (butoane, poze, forme, label -uri…) atât pentru a le putea ordona, stiliza și manipula,
cât și pentru punerea lor în funcțiune pentru un anumit context.
Events Handlers reprezintă starea când un control este manipulat în timpul execuției, iar acesta va
declanșa un eveniment pentru a not ifica aplicația că starea comenzii s -a schimbat. Această notificare a

19
evenimentului urmează aceeași convenție de gestionare a evenimentului utilizată în cadrul .NET
Compact Framework. Pentru a gestiona un eveniment publicat de un control, trebuie mai întâi să creați o
metodă care să conțină codul care trebuie executat atunci când evenimentul este declanșat. Apoi atașați
metoda la evenimentul publicat de control. Acest lucru se poate f ace prin fereastra „Proprietăți”.
Fereastra de p roprietăți afișează eve nimentele publicate de control. Event Handler -ele au fost foarte utile
în aplicație atunci când am realizat setarea unor variabile din codul sursă și atunci când utilizatorul crează
o nouă instanță a unei forme prin crearea unor butoane.
2.2.3 Window Controls
Cont roalele Windows Forms sunt componente reutilizabile care încorporează funcționalitatea
interfeței utilizator și sunt utilizate în aplicațiile Windows client -side. Un buton este un control, care este
o componentă interactivă care permite utilizatorilor să c omunice cu o aplicație. Clasa Button descinde
direct din clasa ButtonBase. În continuare voi enumera câ teva controlere populare ș i de asemenea des
utilizate în cadrul aplicaț iei mele:
Button – Într-o aplicație de windows și nu numai , un buton este un obiect pe care utilizatorul dă
clic pentru a efectua o acțiune. Un exemplu vizibil și evident este atunci când rulăm aplicația și dorim să
ne autentificăm cu datele noastre, apăsăm butonul „Login”. Deși un control este poziționat de obic ei pe
un formular, există diferite alte containere de control care pot ține un buton. Pentru a putea identifica
daca un buton este folosit , acesta va afișa un text sub forma unui titlu . Un buton poate afișa și o imagine .
Un alt buton poate afișa un string și o imagine. La crearea butonului utilizatorul trebuie să indice și să
manipuleze funcționalitatea acestuia .

private void InitializeComponent() {
btnResume = new Button();
}

20
În cazul aplicației mele butoanele joacă un rol foarte important pentru interfața manipulată de
către utilizator. Prin ele se setează anumite valori atât în programul sursă cât și în baza de date, în funcție
de controlul utilizatorului și se redă o continuitate a programului prin instanțierea de forme noi.
Timer – Un cronomet ru este un obiect non -spațial care utilizează perioade care se repeta î ntr-un
anumit interval de timp într -o aplicaț ie software. Pentru a lucra, la fiecare interval de timp, controlul
trimite un mesaj către sistemul de operare. Mesajul este ceva care are c a efect "am numărat numărul de
pierderi pe care mi -ați cerut să le numărăm". În codul de mai jos este creat un obiect de tip Timer apoi
pentru fiecare interval de timp, care se setează prin proprietate tick se creaza un obiect de tip
EventHandler care va a pela o anumită metodă definită de către utilizator.

private void InitializeComponent() {

timer = new Timer();
timer.Tick += new EventHandler(DoSomething);

}

Un cronometru este un obiect folosit pentru a număra perioadele de timp și pentru a trimite un mesaj
când a terminat de numărat . Fiecare număr este numit tick. Când apare un tick, controlul declanșează un
eveniment Tick. Acest eveniment Tick este de tip Ev entArgs. Aceste timere redau în această aplicație o
continuitate în care utilizatorul trebuie să reacționeze într -un anumit timp tocmai pentru a îndeparta orice
posibilitate de a putea manipula evenimentul respectiv. Este vorba de primul test care odată activat,
ruleaza pe anumite intervale de timp
Picture Box – Puteți afișa o imagine direct pe o formă . Acest obiectiv se realizează cu ajutorul
unui control numit PictureBox, special făcut pentru a oferi un spațiu mai confortabil și ușor de manipulat
pentru a afișa o imagine . Dupa selectarea unui PictureBox din căsuța de ToolBox acesta va avea mărim ea
implicită care urmează să fie manipulată prin cod. În exemplul de cod de mai jos este creat un obiect de
tip PictureBox și este setată proprietatea de imagine cu o sursă găsită la calea „path” cu ajutorul funcției
FromFile.
private void InitializeComponent() {

picture = new PictureBox();
picture.Image = Image.FromFile(„C: \path”);

21

}
În această aplicație imaginea este „cheia” având în vedere faptul că se ocupă cu verificarea și dezvoltarea
calității vizuale. Prin imagini se crează o ambianță și o experiență plăcută, în care utilizatorul se poate
ghida mai bine, cel mai important fiind faptul ca outputul aplicației are o consistență formată din imagini.
Data Grid View – este un control dreptunghiular realizat din coloane și rânduri. Secțiunea de sus
a controler -ului afișează header -ul coloanelor sub forma unei cutii de culoare gri, fiecare afișând un text
reprezentativ datelor cu care se lucrează . În partea stângă, se găsesc niște căsuțe gri, denumite header -uri
de rând. Celulele sunt intersecțiile coloanelor și rândurilor. Aceste celule sunt de culoare alba. Acestea
sunt caracteristicile implicite ale coloanelor, rândurilor și celulelor. Acestea pot afișa diferite culori,
diferite lățimi și înălțimi diferite.
private void InitializeComponent() {

dgvExample = new DataGridView();
dataGridView1.DataSource = dgvExample;

}
Acest control oferă posibilitatea de a putea afișa și a ordona datele într -o anumită ordine după un anumit
standard atunci când volumul de date este voluminos și este preluat dintr -o bază de date sau o altă sursă
de date.
Label – O etichetă este un control care are rol pentru a îndruma utilizator ul, prin informația pe
care aceasta o conține. Aceasta o feră un text static /intern pe care utili zatorul nu îl poate modifica, dar îl
poate citi pentru a obține informații din acea formă . De asemenea poate fi folosit pentru a afișa
utilizatorilor informații simple. Cele mai multe controale din interiorul unei forme nu sunt explicite la
prima vedere și este posibil ca utilizatorul să nu știe pentru ce și cum sunt folosite. Prin atribuirea unei
etichete se va putea realiza un ghid pentru utilizator prin cuvinte. În exemplul de mai jos, la încărcarea
formei se va crea un obiect de tip label și i se va atr ibui un control de tip TextBox.
private void InitializeComponent() {

labelExample = new Label();
Controls.Add( textbox1 );

22

}
În această aplicație etichetele joacă un rol foarte important, atât pentru îndrumarea utilizatorului, pentru
navigarea în aplicație cât și pentru afișarea și crearea anumitor teste și afișarea regulilor acestora.
TextBox – este un control Windows utilizat pentru a obține sau a afișa un text către utilizator. În
cea mai obișnuită utilizare, o căsuță de text poate avea un rol ca un placeholder pentru a completa și a
furniza informații. O astfel de utilizare este obișnuită în aplicațiile de angajare, căsuțe de dialog , de
conectare într-o aplicație , formulare etc. Ca majoritatea celorlalte controale, rolul unei casete de text nu
este evident la prima vedere; de aceea ar trebui să fie însoțită de o Label care definește scopul acesteia.
private void InitializeComponent() {
textExample = new TextBox();
}
TextBox -urile sunt folosite în mare, în această aplicație tocmai pentru a prelua infomațiile frunizate de
către utlizator, care sunt apoi procesate de program.

În general toate elementele de control au rolul de a ghida utilizatorul și de a crea o anumită
imagine de ansamblu asupra aplicației, dar și pentru a seta valorile impuse de către utilizator, afișând
astfel un anumit rezultat. Majoritatea acestor obiecte conțin proprietatea „Name” care definește numele
intern al controlului respectiv, pentru a putea fi manipulați în partea de programare și pentru a -i fi setate
anumit e valori. Pe de alta parte proprietatea de „Text” afișează doar un output al unui rezultat obținut.

2.3 NuGet
NuGet este o extensie Visual Studio 2010 care face să fie ușor să adăugați, să eliminați și să
actualizați biblioteci și tool-uri în proiecte Visual Studio , care utilizează .NET Framework.
Cu alte cuvinte, NuGet este un instrument care permite descărcarea și includerea fișiere lor sursă (cs, vb,
js etc.) sau a ansambluri lor compilate (dll) în proiectele Visual Studio. Acum, pe internet există o
mulțime de biblioteci de coduri care sunt open source si acest lucru nu este o noutate . Lucrul dificil
constă în găsirea codului, descărcarea acestuia, adăugarea lui la controlul sursei, trimiterea la el din
proiectul dvs. și gestionarea viitoarelor actualizări a le acestei biblioteci atunci când devin disponibile.
Repetați toți acești pași pentru fiecare dependență a acelei biblioteci. NuGet simplifică toți acești pași
doar cu câteva clicuri.

23
Există un număr mare de componente gratuit e, reutilizabile, disponibile în întreaga rețea, care pot fi
reutilizate în proiectele noastre. De fiecare dată când vrem să integră m aceste componente în proiectul
nostru, vom petrece o perioadă considerabilă de timp pentru al descărca, integra și configura. Deoarece
aceasta este o sa rcină repetabilă, cu o sferă de automatizare, Microsoft a introdus un nou add -on pentru
Visual Studio numit NuGet, care poate găsi toate componentele disponibile OSS (Open -Source System)
și să le integreze în proiectul nostru cu componentele lor dependente . NuGet se ocupă, de asemenea, cu
actualizarea fișierului de configurare dacă componenta necesită adăugarea unor setări în fișierul de
configurare a proiectului. De asemenea, oferă opțiunea de a actualiza re a component ei și de a elimina
componenta dacă est e necesar. Odată instalat, acest add -on oferă atât console bazate pe GUI, cât și
console bazate pe PowerShell, pentru a găsi și adăuga componente în soluția noastră de proiect. [4]

Fig.5 Algoritmul de funcționare NuGet între creator, gazdă și utilizator
NuGet o dată încărcat va încărca toate componentele disponibile (pachete în termeni NuGet)
dintr -o locație de alimentare centralizată și va oferi o opțiune de descărcare și integrare în proiectele
noastre. Pe ntru fiecare componentă, se cre ază un pachet și se adaugă un sistem centralizat de alimentare,
care este apoi consumat de NuGet pentru a prelua componentele disponibile. Cu NuGet, puteți să creați și
un pachet al componentei dvs. și să -l adăugați la fluxul centralizat pentru ca și ceilalți să se poată folosi
de el prin "NuGet".
Un lucru foarte important la crearea unei aplicații este stilizarea acesteia, cu un aspect cât mai plăcut și
simplu pentru utilizator. În acest domeniu am decis că framework -urile se potrivesc cel mai bine pentru a
crea o legatură între utilizator și program. Am ales framework -ul Bunifu nu numai pentru opțiunile de

24
customizare și stilizare numeroase pentru aplicație pe care acesta le deține, dar și pentru timpul
economisit și pentru consumul minim de resurse pe care acesta le are c omparativ cu alte framework -uri.
Funcționează pe principiul Drag -Drop și oferă o gamă largă de elemente de control.
Al doilea pachet folosit prin intermediul NuGet este HtmlAgilityPack . Acesta este un parser agil HTML
care construiește un DOM de citire / scriere și acceptă XPATH sau XSLT într-un mod simplu. Este o
bibliotecă de cod al framwork -ului .NET care permite analizarea fișierelor "out of the web" HTML.
Parserul este foarte tolerant cu HTML custom care se găsește în site -uri obișnuite, zilnice . Modelul este
foarte asemănător cu ceea ce propune System.Xml, dar pentru documente de tip HTML. Am folosit
acesta împreună cu un alt framework numit System.Net.Http care oferă o interfață de programare pentru
aplicații HTTP moderne, inclusiv componente HTTP client , care permit aplicațiilor să consume servicii
web prin componente HTTP care pot fi utilizate atât de clienți, cât și de servere pentru parsarea antetelor
HTTP.
Scopul a fost crearea unui webcrawler care colectează informații cum ar fi adresa URL a site -ului,
informațiile despre meta tag, conținutul paginii web, linkurile din pagina web și destinațiile care provin
din acele linkuri, titlul paginii web și orice alte informații relevante. Unul dintre teste oferă propoziții
care sunt generate aleator tocmai prin folosirea unui webcrawler, care accesează un anumit website
pentru preluarea de informatii html care se genereaza aleator.

2.4 Microsoft SQL Server
Aplicația lucrează cu baza de date și, pentru a avea cele mai bune performanțe, am ales baza de
date Microsoft SQL Server . Acesta este un sistem de management al bazelor de date relaționale
(RDBMS) care suportă o mare varietate de aplicați i de procesare a tranzacțiilor și de analiză în mediile IT
corporative. Microsoft SQL Server este una dintre cele trei tehnologii baze de date de vârf de pe piață,
împreună cu Oracle Database și IBM DB2. Ca și alte programe RDBMS, Microsoft SQL Server este
construit pe lân gă SQL, un limbaj de programare standardizat pe care administratorii de baze de date
(DBA) și alți profesioniști IT le utilizează pentru a gestiona bazele de date și pentru a interoga datele pe
care le conțin. SQL Server este legat de Transact -SQL (T -SQL), o implementare a SQL de la Microsoft
care adaugă un set de extensii de programare proprietare la limba standard. [6]

25
Asigură securitatea datelor:
MS-SQL Server oferă avantajul de a lucra cu o structură de tabel, bazat pe rânduri, care permite
conectarea elementelor și funcțiilor de date corelate. Multe alte sisteme de gestionare a bazelor de date
(DBMS) sunt mai puț in sigure, în timp ce MS -SQL permite menținerea securității, integrității și
coerenței datelor cu care se lucrează . Acest lucru este deosebit de important când informațiile despre
clienți sunt disponibile și vulnerabile. Deci este necesară clădirea încrederii în securitatea sistemului
bazei de date.
Optimizează stocarea și precizia datelor :
Acest lucru oferă avantajul de a scăpa de necesitatea de a duplica stocarea de date într -o bază de date
atunci când se lucrează la un calculator diferit. Alte avantaje ale acestei structuri sunt că furnizează
integritate atunci când se face referire la baza de date. Exis tă și alte constrânge ri legate de integritate care
ajută la menținerea acurateții datelor . Pentru a face acest lucru, arhitectura Microsoft SQL este compusă
din câteva elemente cheie care constituie baza sistemului. Unul dintre aceste elemente este SQL Server
Database Engine care joacă un rol foarte important în manipularea procesării și stocării de date, față de
securitatea datelor.
Instalare simplă și update -uri automate :
Avantajul pe care îl ofera este că nu este nevoie de un toolkit special pentru a rula instalarea.
Actualizările de sistem sunt detectate automat și descărcate fără vreo i ntrare din partea operatorului.
Alte componente, cum ar fi serviciile analitice, pot fi instalate după instalarea inițială, dacă se dorește
acest lucru . Aceasta înseam nă că se poate personaliza serverul SQL în funcție de ceea ce ne dorim.

SQL Server Management Studio (SSMS) este un mediu integrat pentru gestionare a orică rei
infrastructuri SQL, de la SQL Server la Azure SQL Database. Motivul pentru care am folosit SSMS este
că oferă instrumente pentru configurarea, gestionarea și administrarea instanțelor Microsoft SQL Server
și reunește o gamă largă de instrumente de proiectare grafică și vizuală și editori de script pentru a
simplifica lucrul cu SQL Server. Funcțiile SSMS combinate provin de la Enterprise Manager, Query
Analyzer și Manager de analiză, împreună cu funcțiile incluse în versiunile anterioare ale SQL Server.
Acesta suportă majoritatea sarcinilor administrative ale SQL Server și menține un singur mediu inte grat
pentru gestionarea și autorizarea SQL Server Database Engine. [10]

26
Microsoft SQL Server Management Studio includ e Object Explorer, care poate vizualiza și
gestiona toate obiect ele dintr -o instanță SQL Server. Template Explorer este folosit în scopul în care
construiește și gestionează fișiere de text care pot fi refolosite pentru a accelera interog area și dezvoltarea
scenariilor. Solution Explorer construiește proiectele utilizate pentru gestionarea elementelor de
administrare, cum ar fi interogări ș i scripturi.

3. Rezolvarea temei de proiect
3.1 Plan initial
În zilele noastre, mulți dintre noi au locuri de mun că ce ne obligă să ne uităm la ecrane de
calcul ator pentru ore întregi. Asta poate afecta cu adevărat ochii. Problemele oculare cauzate de utilizarea
computerului intră sub incidența afecțiunii CVS ( Computer Vision Syndrome ). Nu este o problemă nou
întalnită . În schimb, acesta include o întreagă gamă de categorii de afecțiuni și dureri oculare. Cercetările
arată că între 50% și 90% dintre persoanele care lucrează cu ecranul unui compute r au cel puțin câteva
simptome. Lucrătorii adulți nu sunt singurii afectați. Copiii care se uită la tablete sau folosesc
calculatoare în timpul zilei la școală pot avea probleme, ma i ales dacă iluminatul și poziția lor sunt
necorespunzătoare .
Mulți oameni, atunci când se confruntă cu astfel de probleme, tind să își găsească remedii rapide
în informațiile existente deja pe Internet. Aceste informații conțin o parte de adevăr, fiind furnizate de
niște oameni din domneniu, dar foarte multe dintre acestea tind să exagereze sau să generalizeze
afecțiunea întâlnită. Pentru orice afecțiuni oculare intalinte, există softwar -uri speciale, bineînțeles contra
cost, care pot detecta cu ușurință starea de sănătate vizuală a individului respectiv. Softurile gratuite, în
schimb, au o acuratețe de detecție mult mai slabă.
Dupa un studiu realizat pe aceste sofware -uri contra -cost am început realizarea unei aplicații
hibird cu un algoritm accesibil a unei aplicații de detecție a potențialelor probleme ale utilizatorului. Ca
un plan principal al acestei aplicații utilizatorul trebuie să urmeze următorii pași:
 Am decis ca, pentru fiecare utilizator, să existe un profil care să se stocheze într -o bază de
date, informațiile legate de datele de contact/personale ale utilizatorului, cât și cu datele
care conțin scorul obținut pentru fiecare testare în parte.
 Odată cu stocarea acestor date personale și dupa autentificarea în aplicație, utilizatorul va
putea b eneficia de două părți majore ale aplicației. Prima parte o constituie cea de

27
TESTING. Aceasta parte este formată dintr -o serie de teste care se parcurg treptat și în
ordine. Primul test va fi unul bazat pe intervale de timp în care utilizatorul va trebui să
respecte informațiile specificate din instrucțiunile aferente. Acestea indică modul în care
primul test trebuie să fie executat, adică prin acoperirea unui ochi, îndepărtarea cu trei pași
față de monitor și reținerea caracterelor care apar pe ecran înt r-un interval de 10 secunde,
precum și ordinea acestora. Apoi utilizatorul va scrie, în căsuța care va apărea, caracterele
memorate. Acesta este singurul test care funcționează pe intervale și necesită atenția
suplimentară a utilizatorului.
 Cel de -al doil ea test prezintă o imagine în mijlocul ecranului. Această imagine conține un
caracter special creat, care seamănă cu litera „E” și, în jurul acestuia, butoane care indică
următoarele direcții : SUS, JOS, STÂNGA, DREAPTA. Utilizatorul va trebui să apese
butoanele aferente care indică direcția caracterului. Pentru fiecare apăsare de buton,
caracterul își schimbă direcția, devenind mai mic și cu o transpareță mult mai ridicată,
tocmai pentru a stimula receptorii ochiului uman.
 Testul al treilea constă într -o imagine care reprezintă o cifră și butoane care indică
anumite numere. Utilizatorul trebuie să detecteze cifra din imagine. Consistența acestui
test constă în faptul că cifrele din imagine sunt reprezentate după un anumit standard de
detectare a unei pot ențiale afecțiuni în care nu se pot identifica culorile, cifrele din imagini
fiind colorate pe un fundal specific acestui test.
 Pentru a nu lă sa posibilitatea c a utilizatorul să poata trișa la testul patru, acesta constă într –
o imagine care reprezintă, de fapt, un grafic cu multe lini i, într -o formă circulară, care se
va schimba într -o manieră în care ochii utilizatorului sunt păcăliți printr -o imagine albă
care are ca scop resetarea imaginii văzute anterior. Lânga acest grafic există niște butoane
care ind ică utilizatorului să răspundă cu DA sau NU. La fiecare apăsare de buton,
imaginea cu graficul se va schimba și i se vor îngroșa sau nu liniile în direcție circulară.
 Ultimul test constă într -o serie de cuvinte afișate într -o căsuță pe ecran și o altă casu ță în
care se va rescrie textul mai inainte precizat. Textul va fi de fiecare dată unul diferit și cu o
mărime de font tot mai mică.
După această serie de teste utilizatorul va fi trimis din nou în meniul principal unde va putea accesa
partea a doua a aplicației și anume HEALTH. Aici vor fi 3 categorii : Good, Medium și Bad. Aceste

28
verdicte vor fi asociate utilizatorului în func ție de scorul obținut la partea de testare. Dacă utilizatorul va
fi asociat cu Good, acesta va primi timp de 10 zile sfaturi pentru menținerea ochilor sănătoși. La
categoria Medium există o opțiune de Start și Stop, cu scopul de a crea un timer care să bl ocheze ecranul
utilizatorului timp de câte minute decide acesta, din oră în oră. La categoria Bad utilizatorului i se va
deschide o fereastră cu o hartă a orașului și cu toate clinicile disponibile din acel oraș.

Aplicația funcționează și indică un verdic t cât mai corect dacă utilizatorul respectă regulile
precizate, dar dacă acesta vrea să trișeze, aceste indicații pot să difere. Un dezavantaj ar fi corectitudinea
și verificarea utilizatorului la primul test, în care acesta trebuie să țină o anumită dista nță față de monitor.
Deși executarea testului a fost realizată la intervale de timp, tocmai pentru a omite cât mai mult
posibilitatea de a trișa, această metodă nu conține nici o modalitate de verificare a poziției utilizatorului.
În final, aplicația indică și are o acuratețe bună dacă și utilizatorul respectă regulile impuse.

3.2 Mediul de dezvoltare si limbajul de programare
Dezvoltarea aplicațiilor d esktop a dominat lumea software -ului timp de mulți ani. Cu toate
acestea, odată cu implementarea pe scară largă a Internetului, aplicațiile web au cunoscut o răspândire în
ritm accelerat . Atunci când smartphone -urile au devenit omniprezente , aplicațiile mobile au ajuns la o
mare cerere, împingând aplicații le desktop pe locul al treilea.
Există totuși și o creștere incredibilă a dezvoltării de software în aplicațiile desktop. A se vedea
programe precum Excel, Adobe Photoshop și browserul Chrome. Pe lângă aplicațiile similare existente,
există multe argumente bune pentru a dezvo lta noi aplicații desk top. Unele dintre acestea sunt:
-Aplicația nu trebuie să fie conect ată la I nternet
-Puteți interacționa mai bine cu PC -ul utilizatorului. Aplicațiile Web rulează într -un mediu
sandbox și blochează aproape toate interacțiunile.
-Aplica țiile desktop au performanțe mai bune decât aplicațiile web
-Rularea algoritmilor mai complicați pe partea clientului este posibilă, dar mult mai dificilă cu o
aplicație web.
-Utilizarea de fire de execuție este mult mai ușoară și mai eficientă într -o apli cație desktop.

29
Dezvoltarea pentru desktop este excelentă din multe motive. Ca în cazul întregului software, există multe
modalități diferite de a dezvolta aplicații desktop. Aceasta include limbaje de programare diferite,
framework -uri și decizii de arhite ctură. Toate acestea sunt diferite în funcție de nevoile individuale ale
aplicației dezvoltate .
C # este un limbaj potrivit și am descoperit că acesta are o serie de avantaje față de limbajul Java (versus
Java ca limbaj , platforma de dezvoltare și arhitectura runtime). Preferințele de programare a limbilor tind
să fie la fel de variate ca și gusturile în îmbrăcăminte. Pentru cei care preferă sintaxa Java, un compilator
de sintaxă Java există sub forma lui J #. În ciuda faptului că are un nume simila r cu limbajele de
programare mai greu de învățat precum C și C ++, C # este mult mai simplu pentru începători.
Programarea C # este orientată pe obiect, pe care unii oameni o consideră mai ușor de înțeles pentru
începători. În timp ce este suficient de clară pentru începători, aspectul și funcționalitatea C # fac limbajul
perfect pentru a obține o înțelegere mai largă asupra programării în ansamblu. Limbajele de nivel scăzut,
cum ar fi C și C ++, vor executa aproape orice instrucțiune atâta timp cât se comp ilează – chiar dacă
aceste instrucțiuni provoacă daune grave sistemului de operare. C # verifică codul la compilare și aruncă
erori și avertism ente pentru a opri acest lucru.
De asemenea, C # gestionează automat memoria, mai degrabă decât să aloce memoria pentru
datele în cauză. În acest moment , C # este a patra limbă , cea mai populară , în conformitate cu PYPL
(Popularity of Programming Language Index). A fost cel de -al șaselea limbaj cel mai solicitat din 2018
pe Indeed.com, și cu susținerea Microsoft, est e foarte probabil că nu va mai fi în așteptar e în curând.
Limba jul a fost în dezvoltare activă de aproape 20 de ani, și noi caracteristici sunt adăugate la ea
tot timpul. C # poate folosi biblioteca puternică LINQ, concepută pentru controlul la nivel înalt a
structurilor de date și a obiectelor din cod ul în cauză . Pe scu rt, limba jul este destinat să ajute lucrărilor pe
care programatorii le realizează zilnic.Visual Studio, mediul de dezvoltare integrat al Microsoft (IDE), a
fost scris în C #. În timp ce se poate programa folosind orice limbă în Visual Studio, utilizarea o ptimă
este dezvoltarea C #.
Windows încă mai domină pe piață pentru sistemele de operare. C # a fost utilizat de aproape 20
de ani pentru a crea aplicații Windows în cadrul .NET. Instrumentele de limbă și de dezvoltare ale
Microsoft, cum ar fi Visual Studi o, sunt, probabil, fără îndoială, cea mai bună modalitate de a pro iecta
aplicații pentru Windows.

30
Microsoft a introdus recent .NET Core ca o versiune simplificată open source a framework -ului
.NET. Gratuit și ușor de instalat, permite dezvoltarea pe mai multe platforme. Aceasta înseamnă că orice
dezvoltator poate crea console și aplicații web pe orice sistem de operare.
Având în vedere faptul că aplicațiile mobile sunt din ce în ce mai răspând ite, aplicația „Bullseye”
are în plan și dezvoltarea unei versiuni pentru telefon mobil. Dezvoltarea Android are loc de obicei în
Java. Pentru dezvoltarea iOS, se pot folosi Swift sau Obiectivul C. Aceasta înseamnă că, dacă dorim o
dezvoltare pentru ambele tipuri de telefon, ar trebui să învățăm două limbi diferite. Xamarin este
conceput pentru a face față acestei probleme.

Framework -ul permite să codifica rea în C # și compilarea atât pentru iOS și Android. Aceasta
înseamnă că se poate utiliza același cod pentru ambele platforme și se pot actualiza ambele aplicații dintr –
o singură bază de coduri. Pe lângă codul care sta la baza aplicației fiind într -o singură limbă, Xamarin
permite proiec tarea GUI pe fiecare platformă.
Aceasta înse amnă că, odată ce aplicați a funcționează, există posibilitatea de a proiecta o interfață
inteligentă care are sens pentru utilizatorii de telefoane Android și iOS.
Cu alte cuvinte C#, pentru toate scopurile de intens , este limbajul adecvat al framework -ului
.NET. A fost scris în mod explicit pentru a sprijini caracteristicile din .NET și a devenit utilizat în
materialele de curs orientate .NET. Cu alte cuvinte, cei mai mulți programatori .NET vor întâlni frecvent
codul C # și vor avea o familiaritate puternică cu limba.
Primul pas în crearea unei aplicații este găsirea unei tehnologii de UI. Există foarte multe
framework -uri UI pentru Windows, fiecare cu propriile avantaje și limitări. Majoritatea tehnologiilor se
vor limita la un anumit limbaj de programare . Aici este o listă cu t oate tehnologiile de vârf disponibile
astăzi:
 UWP – cea mai nouă tehnologie de aplicații Desktop a Microsoft. Este bazat pe XAML, ca
WPF, și se poate scrie în C #, VB.Net și C ++, dar majoritatea aplicațiilor sunt scrise în C
#.
 WPF – O tehnolo gie Microsof t populară bazat pe XAML. Se poate coda în C # sau
VB.NET.
 WinForms – O tehnologie Microsoft mai veche, foarte populară înainte de WPF. Spre
deosebire de WPF și UWP, WinForms se bazează pe interfața drag and drop a Visual

31
Studio Designer. Designul drag and drop face WinForms foarte productiv pentru aplicații
care nu necesită personalizare specifică și un UI responsive. Este ușor de învățat ș i
funcționează pe toate versiunile de Windows
 Electron – Un framework care permite dezvoltarea de aplicații desktop cu tehnologii Web
(HTML / CSS / JavaScript). Partea atractivă care stă în spatele Electronului este că
folosește Node.Js și Chromium pentru a crea o Vizualizare Web într -o fereastră de
desktop. Electron a câștigat o anumită popularitate pentru o vreme și exi stă aplicații
populare dezvoltate cu acesta, cum ar fi Slack, GitHub Desktop și Visual Studio Code.
 JavaFX și Swing – Două framework -uri Java UI de la Oracle. Ambele sunt cross –
platforme. JavaFX este mai nou și încurajat de Oracle ca înlocuitor pentru Swin g, dar are
o adoptare relativ scăzută. Swing, pe de altă parte, este mai veche și mai larg utilizată, dar
este încă mai puțin populară pentru aplicațiile Windows decât WPF sau WinForms. O
aplicație de exemplu scrisă cu Swing este IntelliJ a lui JetBrain.

Potrivit sondaj ului de mai jos , WPF și WinForms domină complet piața. De asemenea, este
remarcabil faptul că WinForms rămâne atât de popular după atâția ani.

Fig.6 Sondaj cu popularitatea aplicațiilor destinate Desktop -ului

32
Spre deosebire de alte baze de date MS SQL îndeplinește toate cerințele aplicației. Microsoft SQL
Server e ste o bază de date relațională de găzduire care este utilizată pentru a stoca informații despre
aplicație , date personale, contact și capacitatea fiecărui utilizator. MS SQL este cel mai popular tip de
bază de date pe serverele Windows.

În ter meni de bază, o bază de date MS SQL este capabilă să stocheze orice tip de date. Acesta vă
va permite stocarea și recuperarea rapid ă a informații lor. Se folosesc instrucțiuni SQL pentru a realiza
toate acestea. În termeni tehnici , majoritatea versiunilor de MS SQL au următoarele caracteristici:
 Administrarea tamponului
 Logare și tranzacție
 Concurrency și blocare
 Servicii de replicare
 Servicii de analiză
 Servicii de notificare
 Servicii de integrare
 Serviciu de căutare text integral
 Proceduri stocate
 Triggere
 View -uri
 Sub-SELECT (adică SELECTuri imbricate)

MSSQL este baza de date potrivită pentru acest tip de aplicație pe o platformă Windows (folosind
.NET sau A SP). Aceste limbaje sunt extrem de ușor d e conectat la o bază de date MS SQL. Dezvoltarea
aplicațiilor desktop pentru Windows este complexă, ca orice soluție software. Am mentionat unele dintre
cele mai importante decizii în arhitectura unei aplicații .

33
3.3 Structura bazei de date
Fiind deja fa miliarizat cu MSSQL, am decis să conectez aplicaț ia utilizând .NET Framework Data
Provider pe ntru SQL Server. A fost necesară folosirea bazei de date atât pentru stocarea datelor cât și
pentru memorarea unor date care nu trebuie să fie modificate , numa i dacă utilizatorul doreș te acest lucru.
Primul pas a fost crearea unei baze de date. Pentru manipulearea datelor din aceasta, m -am folosit de
SQL Server Management Studio 2018.

Fig.7 Autentificare in SQL Server Management Studio
Pentru această aplicație sunt folosite trei tabele importante. Primul tabel este cel cu datele despre
utilizator, care conține datele personale (FirstName și LastName), datele de autentificare ( UserName și
Password), locația orașului și adresa uti lizatorului ( Location și Address), dar și numărul de înregistrări

34
pe profilul respectiv.

Fig.8 Tabelul „Account” cu datele utilizatorului
Prin opțiunea din aplicație de a crea un utilizator nou se inserează noi valori în aceast tabel, cu ajutorul
unei proceduri S QL, care se numește AddUser.
ALTER PROC [dbo].[AddUser]
@FirstName varchar(50),
@LastName varchar(50),
@UserName varchar(50),
@Password varchar(50),
@Location varchar (50),
@Address varchar(50),
@records int
AS
insert into
Account(FirstName,LastName,UserName,Password,Location,Address,Records)
VALUES(@FirstName,@LastName,@UserName,@Password,@Location,@Address,@re
cords)

La început se creează variabilele corespunzătoare câmpurilor în care dorim să inserăm valori noi,
apoi se selectează tabelul și coloanele aferente. Se vor introduce valorile din variabile în coloanele

35
respective . Tabelul „Account” este cel mai impo rtant deoarece are coloane de legătură cu celelalte tabele
care sunt utilizate pe parcursul folosirii programului.
Al doilea tabel, cu o importanță aparte în această aplicație, este cel care deține toate scorurile
obținute de către utilizator la te stele aplicației.

Fig.9 Tabelul „ UserTestScore ”
Aceasta tabel se numește UserTestScore și are coloane pentru fiecare test în parte ( Zoom -Visual
Memory Test, Visual Acuity Test, Color Vision Test, Astigmatism Test, Near Vision Test ), dar și data
curentă, pentru a înștiința utilizatorul în ce dată a realizat o serie de teste cu denumirea de (Date) și datele
de legătură cu acest tabel (UserName și Password).

Pe lângă acestea, mai este și tabelul „Health”, care este folosit a tunci când utilizatorul dorește să își
cunoască categoria în care acesta a fost repartizat. În coloana „Days” sunt stocate zilele, în cazul în care
utilizatorul a fost repartizat în categoria Good , adică a realizat o serie de teste și a obținut un scor mai
mare decât un anumit prag impus. Din nou coloanele „UserName” și „Password” și pe lângă acestea
intervalul de 10 zile pe care utilizatorul , repartizat în categoria Good , primește sfaturi pentru menținerea
sănătoasă a ochilor.

36

Fig.10 Tabelul „ Health ”
Primul pas într -o aplicație C # este de a crea o instanță a obiectului Server și de a stabili conexiunea cu o
instanță a Microsoft SQL Server.
Pentru conectarea aplicației cu baza de date se foloseste adăugarea namespace -ului „using
System.Data.SqlClient”. Datorită acestuia se poate crea o biectul de tip SqlConnection . Acesta constă în
manipularea părții de comunicare fizică între aplicația C # și baza de date SQL Server. O instanță a clasei
SqlConnection în C # este suportată de furnizo rul de date pentru baza de date SQL Server. În codul sursă
al aplicației am folosit la unele cone xțiuni cu baza de date „using”.
În C # există câteva obiecte care utilizează resursele sistemului care trebuie să fie eliminate sau
închise la un moment dat . În C # codul poate fi creat ca o instanță nouă în resursă, pe care o utilizăm și o
închidem. Sau, pe de altă parte, putem totodată să utilizăm pentru acest lucru blocul de instrucțiuni numit
„using” în care obiectul creat urmează să fie și închis, iar resursele sunt apoi acceptate să fie folosite din
nou de alte procese. Acest lucru asigură că framework -ul va lua cele mai bune măsuri pentru fiecare

37
proces. Instanța SqlConnection ia argumentul String ca argument și transmite valoarea la in strucțiunea
Constructor.

SqlConnection conn = new SqlConnection(@"Data Source=DESKTOP –
J8FPANO\DANSANSQL;Initial Catalog=Test1;Integrated Security=True")

Stringul de conectare este pur și simplu o compilație de opțiuni și valori pentru a specifica cum și la ce se
face conectarea . Din acest string de conectare fiecare atribut are un anumit rol. Există o listă cu toate
artibutele, dar în cazul aplicației de față, mi s-au părut utile următoarele atribute:
– Data Source: specifică serverul unde urmează să fie făcuta conexiunea
– Initial Catalog: selectează baza de date din Microsoft SQL Server
– Integrated Security: verifică dacă User ID -ul și password -ul sunt specificate în conexiune. Dacă
conține valoarea true, datele de contact ale Windows -ului curent sunt folosite pentru autentificare.
Valorile recunoscute sunt true, false, yes, no, și sspi, ceea ce este echivalent cu adevărat.
User ID-ul este utilizat atunci când se utilizează autentificarea SQL. În cazul acestei aplicații , acest lucru
este ignora t când se utilizează un ‚Trusted Connection ’ sau ‚Windows Authentication ’.

SqlConnection.Open () este o funcție void care nu returnează o eroare, dar aruncă o excepție, așa
că am decis ca cel mai util lucru ar fi să folosesc un bloc de cod try/catch.
try
{
myConnection.Open();
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}

38
Aceasta funcție .Open( ) deschide conexiunea cu baza de date. După conectarea la baza de date,
se execută setul de comenzi pe care le dorim și care vor fi executat e pe server pentru a executa query -ul
dorit , cum ar fi inserarea datelor, actualizarea înregi strărilor și așa mai departe.

SqlCommand command = new SqlCommand("SELECT * FROM TableName",
conn);

Fiecare comandă de pe serverul SQL este executată astfel, primul parametru este comanda, iar al
doilea este conexiunea pe care se va executa comanda. Pentru această aplicație am folosit comezile de
bază pentru selectarea de date din baza de date (Select), pentru inserarea de noi valori (Insert) și comanda
pentru inserarea de date (Update). Codul de bază va fi convertit înapoi la comanda care ar fi execu tată pe
serverul în care sunt prezente datele și apoi vă va returna rezultatul, fie că a fost o eroare sau un raport de
succes.

In cazul acestei aplicații am folosit comanda INSERT INTO, unde a trebui t să adaug parametri i
comenzii, astfel încât baza de date să fie protejată de SQL Injec tions. Folosirea parametrilor reduce
șansele ca baza de date să fie atacată, aruncând o eroare dacă utilizatorul încearcă să adauge niște
comenzi prin intermediul formula rului în serverul care contine baza de date.

Parametrizarea query -urului se face folosind Parametrul Sql care este trecut în comandă. De
exemplu, în căutarea înregistrărilor în cazul în care un criteriu se potrivește. Puteți indica acele criterii,
trecând numele variabilei î n query și apoi adăugând valoarea acesteia folosind obiectul de tip
SqlParameter. În acest cod se execută o procedură stocată în baza de date și se aleg parametrii
corespunzatori pentru executarea acesteia:

SqlCommand com = new SqlCommand("AddUser", con);
com.CommandType = CommandType.StoredProcedure;
com.Parameters.AddWithValue("@FirstName", txtFirstName.Text.Trim());
com.Parameters.AddWithValue("@LastName", txtLastName.Text.Trim());
com.Parameters.AddWithValue("@UserName", txtUserName.Text.Trim());

39
com.Parameters.AddWithValue("@Password", txtPassword.Text.Trim());
com.Parameters.AddWithValue("@Location", txtLocation.Text.Trim());
com.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
com.Parameters.AddWithValue("@records", 1);

Obiectul de tip SqlCommand are două proprietăți importante și anume CommandType și
CommandText. CommandType poate lua una dintre următoarele valori: Text, StoredProcedure,
TableDirect. Proprietatea CommandType va avea valoarea implicită CommandType.Text. Când valoarea
este CommandType.Text, proprietatea va conține textul unei interogări care trebuie executată pe server.
În cazul în care valoarea este CommandType.StoredProcedure, proprietatea CommandText trebuie să fie
un nume al unei proceduri de executat.

Urmatoarea coma ndă folosită pentru conexiunea la baza de date a acestei aplicații este
ExecuteNonQuery . Aceasta a fost folosit ă pentru executarea query -urilor care nu returnează date. Se
utilizează pentru a executa instrucțiunile sql cum ar fi act ualizarea, inserarea, ștergerea.
ExecuteNonQuery execută comanda și returnează numărul de rânduri afectate. În cazul aplicației mele
am folosit -o pentru actualizarea datelor în majoritatea tabelelor :

con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = " update dbo.Account set Records = Records +1
where UserName ='" + username + "' and Password = '" + password + "'
";
cmd.ExecuteNonQuery();

În final după executarea instucțiunilor prezentate mai sus, conexiunea cu baza de date trebuie să fie
închisă și aceasta se realizează cu ajutorul funcției .Close ( ) .

40
3.4 Framework -uri
3.4.1 Dezvoltare UI
Framework -urile de programare sunt fundamentul pe care dezvoltatorii de software pot construi
programe pentru anumite platforme. Acestea sunt concepute pentru a reduce problemele generale cu care
se confruntă programatorii în timpul procesului de dezvoltar e, prin standardizarea codului care poate fi
implementat în aplicație.

În această aplicație am folosit framework -uri atât pentru partea de stilizare a aplicației, cât și
pentru elementele componente ale unui webcrawler din codul sursă. În tehnologia info rmației, designul
interfeței pentru utilizator reprezintă crearea unei interfețe, a unui inter -mediu, între utilizator și o
anumită aplicație. Este vorba atât despre programarea aspectului vizual, cât și a dobandi o funcționalitate
și o experiență a util izatorului cât mai bună.

Cu alte cuvinte, o interfață pentru utilizator este caracteristică fiecărei aplicații și ea permite unui
utilizator să interacționeze optim cu aceasta. De exemplu la completarea formularului de înregistrate a
unui profil de utiliz ator, interfața constă în mai multe căsuțe de text, pentru a prelua datele furnizate de
către utilizator. Un UI ( User Interface ) este important pentru că ajută publicul țintă să vadă mai clar și să
înțeleagă mai ușor care este scopul produsului. Acesta tr ebuie conceput astfel încât să afișeze serviciile
pe care le oferă, fără ambiguitate, pentru a atrage atenția vizitatorilor și a -i păstra cât mai mult timp pe
site-ul respectiv.

Rezultatul final al unui UI bine realizat constă în faptul că poate transform a vizitatorii potențiali
în cumpărători, facilitând interacțiunile dintre utilizator și respectiva aplicație.

Programarea care stă în spatele UI -ului este un domeniu destul de complicat, care implică
anticiparea preferințelor utilizatorului și apoi creare a unei interfețe care înțelege și vine în întâmpinarea
acestor preferințe. UI se concentrează nu numai pe estetică, ci și pe maximizarea reactivității, a eficienței
și a accesibilității aplicației. O interfață este un punct în care un utilizator interacțio nează cu software -ul
pe care îl utilizează. O interfață bine proiectată oferă utilizatorului un amestec perfect de design vizual,
design de interacțiune și arhitectură a informațiilor .

41
Design vizual
Rolul major al d esignul ui vizual este de a îmbunătăți calitat ea vizuală a aplicației prin implementarea
strategică a unor elemente cum ar fi fonturi, culori și imagini. Când este executa t profesional, designul
vizual dă un plus de eleganț ă aplicației, fără a comprom ite funcția sau conținutul său.

Design interactiv
Designul interactiv reprezintă modul în care utilizatorii interacționează cu aplicația.

Arhitectura informațională
Arhitectura informațiilor are menirea de a ajuta utilizatorii să găsească informațiile necesare pentru a
îndeplini diverse sarci ni.
Având astfel o schiță a aplicației, pentru partea de stilizare am folosit frameworkul Bunifu prin
intermediul extensiei NuGet care a adaugat în ToolBoxul din Visual Studio urmatoarele controale:

Fig.11 Elementele de control din framework -ul Bunifu

42

Aceste elemente de control au fost atașate într -un mod vizual atractiv și interactiv în aplicație, prin Drag –
and-Drop, unde au fost configurate adecvat pentru obținerea unui aspect potrivit. Bunifu este o alegere
foarte bună deoarece elementele sunt foarte ușor de folosit și prezintă calitatea de a fi responsive în
aplicație. De asemenea au foarte multe proprietăți care au fost manipulate pentru a obține aspectul dorit.

Fig.12 Elemente din framework -ul Bunifu la executarea aplicatiei

Aspectul și comportamentul responsive al programului este redat de către elementele furnizate de
framework -ul Bunifu, dar și de arhitectura codului și setarea proprietăților elementelor din aplica ție.
Acest framework oferă o gamă foarte largă de elemnte de control special concepute pentru a satisface
majoritatea cerințelor utilizatorilor, indiferent de domeniul și rolul aplicației.

43

Un exemplu de cod programat într-un stil responsive , în partea de creare a unui profil de utilizator:

private void txtFNEnter(object sender, EventArgs e)
{
if (txtFirstName.Text.Equals(@"FirstName"))
{
txtFirstName.Text = "";
}
}

private void txtFNLeave(object sender, EventArgs e)
{
if (txtFirstName.Text.Equals(""))
{
txtFirstName.Text = @"FirstName";
}
}

private void txtLNEnter(object sender, EventArgs e)
{
if (txtLastName.Text.Equals(@"LastName"))
{
txtLastName.Text = "";
}
}

private void txtLNLeave(object sender, EventAr gs e)
{
if (txtLastName.Text.Equals(""))
{
txtLastName.Text = @"LastName";
}
}

În această secvență de cod este setat evenimentul ‚Enter’ si ‚Leave’ din proprietățile elementelor de
control, să reacționeze atunci când utilizatorul accesează o căsuță de textBox cu mouse -ul. Scopul acestui
cod a fost să ușureze munca utilizatorului pentru a omite ștergerea de fiecare dată a conținutului de text
din câmpurile respective.

44
3.4.2 WebCrawler
Crawling -ul sau Scraping -ul este procesul în care se crează un „motoraș” de căutare care adună
informații despre site -urile web de pe internet. Acesta poate fi, totodată , utilizat pentru mentenanța
automatizată a unor web site -uri, cum ar fi verificarea legăturilor sau validarea codului HTML .
Crawling înseamnă practic urmărirea unei anumite căi de execuție . Un crawler web cunoscut și sub
numele de web spider sau webrobot este un program sa u un script automatizat care navighează pe World
Wide Web într -o manieră metod ică, în mod automat .
Acest proces se numește Web crawling sau Spidering. Multe site -uri oficiale , în special cele care
au motoare de căutare, utilizează Spidering ca mijloc de a procura date care sunt noi pentru anumite
analize.Crawlerele Web sunt programe de calculator care scanează toate infomatiile, adică elementele de
HTML care compun un web site .
Aceste crawlere furnizează informațiile de pe pagini web pentru a vedea ce cuvinte cheie conțin și
unde sunt folosite acele cuvinte. Crawlerul își transformă căutările într -un index gigantic . Scopul
accesării și folosirii unui crawler pe web este de obicei în vederea executării indexării . Aceasta se referă
la diferite metode de indexare a conținutului , adică a elementelor unui site Web sau al Internetului ca
întreg . Indexul este, de obicei , o listă mare de cuvinte și paginile web. Crawlerele web scanează aceste
pagini în mod regulat, astfel încât să a ibă întotdeauna un index actualizat al paginilor web. Atunci când se
întreabă un motor de căutare despre paginile referitoare la ceva anume , motorul de căutare verifică
indexul și oferă o listă de pagini care menționează lucrul căutat .
Acest proces este r ealizat de crawlerul Google Spider și după ce crawlingul a fost terminat,
rezultatele se pun pe indexul Google ( cu alte cuvinte căutarea pe web) . La fel, am avut și eu nevoie de
acest tip de crawler în aplicația prezentă, pentru a putea crea un mediu nou l a fiecare utilizare sau
accesare a utilizatorului. Pentru u ltimul test din aplicație am avut nevoie de un text generat random, de
fiecare dată când utilizatorul realizează acel test. Planul pentru acest test a fost să găsesc un website care
generează strin gurile necesare într -un mod aleator și să pot accesa aceste valori prin intermediul
aplicației. Aici m -am folosit de cele două framework -uri „ HtmlAgilityPack ” și „System. Net.Http ” prin
intermediul extensiei NuGet. HtmlAgilityPack este un parser de cod HTML scris în C # pentru citire sau
scriere din/in DOM și suportă XPATH sau XSLT simplu. [7]

45
System.Net.Http oferă o interfață de programare pentru aplicațiile de tip HTTP care sunt mai
moderne. Acesta este creat în așa fel încât să furnizeze următo arele:
 Componente de client HTTP care permit utilizatorilor să manipuleze servicii web prin intermediul
HTTP.
 Aceste c omponente HTTP pot fi utilizate atât de clienți, cât și de servere , lucru care oferă un
model bine definit de programare , atât pe partea de client , cât și pe partea de server pentru servicii
web prin intermediul HTTP.
În aplicație metoda startCrawlerasync() conține acest “motoraș ” de crawling. În acest cod este
încarcată pagina direct prin intermediul unei pagini web:
var url = "http://www.randomtextgenerator.com/";
var httpClient = new HttpClient();
var html = await httpClient.GetStringAsync(url);
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(html);

După căutarea unei pagini web care să respecte cerințe le pentru ultimul test al aplicației, am ajuns
la concluzia că pagina web „ randomtextgenerator ” este cea mai potrivita pentru acest context. Aceasta
metoda este de tip asincron. Am ales acest tip de funcționare pentru a ordona logica programului în
sarcin i care asteaptă , unde se pot efectua operațiuni de lungă durată, cum ar fi încărcarea unor resurse de
pe web. Framework -ul .Net oferă cuvinte cheie simple și ușor de utilizat, care sunt modificatori i async și
await cu rol în a transforma codul de la sincron la asincron.
Un aspect al folosirii de async / await in cadrul aplicatiei este ca o metodă asincronă returneaza de
îndată ce are nevoie să aștepte ceva ce nu a terminat de executat , dar apoi continuă când a terminat. Daca
nu utilizam a wait, ar fi aștepta returnarea metodei GetStringAsync(url), dar nu va aștepta să se finalizeze.
Funcția GetStringAsync() t rimite o cerere de tip GET și returnează un răspuns ca de tip string într-o
operație asincronă. În continuare am folosit o listă cu pr oprietăți dintr -o clasă numita RandomText pentru
a introduce elementele cheie din pagina încarcată în funcție de clasa și de atributele HTML pe care le
deține pagina Web.

46

var cars = new List<RandomText>();
var divs =
htmlDocument.DocumentNode.Descendants("div")
.Where(node => node.GetAttributeValue("class",
"").Equals("grid_13")).ToList();
foreach (var div in divs)
{
var car = new RandomText
{
Text =
div.Descendants("textarea").FirstOrDefault().InnerText
};
cars.Add(car);
}

Fiecare pagină web conține elemente HTML care sunt împărțite în clase sau id -uri. În cazul aplicației,
căutarea se face din aproape în aproape, unde se încarcă toate valorile în lista “divs” care conține toate
nodurile din elementul HTML care sunt “div” -uri cu clasa “grid_13”. Prin funcția foreach se introduce
fiecare element găsit care are denumirea de “textarea” în proprietatea din clasa RandomText. Apoi acea
proprietate de tip string va fi adaugată în lista “cars”.

3.5 Arhitectura și funcționalitatea aplicației
3.5.1 Algoritmi
În cadrul acestei aplicații, prin dezvoltarea acesteia, am învățat și am descoperit noi strategi i și
metode de executare a ideilor pentru aceasta. Acești algoritmi sunt încadrați în diferite tipologii și joacă
un rol foarte important în generarea de date noi, procesarea acestora și stocarea de valori atât în codul
sursă cât și în baza de date a aplic ației. Voi prezenta în continuare o serie de algoritmi pe care i -am
dezvoltat în această aplicație:
 Algoritmul SQL pentru selectare de date :

47
using (SqlConnection conn = new SqlConnection(@"Data Source=DESKTOP –
J8FPANO\DANSANSQL;Initial Catalog=Test1;Integrated Security=True"))
{
using (SqlCommand cmd = new SqlCommand("select * from
dbo.Account WHERE UserName = @username AND Password = @password"))
{
cmd.Connection = conn;
conn.Open();
cmd.Parameters.Add("@username",
SqlDbType.NVarChar).Value = txtUsername.Text;
cmd.Parameters.Add("@password",
SqlDbType.NVarChar).Value = txtPassword.Text;
using (SqlDataReader re = cmd.ExecuteReader())
{
if (re.Read())
{
Menu menu = new Menu(txtUsername.Text,
txtPassword.Text);
menu.Show();
this.Hide();
}
else
{
MessageBox.Show("Nu prea!");
}
}
}
}
În acest algoritm este executată seria de funcții ale obiectelor necesare pentru conexiunea cu baza de date.
Am folosit parametri pentru verificarea datelor de profil ale utilizatorului, deoarece în acest fel
verificarea este mult mai sigură.

48
 Algoritmul de inserare a datelor:
public void Insert()
{
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = " insert into dbo.UserTestScore ([Zoom –
Visual Memory Test], [Visual Acuity Test], [Color Vision Test]," +
" [Astigmatism Test], [Near Vision Test],
Date,UserName, Password) values ("+ scoreTest1 + ",0,0,0,0,get date(),
'" + username + "' , '" + password + "' ) ";
cmd.ExecuteNonQuery();
con.Close();
}

 Algoritmul de actualizare de date:
public void UpdateScore()
{
con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = " update dbo.UserTestScore set [Visual
Acuity Test] = " + scoreTest2 + " where UserName ='"
+ username + "' an d Password = '" + password + "' and
[Visual Acuity Test] = 0 ";
cmd.ExecuteNonQuery();
con.Close();
}

Fiecare test al aplicației conține, de fapt, o serie de inserare, transformare, procesare și de returnare de
date în funcție de valorile de input ale utilizatorului. Partea de testare conține metode de prelucrare a

49
datelor, dar și schimbare de elemente de control din cadrul aplicației, pentru a oferi un rezultat la reacția
și deciziile utilizatorului.
 Algoritmul pentru primul test ( Zoom -Visual Memory ):
Primul test se execută pe baza unor obiecte de tip ‘Timer’ care rulează pe anumite intervale de timp
în care utilizatorul trebuie să ofere atenție, dar și să reacționeze la stimulii impuși. Acest test folosește
elemente de control, mai precis etichete, care vor fi afișate pe ecran în locații și de dimensiuni diferite.
Aceste etichete vor avea o literă al easă aleator pentru fiecare apariție a acestora. Această funcționalitate
se realizează cu ajutorul metodei Rand(). Aceasta conține un dicționar cu toate literele alfabetului având
chei în intervalul 1 și 26. Apoi urmează o alta metodă integrată în această funcție care returnează o
valoare aleatoare în intervalul de chei ale dicționarului.
int RandomNumber(int min, int max)
{
Random random = n ew Random();
return random.Next(min, max);
}
var randNum = RandomNumber(1, 26);

Valoarea aleatoare se stochează într -o variabilă care va decide ce valoare din dicționar va fi
returnată de metoda Rand(). Apoi ma i exista încă doua metode pentru incremetarea unui contor și pentru
returnarea unui array de obiecte de tip ‘Label’. Timerele au valorile predefinite de la începutul execuției
primului test în milisecunde. Inițial, din prespectiva utilizatorului, acestuia i se va afișa un scurt text cu
instrucțiunile pentru acest test, după care va fi afișată o etichetă cu o literă aleatoare. Pentru fiecare set de
etichete, se execută trei metode care folosesc două obiecte de tip ‘Timer’ definite la începutul clasei.
Prim a metoda, TimePart1 (), setează intervalul de timp al timerului prin proprietatea .Tick, să execute o
a doua metodă Part1(), care incrememtează contorul și parcurge array -ul de obiecte de tip label, în funcție
de lungimea contorului, afișând eticheta corespunzătoare cu valoarea aleatoare la o poziție și o mărime
predefinită, dupa modelul testelor de acuitate vizuală făcute de specialiștii din dom eniu. Apoi primul
timer este oprit executându -se apoi cea de -a treia metodă, care setează obiectul de tip “Timer” pentru un
alt interval de timp în care să se execute o metodă care să ascundă eticheta afișată anterior și să afișeze o
căsuță de tip textBox și un buton de confirmare, care să rețină răspunsul utilizatorului acestui test.
public void TimePart1()

50
{
timer2.Tick += new System.EventHandler(Part1);
}
public void Part1(object sender, EventArgs e)
{

WichPartNumber();
for (int i = 0; i < Len; i++)
{
var label = ReturnLabels();
label[i].Show();
label[i].Text = Rand();
Letter = label[i].Text;
label[i].Location = new Point(628, 105);
label[i].Font = new Font(label[i].Font.FontFamily,
400);
}
timer2.Stop();
}
public void TimePart1Res()
{
timer3.Tick += new System.EventHandler(ResShow);
}

Acest lucru se va repeta de 10 ori, iar pentru fiecare confirmare a rezultatului realizată prin buton, se
execută o metodă de calculare a scorului care compară rezultatul utilizatorulu i cu valoarea afișată de către
aplicație. Dacă utilizatorul a scris toate valorile corecte scorul se va incrementa cu 10, dar dacă
utilizatorul a introdus de exemplu din 4 valori afișate, doar 3 valori corecte, scorul va fi împărțit la
numărul literelor a fișate, în cazul acesta 7,5. Rezultatele vor fi stocate într -un tabel, la fiecare șir de teste
pe care utilizatorul decide să le facă. Acesta fiind primul test se execută și o metodă de inserare ale unui
nou șir de valori în tabelul din baza de date. În t abel vor fi 5 scoruri pentru fiecare test în parte, iar acesta

51
fiind primul, metoda de inserare va adauga în tabel valoarea obtinută de utilizator doar la primul test, iar
restul testelor vor avea scorul de 0. Acestea vor fi schimbate ulterior în cadrul ce lorlalte teste. Toate
metodele de afișare a caracterelor sunt apelate în constructorul clasei. Scorul este calculat prin
intermediul evenimentului de click pe buton.
 Algoritmul pentru al doilea test ( Visual Acuity ):
Cel de-al doilea test incepe similar cu primul test, în sensul că valorile datelor care vor fi afișate sunt
setate tot într -o manieră aleatoare. Funcția care se execută la început generează valori în intervalul de
numere 1 și 5. Apoi, în funcție de numărul gen erat, se va afișa elementul de control de tip PictureBox din
condiția respectivă, restul elementelor fiind setate să fie ascunse. Tot aici se va seta o variabilă bool -eana,
pentru a identifica poziția controlului afișat. În funcție de butonul apăsat pentru identificarea poziției
imaginii, se va executa metoda numita Resize( ) :
string[] picsPath = { "Sus.png", "Jos.png", "Right.png", "Stanga.png"
};
string[] picsCPath = { "CercUp.png",
"CercDown.png","CercRight.png", "CercLeft.png", };
PictureBox[] picsImage = { picUp, picDown, picRight,
picLeft };
if (counter == 1)
{
float opacityvalue = 90F / 100;
for (int i = 0; i < 4; i++)
{
var path =
"C:\\Users\\stane\\source\\repos\\Bullseye \\" + picsPath[i] + "";
picsImage[i].Size = new Size(300, 300);
picsImage[i].Location = new Point(751, 379);
picsImage[i].Image =
ChangeOpacity(Image.FromFi le(path), opacityvalue); } }
În cadrul metodei există două array -uri de tipul string cu denumirea pozelor care trebuie să se
schimbe la fiecare apăsare de buton, dar și un array cu obiectele de tip PictureBox. La fiecare apăsare de
buton , counter –ul va crește pentru parcurgerea fiecărei condiții. În condiția prezentată mai sus este setată

52
o valoare de opacitate și este afișată imaginea curentă cu o anumită locație și mărime. Cât despre setarea
imaginii, aici se va executa o altă metodă, cu o anum ită valoare de opacitate, pentru a schimba
transparența la imaginea curentă.
public static Bitmap ChangeOpacity(Image img, float opacityvalue)
{
Bitmap bmp = new Bitmap(img.Width, img.Height);
Graphics graphics = Graphics.F romImage(bmp);
ColorMatrix colormatrix = new ColorMatrix();
colormatrix.Matrix33 = opacityvalue;
ImageAttributes imgAttribute = new ImageAttributes();
imgAttribute.SetColorMatrix(colormatrix,
ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
graphics.DrawImage(img, new Rectangle(0, 0, bmp.Width,
bmp.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel,
imgAttribute);
graphics.Dispose();
return bmp;
}

Imaginea de intrare este transformată într -un bmp, care este construit prin intermediul unor matrici . După
prima apăsare de buton, deci dupa prima afișare de imagine, evenimentul de click al butonului va calcula
scorul în funcție de valoarea bool -eana setată din prima metodă și va incrementa un contor. Rezultatul
final este setat în baza de date prin metoda de actualizare Update () când contorul ajunge la un anumit
prag.
 Algoritmul pentru test ul de Astigmatism :
Acest algoritm este cel mai ușor ca implementare. Conține două metode de generare de chei aleatoare
și un dicționar, care conține denumirea unor imagini și cheile aferente acestora. Următoarea metodă
setPic() conține valorile genera te aleator ale primelor metode și, în funcție de aceste valori, afișează sau
un overlay de imagini în format PNG peste imaginea de bază care conține un grafic cu linii circulare,
special pentru detecția astigmatismului. Aici butoanele incrementează la fie care apasare de buton un
contor și execută un Timer care afișează o imagine albă pe tot ecranul, special pentru a reseta imaginea

53
văzută anterior de utilizator, lăsând utilizatorul să decidă dacă imaginea s -a schimbat sau nu. Tot aici, la
evenimentul de cl ick al butonului, se seteaza scorul în funcție de o valoare bool -eana.
name = R();
if (counter == 1 || c == 2)
{
picOverlay1.Parent = picOrig;
picOverlay1.Image =
Image.FromFile("C: \\Users\\stane\\source\\repos\\Bullseye \\L\\" + name
+ ".png");
picOverlay1.BackColor = Color.Transparent;
picOverlay1.Show();
check = true;
}
else if (counter == 4 || c == 6)
{
picOverlay1.Parent = picOrig;
picOverlay1.Image =
Image.FromFile("C: \\Users\\stane\\source\\repos\\Bullseye \\L\\" + name
+ ".png");
picOverlay1.BackColor = Color.Transparent;
picOverlay1.Show();
name = R();
picOverlay2.Parent = picOverlay1;
picOverlay2.Image =
Image.FromFile("C: \\Users\\stane\\source\\repos\\Bullseye \\L\\" + name
+ ".png");
picOverlay2.BackColor = Color.Transparent;
picOverlay2.Show();
check = true;
}

54
 Algoritmul pentru testul de Near Vision :
Metoda principala pentru acest test este se numeste startCrawlerasync () si foloste un webcrawler care
preia niste data furnizate de o anumita pagina web la carui element extras este procesat. Webcrawlerul va
prelua tot continutul elementului HTML precizat in parametri de cautare al acestuia. Elementul returnat
fiin unul foarte vo luminos in caractere trebuie modificat special pentru a putea fi afisat pentru utilizator.
Cu ajutorul metodei TruncateAtWord, modificam rezultatul webcrawler -ului la o dimensiune mai mica
intr-un format corespunzator. Aici est codul pentru aceasta functie :
public static string TruncateAtWord(string input, int length)
{
if (input == null || input.Length < length)
return input;
int iNextSpace = input.LastIndexOf(" ", length,
StringComparison.Ordinal);
return string.Format("{0}…", input.Substring(0,
(iNextSpace > 0) ? iNextSpace : length).Trim());
}

Utilizatorul introduce datale afișate într -o căsuță de tip textBoxs și apoi sunt verificate prin
executarea unui eveniment de click al unui buton. În acest eveniment de click, verificarea se face prin
metoda SplitWords ( ) care împarte un string fix, într -un array de tip string, fiecare cuvânt din stringul
inițial, fiind un element distinct în acest array. Apoi se va executa o altă metodă pentru verificarea celor
două string -uri, ale utilizatorului și cele generate de aplicație. În cazul în care utilizatorul va introduce
corect toate caracterele scorul se va incrementa cu 10, iar daca utilizatorul greșește în scrierea unui
cuvânt, sc orul va fi împărțit la numărul de cuvinte existente în stringul fix, respectiv numărul de elemente
din array.
La fiecare din aceste teste, majoritatea metodelor vor fi executate în constructorul clasei,
elementele de control vor prelua datale introduse de către utilizator , iar la final se va calcula un scor final
pentru aceste date, care vor fi actualizate în tabelul corespunzător din baza de date. Fiecare clasă a
testelor conține un contor și o metodă care se execută atunci cănd contorul ajunge la egal cu numărul de
teste realizate de către utilizator. Testele nu pot fi făcute pe rând, ci încep la un moment și trebuie

55
terminate de catre utilizator pentru a evita valori nule. Dupa realizarea testelor, opțiunea HEALTH va fi
disponibilă împreună cu barele de progres din meniul principal.

3.5.2 Construcția interfeței
Pentru mine , o aplicație care oferă simplitate și cât mai multe informații este considerată o
aplicație reușită, nu doar din punct de vedere al designului, ci devenind ulterior și o muncă ușoară din
punct de vedere al programării. Pentru creșterea popularității acestei aplicații, am decis să urmez acest
model de simplitate și eleganță în ceea ce privește stilizarea.
Aceasta aplicație poate fi împarțită în 4 categorii. Prima parte o reprezinta autentificarea (denumită
în codul aplicației cu numele clasei de Login). Aceasta este baza toturor aplicațiilor care lucrează cu baze
de date. Aici utilizatorul are 3 variante. Prima, fiind indispensabilă dacă utilizatorul vrea să încerce
aplicația care c onstă în crearea unui profil de utilizator (denumită în codul aplicației cu numele clasei de
Create Account). Utilizatorul va completa cu datele sale personale aceste câmpuri formate din textBox –
uri într -un format responsive la decizile utilizatorului de a rescrie o anumită valoare, dar și la inserearea
de valori noi. Majoritatea aplicațiilor folosesc aceasta parte de creare de utilizator într -un mod separat
fata de aplicatia în sine. Cele mai des întâlnite metode de crearea de profil, se realizează de brow sere pe
internet.

Fig.13 Categoria de Login a aplicației

56
Din experiența mea de utilizator al altor aplicații, acest lucru poate fi deranjant atâta timp cât nu toți
deținătorii de computer au un hardware de un nivel care să poată fi repartizat în standardele medii în
raport cu performanța acestuia. Deci, fi ecare înregistrare deviază utilizatorul de la aplicația principală
forțând astfel pe utilizator să piardă o bună bucată de timp cu înregistrarea sa. Crearea unui profil al
utilizatorului în interiorul aplicației poate fi un mare plus, când vine vorba de Us er Experience (UE).
Celelalte două opțiuni reprezintă logarea cu datele din profilul de utilizator sau ieșirea din aplicație.
Cea de -a doua categorie, și cea mai importantă de altfel, este meniul principal (denumită în codul
aplicației cu numele clasei de Menu). Meniul principal este punctul de plecare oriunde în această
aplicație. De aici se poate accesa partea de testare (denumita în codul aplicației cu numele clasei de Test
1-5) și partea de repartizare (denumita în codul aplicației cu numele clasei de H ealth), în funcție de
rezultatele obținute la partea de testare. Fiecare clasă, începând de la clasa Login, este instanțiată cu
parametri de autentificare folosiți de utilizator. Partea de testare se execută într -o ordine și este un proces
continuu, în tim p ce partea de repartizare oferă utilizatorului o repartiție în funcție de rezultatul obținut.
Meniul oferă și statistici cu scorul obținut la teste, dar și informații referitoare la fiecare test în parte și
afecțiunea aferentă acelui test. Datele de profi l al utilizatorului sunt expuse într -un tabel și pot fi
modificate prin apăsarea butonului de editar e și completare a formularului cu datele noi . Totodată, dacă
utilizatorul este nou, instucțiunile pentru teste apar sub forma unui pop -up pentru a -l inform a cu privire la
acestea.

57

Fig.14 Categoria de Meniu a aplicatiei
Clasa “Health” conține în mod special cinci parametri de instanțiere a obiectului și aceștia sunt
împărțiți în datele de autentificare și categoria de repartizare, care este setată prin valori booleene. În
interiorul clasei, în funcție de categorie, eleme ntele de control vor fi afectate din punct de vedere vizual ,
cele necorespunzătoare utilizatorului având o vizibilitate redusă. Aceasta este cea mai bună metodă de
înștiințare a utilizatorului, pe lângă blocarea funcționalității acesteia. În cazul în care utilizatorul a fost
repartizat în categoria Good, adică a realizat un scor de peste 450 la teste, butoanele ‘Good’ și ‘Start’
sunt active. Ordinea este apasarea cronometrului ‘Start’, care execută o funcție în care se calculează 10
zile de la apasare, apo i se introduce acest interval în baza de date, pentru a fi preluat ulterior atunci când
utilizatorul apasă pe butonul ‘Good’. Modificările și setările de variabile se realizează atât în clasă cât și
în baza de date. Aici sunt apelate doua metode (numite GetDateRange () si CheckDate ()) în clasa
CalculateDays, care se ocupă cu introducerea celor 10 zile într -un dictionar și returnarea cheii pentru ziua
în care utilizatorul accesează butonul pentru sfaturi.
public int CheckDate(DateTime start, DateTime end)
{

58
var ListDays = GetDateRange(start, end);
int myKey = 1;
DateTime StartingDate = DateTime.Now;
foreach (var item in ListDays)
{
myKey = ListDays.FirstOrDefault(x => x.Value ==
StartingDate.Date).Key;
}
return myKey;
}

După ce utilizatorul a pornit acest cronometru, poate apăsa pe butonul ‘Good’ pentru a -și procura
informațiile zilnice despre cum își poate păstra și îmbunătăți acuitatea vizuală, aceste sfaturi fiind redate
prin texte și imagini. Am folosit baza de date, deoarece nu există altă metoda mai bună de a verifica ce
mesaje să se afișeze utilizatorului, dacă acesta este în prima zi sau în ziua a 4 -a de exemplu, de la intrarea
în funcțiune a cronometrului.

Fig.15 Repartizarea în categoria Medium

59
În cazul în c are utilizatorul primește un scor între 450 si 250 atunci este repartizat în categoria Medium.
În acest caz, la alegerea utilizatorului, se pornește un cronometru care acționează o dată pe oră, blocând
ecranul în funcție de valoarea aleasa de acesta.
Un r ezultat mai mic de 250 este repartizat în categoria Bad. În clasa Bad se stabilește locația
utilizatorului și se atașează un obiect de tip StringBuilder împreună cu o adresă de căutare pe pagina web
Google maps. Când adaug la un string o valoare , creez de fapt un obiect nou de fiecare dată când adaug
ceva, deoarece stringurile nu se pot muta în .NET. Când se utilizează un StringB uilder, se construiște
șirul într -un pre-allocated buffer . Adică, pentru fiecare adăugare la un string normal , se creaz ă un obiect
nou și se copiază toate caracterele în acesta . Deoarece toate obiectele de m ărime mică (sau mar e), în
acest caz , stringurile temporare de caractere , vor trebui în cele din urmă sa fie supuse procesului de
Garbage Collection. A dunând o mulțime de șiruri laolaltă poate să ducă la probleme de performanță. Prin
urmare, este în general o idee bună să se folosească un obiect de tip StringBuilder atunci când se adaugă
dinamic o mulțime de șiruri de caractere. Web-browser -ul fiind singurul element de control din forma
care urmează să fie generată, se setează adresa de căutare și executare a acesteia prin:

webBrowser1.Navigate(querryAddress.ToString());

3.6 Calitatea și designul
Aplicația urmărește aspecte cât mai profesionale prin furnizarea de imagini care se folosesc în
domeniul de cercetare, dar și în cel medical de vârf. După un timp de studiu îndelungat am ajuns la
concluzia că testele generate de aplicație pot reprezenta un plus în domeniul oftalmologiei, în detectarea
precoce a unei afecțiuni al a nalizatorului vizual.

Datele furnizate de aplicație (imaginile și sfaturile) au fost selectate cu atenție, aducând informații
precise și de calitate. În cazul testului Color Blind, acesta a fost special conceput pentru detecția
inabilității de a distinge culori le și este denumit Ishihara Color Vision Test. Acest test este numit după
medicul oftalmolog japonez Shinobu Ishihara (1879 -1963), care a inventat procedura și a publicat pentru
prima dată o descriere a acesteia în 1917.

60

Fig.16 Testul de culoare Ishihara
Medicii oftalmologi folosesc plăc uțele Ishihara pentru a examina pacienții cu problemele de
distingere a culorilor . Cineva cu deficiența de a putea distinge culoare a roșie de verde ar putea să nu vadă
numărul roșu din acest exemplu.
Testul Ishihara Color Vision constă dintr -o imagine , fiecare pagină conținând un model circular
care conține multe puncte de diferite culori, strălucire și dimensiuni. Punctele aparent aleatoare colorate
sunt aranjate în așa fel încât o persoană cu vizibilita te normală a culori lor va vedea un nu măr dintr -o
singură cifră sau din două cifre în interiorul matricei de puncte. Dar o persoană colorblind nu va putea
distinge nici un număr sau va vedea un număr diferit de cel văzut de o persoană cu v edere normală a
culorilor.

Persoanele care sunt testate, văd în general plăcile Ishihara în lumină obișnuit ă de cameră, în timp
ce poartă ochelari cu prescripție normală. Deoarece testul Ishihara presupune ca persoana care realizează
testul să recunoască și să identifice n umerele, testul poate fi mai puțin fiabil atunci când se testează
vederea culorilor la copii i foarte mici.
Un alt exemplu ar fi testul pentru detectarea astigmatismului. Astigmatismul apare când suprafața
ochiului (corneea ) sau lentila din spatele aceste ia nu este o formă rotundă, ci ovală ca o minge de rugby.
Acest lucru distorsionează lumina care intră în ochi și nu se focalizează corect pe retină. Urmarea este o
imagine neclară. Un exemplu pentru testarea acestui defect ocular ar fi imaginea de mai jos :

61

Fig.17 Test pentru detectarea astigmatismului
Dacă nu aveți astigmatism, liniile ar trebui să apară în mod clar focalizate și la fel de întunecate. Este
posibil să aveți astigmatism dacă unele seturi de linii apar ascuțite și întunecate , în timp ce altele sunt
neclare și mai luminoase . Testul din aplicație verifică și sinceritatea utilizatorului, introducandu -se astfel
într-un mod voluntar linii groase pe care utilizatorul sănătos ar trebui să le identifice.

4. Concluzii
Adesea oameni i tind să îș i trăiască viaț a cotidiană fără o analiză mai profundă, fără grija că ar putea fi
ceva necorespunzător și dăunator în viaț a lor. Unii adoptă un mod de viață cu o rutină nesănătoasă, prin
folosirea exagerat de îndelungată a computerului sau printr -o alimentație nesănătoasă. C el mai dureros
lucru este când se instalează anumite afecț iuni și stari de sănătate degradate, care dau alarm a că ceva nu
este în ordine ș i o schimbare radical ă în modul de viață trebuie făcută . Bineînțeles aplicația nu a fost
realizată ca un substitu t al controlului sau indicațiilor specializate ale unui expert î n domeniu l medical,

62
dar poate aduce indicii prețioase asupra unor aspecte de sănătate sau stil de viață pe care utilizatorul le-a
scăpat din vedere până acum.

Testele de acuitate vizuală sunt alese după o perioadă de cercetare făcută în domeniu. Iar
afecț iunile pe care această aplicaț ie le poate indica sunt unele dintre cele mai răspâdite, din păcate, atât la
tineri cât ș i la oameni i înaintați în vârstă. Totodată ș i cei care nu prezintă o anumită afecțiune, pot preveni
apariția acest eia, prin sfaturile care dacă sunt urmate î n intervalul de 10 zile (dar și dincolo de această
perioadă) pot da efecte remarcabile și garantate. Începand cu elemente de sport, alimentație ș i un stil de
viață sănă tos, chiar și cei cu o anumită afecț iune – preferabil în stadiu incipient -își pot îmbunătăți
acuitatea vizuală î ntr-un mod radical. Cei care prezintă un scor mediu la test e, au opțiunea să urmeze ș i ei
acel interval de zile cu sfat urile aferente pentru recuperarea acuității vizuale.
Aplicația este nouă, realizată de puțin timp și deci neavând decât niște baze /jaloane impuse , dar
care pot fi dezvoltate în timp, rezultând apoi o aplicație care are perspectiv a buna de monetizare . Tes tele
sunt pentru moment doar c ele considerate ca fiind de bază în acest domeniu. În acest segment al aplicației
se pot adăuga cu ușurință și alte teste și rezultate ale unor cercetă ri de specialitate .

Obiectivele de viitor ar fi pe de -o parte continuarea dezvoltării aplicaț iei prin adăugarea mai
multor teste, pe de alta uniformizarea testelor – unele fi ind ceva mai simple iar altele mai grele – fără a
lăsa utilizatorului drep tul de a decide schimbarea acestor a . D ificultatea testelor din aplicație joac ă un rol
important, atât î n ce privește stimularea utilizatorului cât și în determinarea acestuia de a -și folosi
concetrarea la un nivel de perfor manță ridicat. Nu în ultimul rând și la o evaluarea corectă a propriei
persoane .

Aplicația „Bullseye” pe lângă testarea utilizatorului ș i încadrarea acestuia î n anumit e categorii ,
oferă infomaț ii valoroase în domeniul unde este deficitar r espectivul participant la test. De asemenea
realizează pentru fiecare test î n parte , o repartizare pe categorii de afecțiuni și crează o imagine de
ansamblu utilizatorului , despre caracteristicile deficiențelor constatate . Toate a ceasta pentru ca
utilizatorul analizându -se, să -și dea seama singur dacă într -adevar suferă de o anumită boală sau doar o
slăbir e prin suprasolicitare a analizatorului viz ual. Testele durează în jur de 5 -10 minute în funcț ie de
timpul și viteza de reacț ie a utilizatorului. Scopul aplicației este de a înlocui testele de slabă calitate sau
de o acurateț e sub standarde, dar și pentru a fi un îndrumă tor pentru utilizator în ce privește pașii de

63
urmat. Fie spre un consult medical de speciali tate, fie spre abandonarea unui stil de viață nesănă tos, cauză
a unei funcționalităț i deficitare a ochilor. Remediul ar fi munca asiduă cu sine însuși a omului și cu
obiceiurile sale, motivat fiind de dorinț a de a nu -și slăbi acea minune și dar al naturii, ochiul, cu care nici
cel mai performant aparat foto grafic nu se poate vreodată compara .

64
5. Bibliografie
[1] https://www.webdesignerpad.com/2018/02/the -future -of-the-c-programming -language.html
[2] https://www.educba.com/c -sharp -vs-net/
[3] https://lifehacker.com/what -is-the-net-framework -and-why-do-i-need-it-5791578
[4] https://docs.microsoft.com/en -us/nuget/what -is-nuget
[5] https://www.homeandlearn.co.uk/csharp/csharp_s1p5.html
[6] https://www.quora.com/Are -MSSQL -and-MySQL -different
[7] https://en.ryte.com/wiki/Crawler
[8] http://ecomputernotes.com/csharp/dotnet/dot -net
[9] https://www.geeksforgeeks.org/introduction -to-net-framework/
[10] https://academy.vertabelo.com/blog/microsoft -sql-server -pros-and-cons/

Similar Posts