tutoriale vba

554

Click here to load reader

Transcript of tutoriale vba

Page 1: tutoriale vba

Solutions and tutorials for IT&C development

Home Posts list

About

« Crearea unei solutii VB.NET cu ajutorul mediului de dezvoltare Visual Studio 2008Tipurile de date asociate variabilelor definite in VB.NET »

Definirea si referirea unei variabile VB.NET

5 comments - This post in english

O variabila corespunde unei locatii de memorie, care stocheaza valori la momentul efectuarii de calcule.Variabilele sunt utilizate in calcule, comparatii. Ele au o denumire stabilita in program sursa, iar accesarea valorii stocate in locatia de memorie se realizeaza prin denumirea variabilei.

In VB.NET, o variabila are asociat un tip de date [...], fara a fi obligatorie asocierea la momentul definirii. In acest ultim caz, tipul de date asociat variabilei se deduce din valoarea de initializare.

Stocarea unei valori in locatia de memorie aferenta unei variabile se realizeaza prin includerea variabilei in operatii de atribuire.

Categorii de variabile:

membre: definite in module, clase, structuri; locale: definite in subrutine.

Definirea variabilelor VB.NET se realizeaza cu ajutorul clauzei Dim. Asocierea unui tip de date se efectueaza cu clauza As.

Dim a As Integer = 10Dim b = 15Dim d, e As Boolean, f, g As Long

In exemplul anterior, variabilele a, d, e, f si g sunt definite avand asociate tipuri de date. Variabila b nu are asociat explicit tipul de date, acesta fiind stabilit Integer prin initializarea cu valoarea 15.

Definirea si referirea mai multor locatii de memorie folosind o singura variabila se realizeaza prin masive. Referirea unei valori dintr-un masiv se realizeaza printr-un index.

O variabila masiv are asociat un numar de dimensiuni. Dimensiunile reprezinta “directiile” in care se completeaza valorile. Capacitatea de stocare a unui masiv in VB.NET se determina ca

Page 2: tutoriale vba

produs al lungimilor dimensiunilor incrementate cu valoarea 1, fiind exprimata in numar de elemente.

Definirea variabilelor de tip masiv si referirea elementelor acestora se realizeaza astfel:

Dim vector(10) As Integera = b + vector(0)Dim mat(10,10) As Doublea = a + mat(0,0)

In exemplul anterior, capacitatea de stocare a masivului unidimensional vector este de 11 elemente, respectiv 121 elemente (11 linii x 11 coloane) pentru masivul bidimensional mat. Fiecare element din cele 11 ale masivului vector este de tip Integer, iar pentru fiecare element din masivul mat se asociaza tipul de date Double.

Expresia vector(0) extrage valoarea primului element din masivul vector, iar expresia mat(0,0) refera valoarea elementului pozitionat pe linia 1, coloana 1 din masivul mat.

Clauza Dim pentru definirea unei variabile in VB.NET poate fi precedata de un modificator de acces pentru a stabili nivelul de acces din codul sursa la variabila definita. Modificatori de acces si semnificatiile acestora sunt:

Public: acces asigurat, fiind accesibila de catre orice cod sursa; Protected: acces restrictionat codului sursa dezvoltat in afara clasei de obiecte [...] sau

a claselor derivate din aceasta si in care s-a definit variabila membra;

Friend: acces asigurat codului sursa dezvoltat in aceeasi entitate structurala a programului;

Protected Friend: uniune modificatori Protected si Friend;

Private: acces asigurat doar codului sursa inclus in tipul de date definit.

Alte elemente optionale de definire a unei variabile:

Shared: elementul definit (variabila) este asociata unei clase sau structuri, nu unei instante;

Shadows: elementul definit (variabila) redeclara sau ascunde un element sau o multime de elemente supraincarcate;

Static: variabile definite local isi continua existenta dupa terminarea subrutinei in care a fost definita, inclusiv valoarea sau valorile asociate acesteia;

ReadOnly: elementul definit (variabila) poate fi doar citit, nu si scris;

WithEvents: specific variabilelor obiect definite pe baza claselor de obiecte care trateaza evenimente [...]; se precizeaza inainte de denumirea variabilei obiect sau a listei de variabile obiect.

Solutions and tutorials for IT&C development

Page 3: tutoriale vba

Home Posts list

About

« Definirea si referirea unei variabile VB.NETConectare Windows Mobile Emulator la reteaua calculatorului (Windows XP , Vista si 7) »

Tipurile de date asociate variabilelor definite in VB.NET

No comments - This post in english

Tipurile de date asociate variabilelor stabilesc natura datelor stocate si dimensiunea zonelor de memorie utilizate pentru stocarea datelor.

In limbajul VB.NET, dezvoltatorul are la dispozitie urmatoarele tipuri de date:

Boolean: valori True/False; dimensiunea zonei de memorie variaza in functie de platforma de implementare;

Byte: valori intregi fara semn; o variabila de tip Byte refera o zona de memorie cu lungime de 1 byte;

Char: valori intregi fara semn asociate unui simbol; lungimea zonei de memorie este de 2 bytes;

Date: valori de tip data calendaristica si timp orar; lungimea zonei de memorie rezervata este de 8 bytes;

Decimal: valori reale cu semn; lungimea zonei de memorie este de 16 bytes;

Double: valori reale cu semn reprezentate in virgula mobila, dubla precizie; dimensiunea zonei de memorie alocata este de 8 bytes;

Integer: valori intregi cu semn; lungimea zonei de memorie este de 4 bytes;

Long: valori intregi cu semn; lungimea zonei de memorie este de 8 bytes;

Object: valori de tip adresa ce refera obiecte – tipuri referinta: string, masiv, clasa de obiecte, interfata; lungimea zonei de memorie rezervata este de 4 bytes (platforma pe 32 biti) sau 8 bytes (platforma pe 64 de biti);

SByte: valori intregi cu semn; dimensiunea zonei de memorie este de 1 byte;

Short: valori intregi cu semn; lungimea zonei de memorie este de 2 bytes;

Single: valori reale cu semn reprezentate in virgula mobila, simpla precizie; dimensiunea zonei de memorie este de 4 bytes;

String: multime de valori intregi fara semn asociate simbolurilor Unicode; fiecare simbol Unicode ocupa o zona de memorie de 2 bytes;

Page 4: tutoriale vba

UInteger: valori intregi fara semn; lungimea zonei de memorie este de 4 bytes;

ULong: valori intregi fara semn; dimensiunea zonei de memorie este de 8 bytes;

User-Defined: valori definite de catre dezvoltator; lungimea zonei de memorie depinde de membrii definiti in structura User-Defined;

UShort: valori intregi fara semn; dimensiunea zonei de memorie rezervata este de 2 bytes.

Variabilele declarate fara tip de date au asociat implicit tipul Object. Avantajul acestei tehnici consta in scrierea mai rapida a codului sursa. Dezavantajul consta in posibilitatea de executie mai lenta a aplicatiei.

Solutions and tutorials for IT&C development

Home Posts list

About

« Conectare Windows Mobile Emulator la reteaua calculatorului (Windows XP , Vista si 7)Caracteristici ale evenimentelor in VB.NET »

Definirea unei clase de obiecte VB.NET

9 comments - This post in english

Clasa de obiecte este o reprezentare abstracta a unei entitati. Obiectul reprezinta o manifestare concreta a unei clase. Obiectul este structura care contine date si metode de manipulare a datelor.Un obiect contine date prin intermediul campurilor si proprietatilor:

  campul: stocheaza date si este similar unei variabile; proprietatea: extrage si modifica valoarea unui camp prin proceduri Get si Set; astfel,

datele sunt izolate, iar valorile din campuri sunt validate.

Un obiect contine si metode prin care sunt implementate actiuni. Metodele unui obiect iau forma procedurilor.O actiune recunoscuta de de un obiect poarta denumirea de eveniment [...].O clasa de obiecte poate implementa interfete in toate aspectele definite in acestea. Interfata reprezinta o colectie de elemente de programare si nu contine partea de implementare.Tipuri de clase de obiecte in functie de sursa definirii:

incluse in VB.NET; construite in alte aplicatii;

Page 5: tutoriale vba

construite sau modificate de catre dezvoltator in cadrul aplicatiei.

Clasa de obiecte se comporta ca un tip de date, iar utilizatorul poate defini variabile de acest tip. Variabilele se numesc obiecte, continand date si actiuni.

Ca exemplu, se considera clasa de obiecte Task, avand urmatoarele campuri:

cDenTask: denumire task; cTipTask: categorie task;

cResTask: nume responsabil task;

cPrioTask: categorie prioritate task.

Campurile cDenTask, cTipTask si cResTask sunt definite cu tipul String, iar campul cPrioTask este de tip Boolean.

Toate campurile sunt definite cu modificatorul de acces Private [...], ceea ce inseamna ca accesul este restrictionat la codul sursa dezvoltat in cadrul clasei. Accesarea si modificarea valorilor campurilor sunt realizate prin proprietatile DenTask, TipTask, ResTask si PrioTask.

Public Class Task       'Campuri    Private cDenTask As String    Private cTipTask As String    Private cResTask As String    Private cPrioTask As Boolean    'Proprietati clasa Task

'proprietate camp cDenTask    Public Property DenTask()        Get            Return cDenTask        End Get        Set(ByVal value)            cDenTask = value        End Set    End Property    'proprietate camp cTipTask    Public Property TipTask()        Get            Return cTipTask        End Get        Set(ByVal value)            cTipTask = value        End Set    End Property     'proprietatea camp cResTask    Public Property ResTask()        Get            Return cResTask        End Get        Set(ByVal value)            cResTask = value

Page 6: tutoriale vba

        End Set    End Property     'proprietate camp cPrioTask    Public Property PrioTask()        Get            Return cPrioTask        End Get        Set(ByVal value)            cPrioTask = value        End Set    End Property     'metoda clasa de obiecte Task    Public Function ModificaPrioritate(ByVal prioNou As Boolean) As String        cPrioTask = prioNou        Dim res As String        res = "A fost modificata prioritatea task-ului pe valoarea " &_cPrioTask & " !"        Return res    End Function     ' exemplu de constructor fara parametri    Public Sub New()        cDenTask = "Task Nou"        cTipTask = "Tip Task Nou"        cResTask = "Responsabil Task Nou"        cPrioTask = False    End Sub     'supraincarcare constructor - varianta constructor cu parametri    Public Sub New(ByVal denT As String, ByVal tipT As String, _ByVal resT As String, ByVal prioT As Boolean)        cDenTask = denT        cTipTask = tipT        cResTask = resT        cPrioTask = prioT    End SubEnd Class

Pe langa campuri si proprietati, clasa de obiecte Task definita mai sus contine o metoda denumita ModificaPrioritate construita ca o procedura de tip Function si doua metode constructor supraincarcate.

Metoda constructor este una speciala, fiind implementata prin procedura Sub New. Codul din metoda constructor se executa inaintea restului de cod definit in clasa de obiecte. Metoda constructor este apelata la crearea obiectului.

Cand nu mai sunt utilizate, obiectele sunt distruse prin sistemul reference-tracing garbage collection. Distrugerea obiectelor se face pe baza metodei speciale denumita destructor si implementata prin procedura Sub Finalize. Spre deosebire de metoda constructor, destructorul nu trebuie apelat explicit, sistemul ocupandu-se de apelarea automata a destructorului.

Caracteristici ale evenimentelor in VB.NET

4 comments - This post in english

Page 7: tutoriale vba

Evenimentul reprezinta un mesaj transmis de catre un obiect si care anunta aplicatia de producerea unui fapt.Evenimentele sunt implementate folosind delegati [...].

De exemplu, apasarea unui buton de comanda intr-o interfata grafica provoaca aparitia evenimentului Click. Evenimentul este tratat prin intermediul unei proceduri.Evenimentele sunt declarate in cadrul claselor, structurilor, modulelor si interfetelor utilizand cuvantul rezervat Event.

Event Eveniment(ByVal IDArg As Integer)

Transmiterea mesajului asociat unui eveniment este denumita raising, realizandu-se in cadrul clasei, modulului sau a structurii. O clasa de obiecte derivata nu poate provoca transmiterea evenimentelor mostenite din clasa de baza. Specificatia utilizata pentru transmiterea mesajului este RaiseEvent.

RaiseEvent Eveniment(IDArg)

Un obiect capabil sa provoace transmiterea unui mesaj de eveniment poarta denumirea de sursa a evenimentului sau emitator de eveniment. Exemple de obiecte sursa de evenimente sunt obiectele definite de utilizator, controalele si formularele.Aparitia unui eveniment are asociata o procedura denumita handler de eveniment. Inainte ca un handler de eveniment sa poata fi utilizat, trebuie sa se realizeze o asociere intre eveniment si handler-ul de eveniment. Acest lucru se realizeaza cu ajutorul specificatiilor Handles sau AddHandler.Handler-ii de evenimente sunt declarati cu ajutorul specificatiilor WithEvents si Handles. Evenimentele provocate de un obiect prin WithEvents pot fi manipulate cu orice subrutina cu specificatia Handles care precizeaza evenimentul. Asocierea eveniment-handler prin specificatia Handles este limitata prin realizarea asocierii la momentul compilarii.O variabila definita cu specificatia WithEvents nu poate fi utilizata ca o variabila Object, specificandu-se denumirea clasei la momentului definirii.

Dim WithEvents ObEveniment As New ClsEveniment

ObEveniment este variabila declarata cu specificatia WithEvents, iar clasa de obiecte ClsEveniment contine declaratii de evenimente si proceduri de transmitere a mesajelor asociate evenimentelor.Declararea unui handler de eveniment utilizeaza specificatia Handles, asociindu-se cu evenimente declarate in ClsEveniment.

Sub ObEveniment_HandlerEveniment() Handles ObEveniment.UnEveniment

Evenimentul UnEveniment este declarat in clasa ClsEveniment.Specificatiile AddHandler si RemoveHandler sunt mai flexibile decat clauza Handles. Este permisa conectarea si deconectarea dinamica a evenimentelor cu unul sau mai multi handler-i la momentul executiei aplicatiei. Variabilele obiect nu mai trebuie declarate cu specificatia WithEvents.AddHandler are doua argumente: denumirea unui eveniment dintr-o sursa de evenimente si o expresie evaluata la delegat.

AddHandler ObEveniment.EvenimentDoi, AddressOf Me.HandlerEveniment

Page 8: tutoriale vba

RemoveHandler deconecteaza un eveniment de la un handler de eveniment si utilizeaza aceeasi sintaxa ca AddHandler.

RemoveHandler ObEveniment.EvenimentDoi, AddressOf Me.HandlerEveniment

Specificatia AddressOf returneaza adresa delegatului.

Definirea delegatilor in VB.NET

2 comments - This post in english

Delegatul este un pointer care permite apelul unei functii in mod indirect prin intermediul adresei de memorie a acesteia. Delegatul este utilizat pentru a apela metode ale altor obiecte. Este similar pointerului de functie utilizat in alte limbaje de programare. Diferenta consta in faptul ca delegatul este un tip referinta pe baza clasei System.Delegate.Delegatii sunt folositori in situatiile in care aparitia unui eveniment determina apelul de handler-i de eveniment diferiti, in functie de contextul aparitiei evenimentului. Acest lucru impune asocierea dinamica a evenimentelor cu handler-ii de evenimente, fiind utilizati delegatii in acest scop.

Declararea unui eveniment cu specificatia Event determina definirea unei clase delegat implicita denumita EventHandler in interiorul clasei in care este definit evenimentul.Specificatia AddressOf creeaza o instanta de delegat implicita.

AddHandler ObEveniment.UnEveniment, _New EventHandler(AddressOf ObEveniment_HandlerEveniment)

Un eveniment poate fi declarat utilizand un tip de delegat creat anterior.

Delegat Sub TipDelegat()Event EvenimentDoi As TipDelegat

Acest lucru permite asocierea mai multor evenimente cu acelasi handler de eveniment.Delegatii mai pot fi utilizati pentru apelul de diverse versiuni de subrutine, in functie de contextul executiei aplicatiei.Invocarea metodei delegat presupune:

crearea delegatului; declararea clasei care contine metoda cu aceeasi semnatura cu delegatul (lista de

parametri);

crearea instantei delegat si invocarea metodei asociata cu delegatul prin apelul metodei standard Invoke.

Exemplul de mai jos evidentiaza mecanisme de definire si utilizare a delegatilor. Tipul de aplicatie selectat la definirea proiectului este Console Application.

'crearea unui delegat    Delegate Sub DelOpAritmetica(ByVal x As Integer, ByVal y As Integer)     'crearea primei clase de obiecte care contine 'o metoda cu aceeasi semnatura ca a delegatului

Page 9: tutoriale vba

    Class GrupOp1         Sub OpDiferenta(ByVal a As Integer, ByVal b As Integer)            Dim dif As Integer            dif = a - b            MsgBox("Diferenta este: " & CStr(dif))        End Sub     End Class     'crearea celei de a doua clase de obiecte care contine 'o metoda cu aceeasi semnatura ca a delegatului    Class GrupOp2         Sub OpInmultire(ByVal a As Integer, ByVal b As Integer)            Dim prod As Integer            prod = a * b            MsgBox("Inmultirea este: " & CStr(prod))        End Sub     End Class     Sub Main()         'definirea unei variabile obiect de tipul GrupOp1        Dim op1 As New GrupOp1        'definirea unei variabile obiect de tipul GrupOp2        Dim op2 As New GrupOp2         'crearea unei instante a delegatului        Dim del As DelOpAritmetica         'initiliazarea instantei delegatului cu adresa 'metodei OpDiferenta definita in clasa GrupOp1        del = AddressOf op1.OpDiferenta        'invocarea metodei OpDiferenta prin delegat        del.Invoke(10, 3)         'initializarea instantei delegatului cu adresa 'metodei OpInmultire definita in clasa GrupOp2        del = AddressOf op2.OpInmultire        'invocarea metodei OpInmultire prin delegat        del.Invoke(9, 3)     End Sub

Definirea si referirea unei variabile VB.NET

5 comments - This post in english

O variabila corespunde unei locatii de memorie, care stocheaza valori la momentul efectuarii de calcule.Variabilele sunt utilizate in calcule, comparatii. Ele au o denumire stabilita in program sursa, iar accesarea valorii stocate in locatia de memorie se realizeaza prin denumirea variabilei.

In VB.NET, o variabila are asociat un tip de date [...], fara a fi obligatorie asocierea la

Page 10: tutoriale vba

momentul definirii. In acest ultim caz, tipul de date asociat variabilei se deduce din valoarea de initializare.

Stocarea unei valori in locatia de memorie aferenta unei variabile se realizeaza prin includerea variabilei in operatii de atribuire.

Categorii de variabile:

membre: definite in module, clase, structuri; locale: definite in subrutine.

Definirea variabilelor VB.NET se realizeaza cu ajutorul clauzei Dim. Asocierea unui tip de date se efectueaza cu clauza As.

Dim a As Integer = 10Dim b = 15Dim d, e As Boolean, f, g As Long

In exemplul anterior, variabilele a, d, e, f si g sunt definite avand asociate tipuri de date. Variabila b nu are asociat explicit tipul de date, acesta fiind stabilit Integer prin initializarea cu valoarea 15.

Definirea si referirea mai multor locatii de memorie folosind o singura variabila se realizeaza prin masive. Referirea unei valori dintr-un masiv se realizeaza printr-un index.

O variabila masiv are asociat un numar de dimensiuni. Dimensiunile reprezinta “directiile” in care se completeaza valorile. Capacitatea de stocare a unui masiv in VB.NET se determina ca produs al lungimilor dimensiunilor incrementate cu valoarea 1, fiind exprimata in numar de elemente.

Definirea variabilelor de tip masiv si referirea elementelor acestora se realizeaza astfel:

Dim vector(10) As Integera = b + vector(0)Dim mat(10,10) As Doublea = a + mat(0,0)

In exemplul anterior, capacitatea de stocare a masivului unidimensional vector este de 11 elemente, respectiv 121 elemente (11 linii x 11 coloane) pentru masivul bidimensional mat. Fiecare element din cele 11 ale masivului vector este de tip Integer, iar pentru fiecare element din masivul mat se asociaza tipul de date Double.

Expresia vector(0) extrage valoarea primului element din masivul vector, iar expresia mat(0,0) refera valoarea elementului pozitionat pe linia 1, coloana 1 din masivul mat.

Clauza Dim pentru definirea unei variabile in VB.NET poate fi precedata de un modificator de acces pentru a stabili nivelul de acces din codul sursa la variabila definita. Modificatori de acces si semnificatiile acestora sunt:

Public: acces asigurat, fiind accesibila de catre orice cod sursa;

Page 11: tutoriale vba

Protected: acces restrictionat codului sursa dezvoltat in afara clasei de obiecte [...] sau a claselor derivate din aceasta si in care s-a definit variabila membra;

Friend: acces asigurat codului sursa dezvoltat in aceeasi entitate structurala a programului;

Protected Friend: uniune modificatori Protected si Friend;

Private: acces asigurat doar codului sursa inclus in tipul de date definit.

Alte elemente optionale de definire a unei variabile:

Shared: elementul definit (variabila) este asociata unei clase sau structuri, nu unei instante;

Shadows: elementul definit (variabila) redeclara sau ascunde un element sau o multime de elemente supraincarcate;

Static: variabile definite local isi continua existenta dupa terminarea subrutinei in care a fost definita, inclusiv valoarea sau valorile asociate acesteia;

ReadOnly: elementul definit (variabila) poate fi doar citit, nu si scris;

WithEvents: specific variabilelor obiect definite pe baza claselor de obiecte care trateaza evenimente [...]; se precizeaza inainte de denumirea variabilei obiect sau a listei de variabile obiect.

Solutions and tutorials for IT&C development

Home Posts list

About

« Definirea si referirea unei variabile VB.NETConectare Windows Mobile Emulator la reteaua calculatorului (Windows XP , Vista si 7) »

Tipurile de date asociate variabilelor definite in VB.NET

No comments - This post in english

Tipurile de date asociate variabilelor stabilesc natura datelor stocate si dimensiunea zonelor de memorie utilizate pentru stocarea datelor.

In limbajul VB.NET, dezvoltatorul are la dispozitie urmatoarele tipuri de date:

Boolean: valori True/False; dimensiunea zonei de memorie variaza in functie de platforma de implementare;

Byte: valori intregi fara semn; o variabila de tip Byte refera o zona de memorie cu lungime de 1 byte;

Page 12: tutoriale vba

Char: valori intregi fara semn asociate unui simbol; lungimea zonei de memorie este de 2 bytes;

Date: valori de tip data calendaristica si timp orar; lungimea zonei de memorie rezervata este de 8 bytes;

Decimal: valori reale cu semn; lungimea zonei de memorie este de 16 bytes;

Double: valori reale cu semn reprezentate in virgula mobila, dubla precizie; dimensiunea zonei de memorie alocata este de 8 bytes;

Integer: valori intregi cu semn; lungimea zonei de memorie este de 4 bytes;

Long: valori intregi cu semn; lungimea zonei de memorie este de 8 bytes;

Object: valori de tip adresa ce refera obiecte – tipuri referinta: string, masiv, clasa de obiecte, interfata; lungimea zonei de memorie rezervata este de 4 bytes (platforma pe 32 biti) sau 8 bytes (platforma pe 64 de biti);

SByte: valori intregi cu semn; dimensiunea zonei de memorie este de 1 byte;

Short: valori intregi cu semn; lungimea zonei de memorie este de 2 bytes;

Single: valori reale cu semn reprezentate in virgula mobila, simpla precizie; dimensiunea zonei de memorie este de 4 bytes;

String: multime de valori intregi fara semn asociate simbolurilor Unicode; fiecare simbol Unicode ocupa o zona de memorie de 2 bytes;

UInteger: valori intregi fara semn; lungimea zonei de memorie este de 4 bytes;

ULong: valori intregi fara semn; dimensiunea zonei de memorie este de 8 bytes;

User-Defined: valori definite de catre dezvoltator; lungimea zonei de memorie depinde de membrii definiti in structura User-Defined;

UShort: valori intregi fara semn; dimensiunea zonei de memorie rezervata este de 2 bytes.

Variabilele declarate fara tip de date au asociat implicit tipul Object. Avantajul acestei tehnici consta in scrierea mai rapida a codului sursa. Dezavantajul consta in posibilitatea de executie mai lenta a aplicatiei.

Caracteristici ale evenimentelor in VB.NET

4 comments - This post in english

Evenimentul reprezinta un mesaj transmis de catre un obiect si care anunta aplicatia de producerea unui fapt.Evenimentele sunt implementate folosind delegati [...].

De exemplu, apasarea unui buton de comanda intr-o interfata grafica provoaca aparitia evenimentului Click. Evenimentul este tratat prin intermediul unei proceduri.Evenimentele sunt declarate in cadrul claselor, structurilor, modulelor si interfetelor utilizand cuvantul rezervat Event.

Page 13: tutoriale vba

Event Eveniment(ByVal IDArg As Integer)

Transmiterea mesajului asociat unui eveniment este denumita raising, realizandu-se in cadrul clasei, modulului sau a structurii. O clasa de obiecte derivata nu poate provoca transmiterea evenimentelor mostenite din clasa de baza. Specificatia utilizata pentru transmiterea mesajului este RaiseEvent.

RaiseEvent Eveniment(IDArg)

Un obiect capabil sa provoace transmiterea unui mesaj de eveniment poarta denumirea de sursa a evenimentului sau emitator de eveniment. Exemple de obiecte sursa de evenimente sunt obiectele definite de utilizator, controalele si formularele.Aparitia unui eveniment are asociata o procedura denumita handler de eveniment. Inainte ca un handler de eveniment sa poata fi utilizat, trebuie sa se realizeze o asociere intre eveniment si handler-ul de eveniment. Acest lucru se realizeaza cu ajutorul specificatiilor Handles sau AddHandler.Handler-ii de evenimente sunt declarati cu ajutorul specificatiilor WithEvents si Handles. Evenimentele provocate de un obiect prin WithEvents pot fi manipulate cu orice subrutina cu specificatia Handles care precizeaza evenimentul. Asocierea eveniment-handler prin specificatia Handles este limitata prin realizarea asocierii la momentul compilarii.O variabila definita cu specificatia WithEvents nu poate fi utilizata ca o variabila Object, specificandu-se denumirea clasei la momentului definirii.

Dim WithEvents ObEveniment As New ClsEveniment

ObEveniment este variabila declarata cu specificatia WithEvents, iar clasa de obiecte ClsEveniment contine declaratii de evenimente si proceduri de transmitere a mesajelor asociate evenimentelor.Declararea unui handler de eveniment utilizeaza specificatia Handles, asociindu-se cu evenimente declarate in ClsEveniment.

Sub ObEveniment_HandlerEveniment() Handles ObEveniment.UnEveniment

Evenimentul UnEveniment este declarat in clasa ClsEveniment.Specificatiile AddHandler si RemoveHandler sunt mai flexibile decat clauza Handles. Este permisa conectarea si deconectarea dinamica a evenimentelor cu unul sau mai multi handler-i la momentul executiei aplicatiei. Variabilele obiect nu mai trebuie declarate cu specificatia WithEvents.AddHandler are doua argumente: denumirea unui eveniment dintr-o sursa de evenimente si o expresie evaluata la delegat.

AddHandler ObEveniment.EvenimentDoi, AddressOf Me.HandlerEveniment

RemoveHandler deconecteaza un eveniment de la un handler de eveniment si utilizeaza aceeasi sintaxa ca AddHandler.

RemoveHandler ObEveniment.EvenimentDoi, AddressOf Me.HandlerEveniment

Specificatia AddressOf returneaza adresa delegatului.

Definirea si referirea unei variabile VB.NET

Page 14: tutoriale vba

5 comments - This post in english

O variabila corespunde unei locatii de memorie, care stocheaza valori la momentul efectuarii de calcule.Variabilele sunt utilizate in calcule, comparatii. Ele au o denumire stabilita in program sursa, iar accesarea valorii stocate in locatia de memorie se realizeaza prin denumirea variabilei.

In VB.NET, o variabila are asociat un tip de date [...], fara a fi obligatorie asocierea la momentul definirii. In acest ultim caz, tipul de date asociat variabilei se deduce din valoarea de initializare.

Stocarea unei valori in locatia de memorie aferenta unei variabile se realizeaza prin includerea variabilei in operatii de atribuire.

Categorii de variabile:

membre: definite in module, clase, structuri; locale: definite in subrutine.

Definirea variabilelor VB.NET se realizeaza cu ajutorul clauzei Dim. Asocierea unui tip de date se efectueaza cu clauza As.

Dim a As Integer = 10Dim b = 15Dim d, e As Boolean, f, g As Long

In exemplul anterior, variabilele a, d, e, f si g sunt definite avand asociate tipuri de date. Variabila b nu are asociat explicit tipul de date, acesta fiind stabilit Integer prin initializarea cu valoarea 15.

Definirea si referirea mai multor locatii de memorie folosind o singura variabila se realizeaza prin masive. Referirea unei valori dintr-un masiv se realizeaza printr-un index.

O variabila masiv are asociat un numar de dimensiuni. Dimensiunile reprezinta “directiile” in care se completeaza valorile. Capacitatea de stocare a unui masiv in VB.NET se determina ca produs al lungimilor dimensiunilor incrementate cu valoarea 1, fiind exprimata in numar de elemente.

Definirea variabilelor de tip masiv si referirea elementelor acestora se realizeaza astfel:

Dim vector(10) As Integera = b + vector(0)Dim mat(10,10) As Doublea = a + mat(0,0)

In exemplul anterior, capacitatea de stocare a masivului unidimensional vector este de 11 elemente, respectiv 121 elemente (11 linii x 11 coloane) pentru masivul bidimensional mat. Fiecare element din cele 11 ale masivului vector este de tip Integer, iar pentru fiecare element din masivul mat se asociaza tipul de date Double.

Page 15: tutoriale vba

Expresia vector(0) extrage valoarea primului element din masivul vector, iar expresia mat(0,0) refera valoarea elementului pozitionat pe linia 1, coloana 1 din masivul mat.

Clauza Dim pentru definirea unei variabile in VB.NET poate fi precedata de un modificator de acces pentru a stabili nivelul de acces din codul sursa la variabila definita. Modificatori de acces si semnificatiile acestora sunt:

Public: acces asigurat, fiind accesibila de catre orice cod sursa; Protected: acces restrictionat codului sursa dezvoltat in afara clasei de obiecte [...] sau

a claselor derivate din aceasta si in care s-a definit variabila membra;

Friend: acces asigurat codului sursa dezvoltat in aceeasi entitate structurala a programului;

Protected Friend: uniune modificatori Protected si Friend;

Private: acces asigurat doar codului sursa inclus in tipul de date definit.

Alte elemente optionale de definire a unei variabile:

Shared: elementul definit (variabila) este asociata unei clase sau structuri, nu unei instante;

Shadows: elementul definit (variabila) redeclara sau ascunde un element sau o multime de elemente supraincarcate;

Static: variabile definite local isi continua existenta dupa terminarea subrutinei in care a fost definita, inclusiv valoarea sau valorile asociate acesteia;

ReadOnly: elementul definit (variabila) poate fi doar citit, nu si scris;

WithEvents: specific variabilelor obiect definite pe baza claselor de obiecte care trateaza evenimente [...]; se precizeaza inainte de denumirea variabilei obiect sau a listei de variabile obiect.

BAZELE PROGRAMĂRII Visual Basic for Application (VBA)

Tipuri de date

Variabilele şi constantele utilizate într-un program VBA pot avea diverse tipuri, specifice datelor memorate. Spre deosebire de alte limbaje de programare, există un tip universal — tipul Variant —, care poate conţine aproape orice alt tip de date. Acest tip este asignat în mod implicit tuturor variabilelor nedeclarate altfel, încât declararea explicită poate fi utilizată atunci când se doreşte economisirea memoriei (tipul Variant alocă mai multă memorie), viteză în execuţie sau atunci când se scriu date într-un fişier în acces direct.

Boolean

Domeniu de valori: True sau False (valorile logice)

Page 16: tutoriale vba

Memorie: 2 bytes

Declarator de tip:

Observaţii. Convertirea valorilor numerice la tipul Boolean: 0 produce False, valorile nenule produc True.Convertirea valorilor de tip Boolean la alte tipuri numerice: False devine 0, True devine -1.

Byte

Domeniu de valori: 0–255 (numere întregi, fără semn)

Memorie: 1 byte

Declarator de tip:

Observaţii.

Currency

Domeniu de valori: -922 337 203 685 477.5808 — 922 337 203 685 477.5807

Memorie: 8 bytes

Declarator de tip: @

Observaţii. Utilizate pentru calcule băneşti (sau alte situaţii în care precizia este foarte importantă). Valorile sunt memorate în format întreg, scalate prin 10 000, pentru a obţine 15 cifre la partea întreagă şi 4 cifre la partea zecimală (reprezentare în virgulă fixă).

Date

Domeniu de valori: 1 ianuarie 100 — 31 decembrie 9999, 0:00:00 — 23:59:59

Memorie: 8 bytes

Declarator de tip:

Observaţii. Informaţiile de tip dată calendaristică şi/sau timp orar sunt memorate drept numere flotante, partea întreagă reprezentând data calendaristică, partea fracţionară reprezentând timpul.

La convertiri, miezul nopţii este 0, miezul zilei este .5, numerele negative reprezintă date înainte de 30 decembrie 1899.

Page 17: tutoriale vba

Poate fi atribuit ca valoare de tip date orice literal care reprezintă o dată calendaristică recunoscută ca atare, literalul trebuind să fie cuprins între simboluri #, de exemplu #1 Jan 99#.

Decimal

Domeniu de valori: (vezi observaţiile)

Memorie: 12 bytes

Declarator de tip:

Observaţii. Valorile de tip Decimal sunt memorate ca întregi fără semn însoţiţi de un factor de scală, între 0 şi 28, specificând numărul de zecimale. Pentru scala=0 (fără parte zecimală), cea mai mare valoare posibilă este +/-79,228,162,514,264,337,593,543,950,335. Cu scala=28 cea mai mare valoare este +/-7.9228162514264337593543950335 iar cea mai mică valoare nenulă este +/-0.0000000000000000000000000001.

Notă: Deocamdată, tipul Decimal poate fi utilizat doar ca subtip în Variant, adică nu se pot declara variabile ca fiind de tip Decimal. Acestea pot fi create ca Variant cu subtipul Decimal prin funcţia Cdec (funcţia forţează o expresie să fie de un tip specificat, din aceeaşi categorie de funcţii fiind şi CBool, CByte etc.).

Double

Domeniu de valori: numere negative de la -1.79769313486232E308 până la -4.94065645841247E-324; numere pozitive de la 4.94065645841247E-324 până la 1.79769313486232E308 (numere flotante în dublă precizie).

Memorie: 8 bytes

Declarator de tip: #

Observaţii.

Integer

Domeniu de valori: -32 768 — 32 767.

Memorie: 2 bytes

Declarator de tip: %

Observaţii.

Long

Page 18: tutoriale vba

Domeniu de valori: -2 147 483 648 — 2 147 483 647.

Memorie: 4 bytes

Declarator de tip: &

Observaţii.

Object

Domeniu de valori: (vezi observaţiile)

Memorie: 4 bytes

Declarator de tip:

Observaţii. Adrese pe 32 de biţi care se referă la obiecte. Prin instrucţiunea Set se atribuie unei variabile declarate de tip Object referinţa la obiectul dorit.

Notă. Prin declararea unei variabile de tip Object, referirea la un obiect prin Set produce o ataşare târzie (la timpul execuţiei – run-time binding). Pentru o ataşare timpurie (la timpul compilării – compile-time binding) se va utiliza o variabilă declarată cu numele clasei respective.

Single

Domeniu de valori: numere negative de la -3.402823E38 până la -1.401298E-45; numere pozitive de la 1.401298E-45 până la 3.402823E38.

Memorie: 4 bytes

Declarator de tip: !

Observaţii.

String

Domeniu de valori: şir de lungime variabilă: până la 2^31 caractere; şir de lungime fixă: până la 2^16 caractere.

Memorie: 2 bytes

Declarator de tip: $

Observaţii. Un şir de lungime fixă declarat Public nu poate fi utilizat într-un modul de clasă.

Variant (default)

Page 19: tutoriale vba

Domeniu de valori: aceleaşi cu domeniile specificate la tipurile precedente şi care pot fi subtipuri ale tipului Variant, cu menţiunea că toate subtipurile numerice au domeniul de la Double.

Memorie: în funcţie de subtipul valorii: valorile numerice ocupă 16 bytes, valorile de tip String necesită 22 bytes plus câte un byte pentru fiecare caracter.

Declarator de tip:

Observaţii. Este tipul specificat implicit (în lipsa unei declaraţii explicite) pentru o constantă, variabilă, sau argument (caz care, deşi nerecomandat, poate elimina erorile provocate de diferenţele de tip ale argumentelor la apelul procedurilor).

Cu excepţia datelor de tip String cu lungime fixă şi a datelor cu tipuri definite de utilizator, tipul Variant poate conţine orice alt tip de dată. În plus poate să conţină valorile speciale Empty, Error, Nothing şi Null. Tipul considerat pentru o dată conţinută într-un Variant poate fi determinat cu funcţia VarType sau TypeName.

Valorile unei variabile Variant pot să-şi convertească valorile automat. În general, datele numerice sunt memorate în tipul de origine, dar este posibil ca ele să fie promovate la tipul superior dacă rezultatul unei operaţii necesită acest fapt. De exemplu o valoare declarată iniţial drept Integer şi atribuită unui Variant va fi memorată ca un întreg până când, ridicând-o de exemplu la o putere, valoarea ei excede domeniul tipului Integer. În acest caz are loc promovarea (ca mod de reprezentare) la tipul superior adecvat (Long sau Double). Dacă depăşirea domeniului are loc pentru subtipurile Currency, Decimal sau Double, atunci se va semnala eroare.

Utilizarea tipului Variant permite o tratare mai diferenţiată a şirurilor de cifre: în operaţii numerice vor fi considerate numere iar în operaţii cu şiruri vor fi considerate şiruri.

Accesul la valorile Variant este mai lent decât accesul la valorile definite prin tipuri explicite.

Valorile speciale au semnificaţia:

o Empty este valoarea unui Variant care nu a fost iniţializat. În calcule numerice este considerat 0 iar în operaţii cu şiruri este şirul de lungime zero.

o Null este valoarea unui Variant care, în mod programatic, nu conţine date.

o Error este valoarea utilizată pentru a arăta îndeplinirea unei condiţii de eroare (prin convertirea unui real cu funcţia CVErr). Procesarea se va efectua de către utilizator, tratarea automată a erorilor nu este activată la setarea acestor valori.

o Nothing este utilizată pentru disocierea unei variabile de tip Object de un obiect efectiv.

Page 20: tutoriale vba

Tipuri definite de utilizator

Un tip de dată definit de utilizator reprezintă echivalentul unei înregistrări dintr-un fişier (bază de date), adică o grupare de entităţi de tipuri diferite. Definirea are loc la nivel de modul, prin instrucţiuni Type. Pentru clauzele care apar se va vedea discuţia de la domeniul variabilelor.

[Private | Public] Type varname

elementname [([subscripts])] As type

[elementname [([subscripts])] As type]

. . .

End Type

unde varname este numele dat tipului definit, iar prin elementname se definesc componentele tipului. Se pot utiliza şi componente de tipuri utilizator deja definite. Componentele pot fi şi tablouri, caz în care apar definiţiile specifice (vezi declararea variabilelor).

Declararea constantelor, variabilelor şi tablourilor

Nume

La denumirea procedurilor, constantelor, variabilelor şi argumentelor într-un modul Visual Basic

se cere respectarea următoarelor reguli:

primul caracter trebuie să fie o literă; nu se utilizează spaţiu, punct (.), semnul exclamării(!), sau caracterele @, &, $, #

lungimea denumirii nu poate depăşi 255 de caractere;

la acelaşi nivel de existenţă nu pot să existe denumiri identice. Pot să existe totuşi, în acelaşi modul, o variabilă privată şi o variabilă la nivel de procedură care să poarte acelaşi nume.

În general, nu se recomandă definirea unor denumiri identice cu nume de funcţii, instrucţiuni sau metode existente în Visual Basic. Dacă s-a ajuns totuşi la această situaţie, atunci utilizarea funcţiei intrinseci limbajului, a instrucţiunii sau metodei care intră în conflict cu un nume asignat necesită calificarea ei în raport de biblioteca asociată. De exemplu, VBA.Left este apelul la funcţia Left atunci când este definită de utilizator şi o variabilă Left. Notă. Visual Basic nu este case-sensitive, deci denumirea unei entităţi nu are ca atribut distinctiv capitalizarea literelor, dar mediul de programare VBA păstrează capitalizarea din instrucţiunea unde este definit un nume.

Declararea constantelor

Page 21: tutoriale vba

Definirea unei constante se realizează prin instrucţiunea Const, în care se poate specifica tipul, domeniul şi valoarea constantei. Valoarea unei constante nu se poate schimba programatic.

[Public | Private] Const constname [As type] = expression

Public — cuvânt cheie, opţional, utilizat la nivel de modul pentru a declara constante recunoscute în toate procedurile din toate modulele. Nu este permis în proceduri.

Private — cuvânt cheie, opţional, utilizat la nivel de modul pentru a declara constante recunoscute în toate procedurile din modulul în care apare declaraţia. Nu este permis în proceduri.

constname — numele constantei (obligatoriu).

type — tipul constantei: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (încă nu este suportat), Date, String, sau Variant. Fiecare constantă presupune o clauză As type proprie; în lipsa clauzei se va ataşa automat tipul cel mai apropiat expresiei.

expression — combinaţie de identificatori, constante, operatori (cu excepţia Is) care produce un sir, număr sau obiect. Nu se pot utiliza variabile, funcţii utilizator sau funcţii VBA predefinite.

În mod implicit, constantele sunt private. La nivel de procedură, sau de modul clasă, domeniul lor nu poate fi modificat prin utilizarea clauzei Public. La nivel de modul standard vizibilitatea poate fi modificată prin Public.

Constantele declarate în proceduri Sub, Function sau Property sunt locale procedurii, constantele declarate în afara unei proceduri este definită în modulul respectiv.

Mai multe declaraţii de constante pot fi scrise pe o aceeaşi linie, separate prin virgule la nivel de atribuiri de expresii. În acest caz, cuvintele Public sau Private care apar se aplică întregii linii.

Exemple

Const NrLinii = 15

Public Const MesajInitial = "Tastati numarul de linii"

Private Const NrLinii as Integer = 15

Public Const NrLinii = 15, Pondere as Single = 1.21

Este de remarcat că, în ultima linie, doar Pondere este de tip Single, în timp ce NrLinii este de tip Integer (în lipsa clauzei As type se atribuie tipul expresiei).

Declararea variabilelor

Variabilele, simple sau tablou, se definesc prin instrucţiunile Dim, Private, Public, ReDim sau Static. Numele unei variabile trebuie să respecte regulile generale de formare a

Page 22: tutoriale vba

identificatorilor, tipul variabilei poate fi definit explicit (prin clauza As type) sau implicit (ca Variant).

În cazul în care modulul conţine instrucţiunea Option Explicit cu sintaxa

Option Explicit

şi care trebuie să apară înaintea oricărei proceduri din modul, toate variabilele trebuie să fie declarate prin instrucţiunile menţionate. Lipsa instrucţiunii Option Explicit permite ca variabilele să fie definite acolo unde este nevoie de ele prin simpla menţionare a unui nou identificator, tipul lor fiind stabilit implicit. Această ultimă posibilitate poate produce erori greu detectabile.

Sintaxa instrucţiunilor de declarare a variabilelor este următoarea şi se observă asemănarea clauzelor.

Dim [WithEvents] varname[([subscripts])] [As [New] type]

Private [WithEvents] varname[([subscripts])] [As [New] type]

Public [WithEvents] varname[([subscripts])] [As [New] type]

Static varname[([subscripts])] [As [New] type]

ReDim [Preserve] varname(subscripts) [As type]

varname — numele variabilei (obligatoriu).

subscripts — dimensiunile tabloului de date (dacă se declară o variabilă tablou). Pot exista până la 60 de indici, separaţi prin virgule, declararea dimensiunilor pentru un indice fiind de forma

[lower To] upper

Limita inferioară este, implicit, 0, dar poate fi controlată prin instrucţiunea Option Base.

Dacă nu se indică limitele indicilor (dar parantezele sunt prezente), se defineşte o variabilă tablou dinamică (nu şi prin Static) ale cărei dimensiuni pot fi precizate/redefinite prin instrucţiunea ReDim.

New — permite crearea implicită a unui obiect (atunci când se declară o variabilă de tip obiect). O nouă instanţă a obiectului este creată la prima referinţă a variabilei definite. Clauza nu poate să apară la declararea variabilelor de tipuri intrinseci şi nici la declararea instanţelor obiectelor dependente.

type — tipul variabilei definite: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (nesuportat încă), Date, String (pentru şiruri cu lungime variabilă), String * length (pentru şiruri cu lungime fixă), Object, Variant, tip utilizator sau tip de obiect.

Page 23: tutoriale vba

Dacă se definesc mai multe variabile într-o instrucţiune, definiţiile se separă prin virgulă iar clauza de tip nu este extinsă şi la variabilele definite ulterior.

Deşi toate instrucţiunile permit declararea unor variabile (simple sau tablou), fiecare instrucţiune are un efect distinct în ceea ce priveşte vizibilitatea variabilelor şi persistenţa valorilor.

Dim defineşte variabile atât la nivel de modul cât şi la nivel de procedură. Variabilele definite la nivel de modul sunt accesibile în procedurile acelui modul, iar variabilele de la nivel de procedură sunt vizibile doar în procedura respectivă.

Private este utilizată la nivel de modul pentru a declara variabile accesibile doar în procedurile acelui modul.

Public este utilizată pentru a declara variabile accesibile în toate procedurile din toate modulele şi din toate aplicaţiile. Prin includerea instrucţiunii Option Private Module este posibil ca variabilele publice să fie vizibile doar în proiectul în care sunt definite.

Static este utilizată la nivel de procedură nestatică pentru a declara variabile care îşi păstrează valoarea de la o execuţie a procedurii la alta, atât timp cât modulul în care apare procedura nu este resetat sau repornit. Variabilele definite prin Static sunt vizibile doar în procedura respectivă. Este de remarcat că se poate defini o întreagă procedură utilizând clauza Static (vezi definirea procedurilor), caz în care toate variabilele sunt statice.

ReDim este utilizată la nivel de procedură pentru realocarea memoriei variabilelor tablou dinamice. Utilizarea clauzei Preserve permite doar modificarea ultimei dimensiuni şi păstrează valorile deja existente. (Pentru detalii vezi şi VBA Help).

Exemple

Dim x As Double, ColtStanga As Integer

Private I, J As Long

Static Venit As Currency, NumPren As String

Dim Retineri(5) As Currency

Public indicatori(10) As Byte

Dim matrice(1 To 3, 100 To 200) As String

Public fntScris As Font

Dim appWD As Word.Application

Proceduri

Printr-o procedură se înţelege, similar altor limbaje de programare, o mulţime de instrucţiuni care este identificată printr-un nume şi care se execută unitar printr-un singur apel. Ar trebui, pentru claritatea programului, ca o procedură să efectueze o prelucrare unitară identificabilă în logica programului.

Page 24: tutoriale vba

Există trei tipuri principale de proceduri: Sub, Function şi Property. Ultimul tip este caracteristic definirii unui obiect şi va fi prezentat ulterior. O procedură de tip Sub poate primi şi transmite informaţii prin intermediul unor variabile publice sau/şi a unor parametri. Numele procedurii nu are ataşată nici o valoare. O procedură de tip Function se deosebeşte prin aceea că numele procedurii are ataşată o valoare (valoarea funcţiei) şi poate fi utilizat ca orice altă variabilă din proiect.

Observaţie. Orice instrucţiune executabilă trebuie să aparţină unei proceduri. Declaraţiile pot să apară şi în afara procedurilor, la nivel de modul.

Proceduri Sub

Organizarea generală a unei proceduri de tip Sub este

[Private | Public] [Static] Sub name ([arglist])

[instrucţiuni]

[Exit Sub]

[instrucţiuni]

End Sub

Public, Private, Static — determină vizibilitatea procedurii. Public = vizibilă pentru toate procedurile şi toate modulele (în funcţie de Option Private se defineşte vizibilitatea pentru alte proiecte). Private = vizibilă doar pentru procedurile din modulul unde procedura este declarată. Static = arată că toate variabilele locale îşi păstrează valorile între apeluri.

name — numele procedurii.

arglist — lista de argumente, separate prin virgule.

Prin instrucţiunea Exit Sub se poate ieşi din procedură şi altminteri decât prin linia finală.

Argumentele se definesc după sintaxa:

[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type] [= defaultvalue]

Optional — arată că parametrul nu este obligatoriu. Parametrii opţionali trebuie să fie grupaţi la sfârşitul listei (apariţia clauzei Optional cere ca toţi parametrii care urmează să aibă aceeaşi clauză).

ByVal — arată că apelul paramatrului se face prin valoare (orice modificare a valorii transmise nu este regăsită după părăsirea procedurii, calculele efectuându-se pe o copie a parametrului).

Page 25: tutoriale vba

ByRef — arată că apelul paramatrului se face prin referinţă (orice modificare a valorii transmise este regăsită după părăsirea procedurii). Acesta este modul implicit de transmitere a parametrilor.

ParamArray — folosit doar ca ultim argument în listă, denotă un tablou Optional de elemente de tip Variant. Clauza ParamArray permite definirea unui număr arbitrar de parametri. ParamArray nu poate fi utilizat împreună cu ByVal, ByRef, sau Optional.

varname — numele argumentului. Dacă este tablou se vor indica parantezele.

type — tipul parametrului transmis: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal, Date, String (doar lungime variabilă), Object, Variant. Pentru parametrii obligatorii (fără Optional) poate fi şi un tip definit sau de obiect.

defaultvalue — defineşte valoarea implicită pentru argumentele opţionale. Poate fi orice expresie, dar pentru tipul Object se admite doar Nothing.

Apelul unei proceduri Sub

Pentru a executa o procedură de tip Sub din altă procedură (vezi şi discuţia privind vizibilitatea) se menţionează, pe o linie separată, numele procedurii urmat sau nu de parametri. Dacă este necesar, datorită apelării unui alt proiect sau modul, atunci apelul este după modelul:

Nume_proiect.Nume_modul.Nume_procedură listă de argumente

unde lista de argumente poate sau nu să fie inclusă între paranteze. Argumentele efective sunt separate în listă prin virgule şi trebuie să respecte ordinea (şi tipul) argumentelor din definiţia procedurii. În cazul procedurilor cu multe argumente, dintre care multe opţionale, transferul poate provoca erori de scriere a codului (un argument opţional necesită totuşi virgula sa, de unde o numărare atentă a virgulelor etc.). Pentru asemenea situaţii (în special) se permite şi transferul valorilor prin intermediul tehnicii de argumente denumite. Aceasta se realizează alcătuind lista de argumente, la apelul procedurii, din intrări de forma

nume_argument:=valoare_argument

separate prin virgule şi la care nu mai contează ordinea iniţială a argumentelor. Se vor specifica doar parametrii care se transmit efectiv (adică valorile opţionale dorite şi toate valorile neopţionale).

Pentru apelul unei proceduri se va studia şi instrucţiunea Call.

Proceduri Function

O procedură de tip Function este similară, ca definiţie, unei proceduri Sub, dar are particularitatea că returnează o valoare prin numele său (care se comportă deci ca o variabilă).

[Public | Private] [Static] Function name [(arglist)] [As type]

Page 26: tutoriale vba

[statements]

[name = expression]

[Exit Function]

[statements]

[name = expression]

End Function

Este de remarcat că se poate ataşa un tip numelui funcţiei (adică valorii funcţiei) şi se va remarca existenţa instrucţiunilor prin care se atribuie funcţiei valorile calculate.

Valoarea returnată de o funcţie poate fi utilizată într-o altă expresie prin includerea numelui funcţiei urmat, între paranteze, de valorile efective ale parametrilor.

Dacă apelul se face prin intermediul instrucţiunii Call, valoarea funcţiei nu poate fi utilizată. În asemenea situaţii se activează de fapt doar prelucrările colaterale (care, pentru claritatea codului, nici nu sunt recomandate).

Exemple de proceduri

Public Function AriaCilindru (raza, inaltime) As Double

Const Pi = 3.14159

cilBaza = Pi*raza^2

cilLaterala = 2*Pi*raza*inaltime

AriaCilindru = 2*cilBaza + cilLaterala

End Function

 

Sub AriaCilindru (ByVal raza As Single, ByVal inaltime As Single, _

ByRef cilAria As Double)

Const Pi As Single = 3.14159

Dim cilBaza As Single, cilLaterala As Single

cilBaza = Pi*raza^2

cilLaterala = 2*Pi*raza*inaltime

cilAria = 2*cilBaza + cilLaterala

Page 27: tutoriale vba

End

Apelul funcţiei poate fi într-o instrucţiune de genul

CostTotalPiesa = AriaCilindru (r1, h1) * CostUnitar

în timp ce apelul subrutinei poate fi

AriaCilindru inaltime:=h1, raza:=r1, cilAria:=AriePiesa

Organizarea generală a unui proiect VBA

Obiectele şi prelucrările necesare realizării unei aplicaţii VBA (presupunând că se doreşte atingerea unui ansamblu coerent de scopuri) sunt gestionate sub forma unui proiect, care are un nume implicit sau dat de utilizator. La un anumit moment pot fi deschise mai multe proiecte, identificabile prin denumirile lor.

Deoarece prelucrările proiectate în VBA sunt ataşate documentelor (acţiunilor) unor aplicaţii particulare (Word, Excel etc.), proiectele sunt salvate o dată cu documentele pe care le însoţesc. Acest fapt nu reduce aria de probleme abordabile întrucât prelucrările propriu-zise nu sunt limitate la documentul însoţit (se poate deschide astfel un document Word alb şi să se efectueze orice prelucrare dorită, fără a avea obligaţia de a scrie ceva în documentul deschis).

Într-un proiect VBA sunt identificabile următoarele componente:

Module standard (denumite iniţial module de cod). Conţin declaraţii şi proceduri generale. Există de asemenea şi module care conţin tratarea evenimentelor specifice documentului de care este ataşat proiectul.

Module de clasă. Conţin definirea obiectelor create de utilizator.

Forme. Conţin definiţiile dialogurilor din interfaţa proiectată de utilizator ca şi codul program necesar controlării dialogurilor.

Referinţe. Într-un proiect este menţinută lista altor proiecte, care sunt referite în proiectul curent.

Un modul de cod poate începe cu o secţiune de declaraţii. Prin declaraţii înţelegem instrucţiuni neexecutabile prin care se definesc constante, variabile şi proceduri externe. Utilizând Public, Static, Private se precizează şi domeniul de vizibilitate a entităţilor definite.

Gestionarea (crearea, editarea, ştergerea etc.) obiectelor dintr-un proiect se face prin comenzi ale mediului VBA, care este prezentat într-o secţiune separată.

Domeniul unei variabile, constante sau proceduri

Domeniul unei entităţi reprezintă mulţimea instrucţiunilor unde poate fi referită acea entitate. Se poate vorbi astfel de vizibilitatea unei entităţi. Domeniul este dependent de locul definirii entităţii, de clauzele care apar la definire şi de parametrii globali ai proiectului.

Page 28: tutoriale vba

Notă. Este de remarcat că utilizarea unei denumiri în afara domeniului iniţial prefigurat produce, în lipsa instrucţiunii Option Explicit, crearea unei noi entităţi, fără nici o legătură cu cea precedentă, sursă de erori greu detectabile. Acesta este motivul pentru care se recomandă declararea explicită a tuturor variabilelor.

Există trei tipuri de domenii:

o la nivel de procedură;o la nivel de modul, privat;

o la nivel de modul, public.

Nivelul procedură

O variabilă sau constantă definită într-o procedură este vizibilă doar în procedură respectivă. Dacă o asemenea entitate trebuie referită şi în alte proceduri, atunci declararea ei se va efectua la nivel de modul, sau se va transmite procedurii prin intermediul argumentelor.

Nivel de modul, privat

Variabilele şi constantele definite la nivel de modul (în secţiunea Declarations) sunt Private în mod implicit, adică sunt vizibile doar în modulul respectiv. Utilizarea clauzei Private nu este deci necesară, dar este recomandată.

Notă. Dacă se utilizează instrucţiunea Option Private Module (în secţiunea Declarations a modulului) atunci variabilele şi procedurile publice vor fi vizibile doar în proiectul curent. În lipsa acestei declaraţii, procedurile publice (din toate modulele standard sau clasă) sunt vizibile în toate proiectele care se referă la proiectul curent. Procedurile, variabilele şi constantele publice din alte module (cum ar fi modulele ataşate formelor) sunt Private pentru proiectul de definiţie, deci ele nu sunt accesibile proiectelor care se referă la proiectul unde sunt declarate.

Nivel de modul, public

Variabilele declarate la nivel de modul drept Public sunt vizibile în toate procedurile din proiect. Procedurile sunt publice în mod implicit, cu excepţie procedurilor de tratare a evenimentelor, care sunt Private în mod implicit. A se vedea şi nota anterioară.

Viata unei variabile

Prin viaţa unei variabile se înţelege timpul cât variabila are o valoare. Este evident că valoarea unei variabile se poate modifica pe durata vieţii sale, dar definitoriu este faptul că variabila are o anumită valoare pe întreaga durată a vieţii sale. La părăsirea domeniului, variabila "moare" şi nu mai are ataşată o valoare.

La începutul execuţiei unei proceduri, toate variabilele sunt iniţializate:

Variabilă numerică 0 (zero)

Page 29: tutoriale vba

Şir de lungime variabilă "" (şir de lungime zero)

Şir de lungime fixă Completat cu caracterul Chr(0) (având codul ASCII 0)

Variabilă Variant Empty

Variabile de tip utilizator fiecare element este iniţializat separat, potrivit tipului primar

Variabilă Object Nothing (până la asignarea unei referinţe prin Set)

Variabilele care nu sunt modificate îşi păstrează valoarea iniţială.

Variabilele declarate prin Dim la nivel de procedură au valoare până la terminarea execuţiei procedurii (chiar dacă se trece prin apel în alte proceduri).

Variabilele declarate prin Static, la nivel de procedură, au aceeaşi viaţă ca şi variabilele declarate la nivel de modul şi îşi păstrează valoarea până la terminarea execuţiei codului (inclusiv de la un apel la altul). Includerea clauzei Static în instrucţiunea Sub sau Function are ca efect declararea tuturor variabilelor definite în procedura respectivă drept variabile statice (deci care îşi păstrează valorile între apeluri).

Variabilele declarate la nivel de modul standard îşi păstrează valoarea pe tot timpul execuţiei. Variabilele declarate la nivel de modul clasă îşi păstrează valoarea atât timp cât există o instanţă a clasei. Diferenţa faţă de variabilele Static este aceea că memoria este utilizată permanent (nu se eliberează la părăsirea domeniului).

Variabile Object

Declararea unei variabile de tip obiect se poate efectua prin declararea tipului generic Object

Dim myDoc As Object

sau specificând exact numele de clasă dintr-o bibliotecă de obiecte referită

Dim myDoc As Word.Document

În primul mod de definire (ca Object) nu se poate efectua la momentul compilării existenţa obiectului, nu se poate verifica utilizarea corectă a proprietătilor şi metodelor obiectului şi nu se poate lega această informaţie de variabila obiect definită. Ataşarea unui obiect este, în acest caz, o legare târzie (late binding) la momentul execuţiei şi se efectuează prin instrucţiunea Set.

Specificarea unei clase la definirea variabilei obiect produce o legare timpurie (early binding) care este mai rapidă, se face la momentul compilării şi poate înlătura mai rapid erori posibile în utilizarea metodelor şi proprietăţilor obiectului.

Page 30: tutoriale vba

Instrucţiunea Set are sintaxa:

Set objectvar = {[New] objectexpression | Nothing}

unde

o objectvar este numele variabilei (sau proprietăţii)o New permite crearea unei noi instanţe a clasei

o Objectexpression este o expresie constând în numele unui obiect, altă variabilă declarată de acelaşi tip obiect, sau funcţie ori metodă care returnează un obiect de acelaşi tip obiect

o Nothing permite deconectarea asocierii cu un obiect specific, eliberând resursele sistem şi de memorie utilizate.

În general, atunci când se utilizează Set pentru a asigna o referinţă de obiect la o variabilă, nu se creează o copie a obiectului pentru acea variabilă. Este creată doar o referinţă la obiect. Astfel, mai multe variabile de tip obiect pot să se refere la acelaşi obiect: orice schimbare a obiectului se va reflecta în toate variabilele care referă obiectul. Utilizând clauza New se va crea efectiv o copie (instanţă) a obiectului.

Exemple

Prin următoarele două instrucţiuni se defineşte variabila objWord care este legată târziu de o aplicaţie Word:

Dim objWord As Object

Set obhWord = CreateObject("Word.Application")

Legarea timpurie se poate efectua prin

Dim objWord As Word.Application

Este de remarcat că instrucţiunea Set apelează o funcţie care creează şi returnează o referinţă la un obiect ActiveX.

Constante predefinite (built–in)

Bibliotecile de obiecte din fiecare aplicaţie Office furnizează o mulţime de constante predefinite, care pot fi utilizate pentru a stabili proprietăti sau pentru a transmite argumente către proprietăţi sau metode. Constantele sunt, de regulă, grupate în tipuri enumerate care reprezintă valorile posibile pentru o proprietate specifică. Deşi este posibilă să se utilizeze valoarea numerică a constantei este recomandat să se utilizeze constanta numită întrucât dezvoltări ulterioare ale mediului Microsoft Office (ca şi ale aplicaţiilor din Visual Studio) tind să păstreze compatibilitatea între denumirile constantelor şi nu între valorile efective.

De exemplu se preferă

Application.DisplayAlerts = wdAlertAll

Page 31: tutoriale vba

în loc de

Application.DisplayAlerts = -1

pentru a fixa ca Word să afişeze toate mesajele de alertă la execuţia unei proceduri. Codul scris astfel este şi mai explicit.

Visual Basic 2010 Lectia 6

Există mai multe tipuri de date pe care le întâlnim în viaţa noastră de zi cu zi. De exemplu, avem nevoie să se ocupe de date, cum ar fi nume, adrese,, data de bani, cotaţii bursiere, statistici si etc de zi cu zi. În mod similar, în Visual Basic 2010, avem de a face cu tot felul de de date, unele pot fi matematic calculat în timp ce unele sunt sub forma de text sau alte forme. VB2010 imparte datele în diferite tipuri, astfel încât este mai uşor de a gestiona atunci când avem nevoie pentru a scrie cod care implică aceste date.

6.1 Visual Basic 2010 Tipuri de date

Visual Basic 2010 clasifică informaţiile menţionate mai sus în două tipuri majore de date, acestea sunt tipurile de date numerice, precum şi tipurile de date non-numerice.

6.1.1 Tipuri de date numerice

Tipuri de date numerice sunt tipuri de date care constau din numere, care poate fi calculată matematic cu diverşi operatori standard, cum ar fi add, minus, înmulţire, împărţire şi aşa mai departe. Exemple de tipuri de date numerice sunt marci de examinare, inaltimea, greutatea, numărul de elevi într-o clasă, împărtăşesc valori, preţul mărfurilor, facturi lunare, taxe şi etc În Visual Basic 2010, datele numerice sunt împărţite în 7 tipuri , în funcţie de gama de valorile pe care le poate stoca. Calculele care implica numai cifre rotunde sau date care nu au nevoie de precizie, se poate utiliza întreg Întreg lung sau în calcul. Programe de calcul care necesită precizie mare nevoie de a folosi anumite tipuri Single şi Double decizia de date, ele sunt, de asemenea, numite numere reale cu virgulă. Pentru calcularea valută, aveţi posibilitatea să utilizaţi următoarele tipuri de date valută. În sfârşit, dacă o precizie chiar mai mult este nevoie pentru a efectua calcule care implică o mai multe puncte zecimale, putem folosi tipurile de date zecimale. Aceste tipuri de date sintetizate în tabelul 6.1

6.1 [img]

[/img]

Page 32: tutoriale vba

6.1.2 Non-numerice Tipuri de date

Tipuri de date numerice sunt date care nu pot fi manipulate folosind matematic operatorii standard aritmetică. Datele non-numerice cuprinde date de tip text sau şir de tipuri, tipurile de date data, tipurile de date boolean care stochează numai două valori (adevărat sau fals), tipul de date obiect şi tip de date Variant. Ele sunt prezentate pe scurt în Tabelul 6.2

6.2

6.1.3 Sufixe pentru Literali

Literali sunt valori pe care îl atribuiţi de date. În unele cazuri, avem nevoie să adăugaţi un sufix în spatele unui literal, astfel încât VB2010 se pot ocupa de calcul mai exact. De exemplu, putem folosi num = 1.3089 # pentru un tip de date dublă. Unele dintre sufixele sunt afişate în Tabelul 6.3.

6.3

În plus, avem nevoie să anexaţi literali şir în termen de două citate şi literalii data şi ora în termen de două semnul #. Siruri de caractere poate conţine orice caractere, inclusiv numere. Următoarele sunt câteva exemple:

memberName="Turban, John." TelNumber="1800-900-888-777" LastDay=#31-Dec-00# ExpTime=#12:00 am#

6.2 Variabile de Management

Variabilele sunt ca nişte cutii de e-mail în oficiul poştal. Conţinutul variabilelor se schimbă de fiecare acum şi apoi, la fel ca casutele de mail. În termen de VB2010, variabilele sunt zone

Page 33: tutoriale vba

alocate de memoria computerului pentru a stoca datele. Ca si casutele de mail, fiecare variabilă trebuie să fie dat un nume. Pentru a denumi o variabilă în Visual Basic 2010, va trebui să urmeze un set de reguli.

6.2.1 Nume variabila

Următoarele sunt regulile atunci când denumirea variabile în Visual Basic 2010

- Acesta trebuie să fie mai mult de 255 de caractere- Nr spaţierea este permisă- Ea nu trebuie să înceapă cu un număr de- Perioada nu este permisăExemple de nume valide şi nevalide de variabile sunt prezentate în Tabelul 6.4 .

6.4

6.2.2 Variabile declararea

În Visual Basic 2010, trebuie să declare variabilele înainte de a le utiliza prin atribuirea de nume şi tipuri de date. Dacă nu reuşesc să facă acest lucru, programul va afişa o eroare. Ele sunt în mod normal, declarate în partea generală a codurilor de ferestre ", folosind declaraţia Dim.Formatul este după cum urmează:

Cod:Dim Variable Name As Data Type

Exemple 6.1 :

Cod:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim password As String Dim yourName As String Dim firstnum As Integer Dim secondnum As Integer Dim total As Integer Dim doDate As Date

End Sub

Puteţi combina, de asemenea, le într-o singură linie, separând fiecare variabilă cu o virgulă, după cum urmează:

Page 34: tutoriale vba

Dim password As String, yourName As String, firstnum As Integer,.............

Pentru declaraţia de string, există două formate posibile, unul pentru şir de lungime variabilă şi un alt şir de lungime fixă. Pentru şirul de lungime variabila, trebuie doar să utilizaţi acelaşi format ca de exemplu 6.1 de mai sus. Cu toate acestea, pentru şirul de lungime fixă, trebuie să utilizaţi formatul de mai jos:

Dim VariableName as String * n , în cazul în care n defineşte numărul de caractere şir poate conţine.

Exemplu 6.2

Cod:Dim yourName as String * 10

Nulele tau nu poate contine mai mult de 10 litere .

6.2.3 Valori atribuirea Variabile

După declararea diferitelor variabile folosind declaraţiile Dim, putem atribui valori pentru aceste variabile. Formatul general al unei cesiuni este

Variable=Expression

Variabilă poate fi o variabilă declarată sau o proprietate valoare de control. Expresia ar putea fi o expresie matematică, un număr, un şir de caractere, o valoare Boolean (adevărat sau fals) şi etc Următoarele sunt câteva exemple:

Cod:firstNumber=100 secondNumber=firstNumber-99 userName="John Lyan" userpass.Text = password Label1.Visible = True Command1.Visible = false Label4.Caption = textbox1.Text ThirdNumber = Val(usernum1.Text) total = firstNumber + secondNumber+ThirdNumber 

6.3 Constante

Constante sunt diferite de variabile, în sensul că valorile lor nu se modifică pe parcursul derulării programului.

6.3.1 Declararea unei constante

Formatul de a declara o constantă este

Cod:Const  Constant Name  As Data Type = Value

Page 35: tutoriale vba

exemplu 6.3

Cod:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Const Pi As Single=3.142

Const Temp As Single=37

Const Score As Single=100

End Sub

Visual Basic 2010 Lectia 1

Visual Basic 2010 este cea mai recentă versiune de Visual Basic lansate de Microsoft în 2010. VB2010 este aproape similar cu Visual Basic 2008, dar a adăugat multe caracteristici noi. Ca şi Visual Basic 2008, Visual Basic 2010 este, de asemenea, un obiect-orientate cu drepturi depline de programare (OOP) Limba, deci le-a prins cu alte limbaje OOP, cum ar fi C + +, Java, C # si altele.

Cu toate acestea, nu trebuie să ştie să înveţe VB2010 OOP. De fapt, dacă sunteţi familiarizaţi cu Visual Basic 6, puteţi învăţa VB2010 efort, deoarece sintaxa si interfata sunt similare. Visual Basic 2010 Express Edition este disponibil gratuit pentru descărcare de la site-ul Microsoft. Faceţi clic pe această legătură într-http://www.microsoft.com/express/downloads/ pentru a descărca Vb2010.

Integrated Development Environment când lansaţi VB2010 Express este prezentată în diagrama de mai jos.Start Page IDE constă din câteva secţiuni, şi anume:

- Noul proiect / pct. Deschidere proiect.- Proiectele recente secţiune care afişează o listă de proiecte care au fost create de tine recent.- Noţiuni de bază Panoul de-Acesta oferă câteva sfaturi utile pentru a dezvolta rapid aplicaţiile.- Ultimele ştiri secţiune-Acesta oferă cele mai recente ştiri on-line despre Visual Basic 2010 Express. Acesta va anunta versiuni noi şi actualizări- Proprietăţi secţiune

Page 36: tutoriale vba

Pentru a începe crearea cererii dumneavoastră în primul rând, aveţi nevoie să faceţi clic pe Proiect nou. Au VB2010 caseta de dialog New Project va apărea.

Page 37: tutoriale vba

Caseta de dialog vă oferă cinci tipuri de proiecte pe care le pot crea. Aşa cum am de gând să înveţe pentru a crea aplicaţii Windows, vom selecta aplicaţie Windows Forms.

În partea de jos a acestei casete de dialog, aveţi posibilitatea să modificaţi numele implicit proiectul WindowsApplication1 la alt nume doriţi, pentru exampe, myFirstProgram. După ce aţi redenumit proiect, faceţi clic pe OK pentru a continua. Au IDE pentru Windows va apărea, este aproape similar cu Visual Basic 6. Acesta constă dintr-un formular gol, pe fila set de instrumente şi proprietăţi.Layout-ul este uşor diferit de vb2008 ca Toolbox nu este afişată până când faceţi clic pe fila Instrumente de lucru.

Page 38: tutoriale vba

Când faceţi clic pe tab-ul Toolbox, comună Toolbox controale vor apărea.

Page 39: tutoriale vba

Acum trageţi butonul de control în formular şi modificaţi textul ei implicit Button1 la OK în fereastra de proprietăţi, OK cuvântul va apărea pe buton pe formular, după cum se arată mai jos:

Page 40: tutoriale vba

Acum, dati click pe butonul OK şi apare fereastra de cod. Introduceţi codul, după cum urmează:

Când executaţi programul şi faceţi clic pe butonul OK, o casetă de dialog va apărea şi va afişa "BINE ATI VENIT LA Visual Basic 2010" mesaj, după cum se arată mai jos:

Aici este , aţi creat dvs. primul program VB2010.

Visual Basic 2010 Lectia 2 - Lucrul cu controalele

Controalele din VB2010 sunt instrumente utile care pot fi plasate în formă pentru a efectua diferite sarcini. Acestea sunt utilizate pentru a crea mai multe tipuri de aplicaţii Windows.Diagrama de pe dreapta este Caseta de instrumente care conţine controalele de

Page 41: tutoriale vba

VB2010. Acestea sunt clasificate în controale comune, Containere, Meniuri, Bare de instrumente, date, componente, Tipărituri şi dialoguri. În momentul de faţă, ne vom concentra asupra controalelor comune. Unele dintre cele mai utilizate controale comune sunt Button, Label, ComboBox, ListBox, PictureBox, TextBox etc

Pentru a introduce un control în formular, trebuie doar să trageţi de control şi plasaţi-l în formular. Puteţi repoziţiona şi redimensiona-l cum doriţi. Să examinăm câteva programe care făcut uz de Button, Label, TextBox, ListBox şi PictureBox. Nu trebuie să vă faceţi griji atât de mult despre codul pentru că voi explica programul de sintaxa pe măsură ce progrese la lecţii mai târziu.

Când faceţi clic pe tab-ul Toolbox, comună Toolbox controale vor apărea.

Page 42: tutoriale vba

2.1 Crearea primului program

Pentru a crea programul în primul rând, glisaţi butonul de control în formular şi modificaţi textul ei implicit Button1 la OK în fereastra de proprietăţi, OK cuvântul va apărea pe buton pe formular, după cum se arată mai jos:

Page 43: tutoriale vba

Acum, dati click pe butonul OK şi apare fereastra de cod. Introduceţi codul, după cum urmează:

Page 44: tutoriale vba

Când executaţi programul şi faceţi clic pe butonul OK, o casetă de dialog va apărea şi va afişa "BINE ATI VENIT LA Visual Basic 2010" mesaj, după cum se arată mai jos:

Aici este , aţi creat dvs. primul program VB2010 .

2.2 Utilizarea Casetă text

Înainte Eu vă va arăta cum să creaţi un calculator simplu care adaugă două numere folosind de control TextBox. În acest program, vă introduc două celule text, trei etichete şi un buton. Cele două celule text sunt pentru ca utilizatorii să introducă două numere, o etichetă este pentru a afişa operatorul de adunare şi de alte etichete care este pentru a afişa semnul egal. Eticheta este ultima pentru a afişa răspunsul. Schimba acum eticheta de pe buton pentru a

Page 45: tutoriale vba

calcula, apoi faceţi clic pe acest buton şi introduceţi codul de mai jos:

Cod:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim num1, num2, product As Single

num1 = TextBox1.Text

num2 = TextBox2.Text

product = num1 + num2

Label1.Text = product

End Sub

Când rulaţi programul şi introduceţi două numere, apăsând butonul calcula te pot lăsa să efectua adunări a două numere.

Visual Basic 2010 Lectia 3

3.1 Proprietăţi control

Înainte de a scrie o procedură eveniment pentru controlul a răspuns la introducerea unui utilizator, trebuie să setaţi anumite proprietăţi pentru control pentru a determina aspectul şi modul în care va lucra cu procedura de eveniment. Aveţi posibilitatea să setaţi proprietăţile controalelor din fereastra de proprietăţi în momentul de proiectare sau la runtime. Figura 3.2 pe dreapta este un tipic fereastră proprietăţi pentru un formular. Aceasta se referă în special la interfaţa primului program le-aţi învăţat în lecţia precedentă, după cum se arată în figura 3.1:

Page 46: tutoriale vba

Titlul a formularului este definită de proprietate Text şi numele său implicit este formularul 1. Pentru a schimba titlul formularul la orice nume care vă place, faceţi clic simplu în caseta privind dreptul de proprietate Text şi introduceţi noul nume, în acest exemplu, titlul este Calculator adăugare. Observaţi că acest titlu va apărea în partea de sus a ferestrelor. În fereastra de proprietăţi, elementul apare în partea de sus este în prezent obiectul selectat (în Figura 3.1, obiectul selectat este Form1). La partea de jos, elementele enumerate în coloana din stânga reprezintă numele a diferite proprietăţi asociate cu obiectul selectat în timp ce elementele enumerate în coloana din dreapta reprezintă statele din proprietăţi. Proprietăţi pot fi stabilite prin evidenţierea elementelor din coloana din dreapta modifica apoi le tastând sau selectând opţiunile disponibile. Puteţi modifica, de asemenea, alte proprietăţi a formularului, cum ar fi font, locaţia, mărimea, culoarea foreground, culoare de fundal, MaximizeBox, MinimizeBox şi etc ..

Aveţi posibilitatea să modificaţi, de asemenea, proprietăţile obiectului în timpul rulării pentru a da efecte speciale cum ar fi schimbarea de culoare, forma efectul de animaţie, şi aşa mai departe. De exemplu, urmatorul cod va schimba culoarea in galben formularul de fiecare dată când formularul este încărcat. VB2010 utilizeaza RGB (rosu, verde, albastru) pentru a determina culorile.Codul RGB pentru galben este 255,255,0. Mă în codul referă la forma actuală şi BackColor este proprietatea culoarea de fundal formular. Formula pentru a atribui culoare RGB la formularul este Color.FormArbg(cod RGB).

Cod:Public Class Form1

Page 47: tutoriale vba

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.BackColor = Color.FromArgb(255, 0, 255)

End SubEnd Class

Puteţi folosi, de asemenea, procedura de urmat pentru a atribui culoarea la momentul execuţiei.

Cod:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load      Me.BackColor = Color.Magenta

End Sub

Ambele proceduri de mai sus va încărca formă, cu un fundal magenta, după cum urmează:

Aici sunt unele dintre culorile comune şi codurile corespunzătoare RGB. Puteţi experimenta mereu cu alte combinaţii, dar ţineţi minte numărul maxim pentru fiecare culoare este 255, iar numărul minim este 0.

Următoarele este un alt program care permite utilizatorului să introducă codurile RGB în trei celule text diferite şi atunci când el / ea face clic pe butonul afişaj color, culoarea de fundal a formularului se va modifica în conformitate cu codurile RGB. Deci, acest program permite utilizatorilor să modifice proprietăţile culoarea forma la momentul execuţiei.

Page 48: tutoriale vba

Codul :

Cod:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim rgb1, rgb2, rgb3 As Integerrgb1 = TextBox1.Textrgb2 = TextBox2.Textrgb3 = TextBox3.TextMe.BackColor = Color.FromArgb(rgb1, rgb2, rgb3)

End Sub

Visual Basic 2010 Lectia 4

În primele trei lecţii, aţi învăţat cum să introduceţi codul de program şi se scurge eşantionul de VB2010 programelor UE, dar fără prea multă înţelegere cu privire la logica VB2010 de programare. Acum, haideţi să trecem la învăţarea câteva reguli de bază despre scrierea codului de program VB2010.

Mai întâi de toate, permiteţi-mi să spun că, deşi VB2010 este foarte mult asemanatoare cu VB6 în ceea ce priveşte structura interfeţei şi a programului, conceptele care stau la baza lor sunt destul de diferite. Diferite principală este că VB2010 este un limbaj plin programarea orientata obiect în timp ce VB6 pot avea capacitati OOP, nu este pe deplin orientat obiect. Pentru a se califica pe deplin ca un limbaj de programare orientat obiect, aceasta trebuie să aibă trei tehnologii de bază şi anume încapsulare, moştenire şi polimorfism. Aceste trei termeni sunt explicate mai jos:

Încapsulare se referă la crearea de module de sine stătătoare care se leaga de funcţii de prelucrare a datelor. Aceste tipuri de date definite de utilizator sunt numite clase. Fiecare clasă conţine date, precum şi un set de metode care manipulează date. Componentele de date a unei clase sunt numite variabile de instanţă şi de o instanţă a unei clase este un obiect. De exemplu, într-un sistem de bibliotecă, o clasa ar putea fi membru, şi John şi Sharon ar putea fi două cazuri (doua obiecte) din clasa bibliotecii.

Page 49: tutoriale vba

Succesorale sClasele sunt create în funcţie de ierarhii, şi moştenire permite structura şi metodele într-o clasă de a fi trecut în jos în ierarhia. Asta inseamna ca programarea este necesară mai puţină la adăugarea de funcţii pentru sisteme complexe. În cazul în care un pas, se adaugă la partea de jos a ierarhiei, apoi numai de prelucrare a datelor şi asociate cu acest pas unic trebuie să fie adăugate. Orice altceva despre acest pas este moştenită. Capacitatea de a reutilizarea obiectelor existente este considerat un avantaj major al tehnologiei obiect.

PolimorfismulProgramarea orientată pe obiecte permite proceduri cu privire la obiectele care urmează să fie create exact a căror tip nu este cunoscută până la runtime. De exemplu, un cursor pe ecran se poate schimba forma de la o săgeată într-o linie, în funcţie de modul de programare. De rutină pentru a muta cursorul pe ecran, ca răspuns la mişcarea mouse-ului ar fi scris pentru "cursor", şi polimorfism, care permite cursorul pentru a lua la orice formă este necesară în timpul rulării. Acesta permite, de asemenea forme noi pentru a fi integrate cu uşurinţă.

VB6 nu este o OOP completă, în sensul că aceasta nu are capacităţi moştenire, deşi se poate face uz de unele beneficii de moştenire. Cu toate acestea, VB2010 este o limbă complet funcţional programarea orientata obiect, la fel ca alte OOP, cum ar fi C + + si Java. Acesta este diferit de versiunile anterioare de VB, deoarece se axează mai mult pe datele în sine, în timp ce versiunile anterioare se concentreze mai mult pe acţiuni. Versiunile anterioare ale VB sunt cunoscute sub numele de limbajul de programare procedurale sau funcţionale. Unele limbi de procedură sunt de programare C, Pascal şi Fortran.

VB2010 permite utilizatorilor să scrie programe care descompun în module. Aceste module vor reprezenta obiecte din lumea reală şi sunt stie ca clase sau tipuri. Un obiect poate fi creat dintr-o clasă şi este cunoscut ca o instanta a clasei. O clasa poate include, de asemenea, subclasă. De exemplu, măr este o subclasă a clasei de plante şi de mere din curte este o instanta a clasei măr. Un alt exemplu este clasa elev este o subclasă a clasei umane în timp ce fiul tau John este o instanta a clasei studentului.

O clasă este format din membri ai datelor, precum şi metode. În VB2010, structura programului de a defini o clasă umană poate fi scrisă după cum urmează:

Cod:Public Class Human'Data MembersPrivate Name As StringPrivate Birthdate As StringPrivate Gender As StringPrivate Age As Integer'MethodsOverridable Sub ShowInfo( )MessageBox.Show(Name)MessageBox.Show(Birthdate)MessageBox.Show(Gender)MessageBox.Show(Age)End SubEnd Class

Page 50: tutoriale vba

După ce aţi creat clasa uman, aveţi posibilitatea să creaţi o subclasă care moşteneşte atributele sau datele din clasa uman. De exemplu, aveţi posibilitatea să creaţi o clasă elevilor că este o subclasă a clasei umane. În cadrul clasei student, nu trebuie să definească orice câmpuri de date care sunt deja definite în cadrul clasei umane, trebuie doar să definiţi câmpurile de date care sunt diferite de la o instanţă a clasei umane. De exemplu, poate doriţi să includă şi StudentID Adresa în clasa student.Cod de program pentru StudentClass este după cum urmează:

Cod:Public Class Students

Inherits Human

Public StudentID as String

Public Address As String

Overrides  Sub ShowInfo( )

MessageBox.Show(Name)

MessageBox.Show(StudentID)

MessageBox.Show(Birthdate)

MessageBox.Show(Gender)

MessageBox.Show(Age)

MessageBox.Show(Address)

End Sub

Visual Basic 2010 Lectia 5

n capitolul anterior, aţi învăţat că VB2010 este un limbaj de programare orientat obiect. Aţi înţeles sensurile de clasa, obiect, moştenire încapsulare precum şi polimorfismul. Aveţi, de asemenea învăţat să scrie unele programe simple fără prea multă înţelegere care stau la baza unor fundaţii şi teorii. În acest capitol, veţi învăţa unele teorii de bază despre VB2010 de programare, dar ne vom concentra mai mult pe învăţarea prin practică, şi anume învăţarea prin programe de scris. Voi păstra teoriile scurt, astfel încât să nu ar fi prea dificil pentru incepatori.

5.1 Evenimentul procedură

VB2010 este un obiect orientat şi limbaj de programare eveniment condus. De fapt, toate aplicatiile Windows sunt conduse eveniment. Eveniment condus înseamnă ghidul va decide ce să facă cu programul, dacă el / ea vrea să faceţi clic pe butonul de comandă, sau el / ea vrea pentru a introduce text într-o casetă de text, sau el / ea ar putea să vrea să închideţi aplicaţia şi

Page 51: tutoriale vba

etc Un eveniment este legat de un obiect,. acesta este un incident care se întâmplă la obiect ca urmare a acţiunii de utilizator, cum ar fi un clic sau apăsarea unei taste de pe tastatură. O clasă are evenimente ca acesta creează instantanee a unei clase sau al unui obiect. Când începem o aplicaţie Windows în VB2010 în capitolele anterioare, vom vedea un formular implicit cu Form1 apare în IDE, acesta este de fapt clasa Form1 care moşteneşte de la clasa System.Windows.Forms.Form formular, după cum se arată în Form1 proprietăţi ferestre.

Când ne-am faceţi clic pe oricare parte a formularului, vom vedea fereastra de cod aşa cum se arată mai jos.Este structura unei proceduri eveniment. În acest caz, procedura de eveniment este de a încărca form1 şi se începe cu Private Sub si se termina cu Private Sub . Această procedură include clasa Form1 şi Load eveniment, iar ei sunt obligati, împreună cu o subliniere, şi anume Form_Load. Ea nu face altceva decât încărcarea unui formular gol. Nu trebuie să vă faceţi griji restul de lucruri în acest moment, acestea vor fi explicate în lecţii mai târziu.

Cod:Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

End Class

Sunt alte evenimente asociate cu clasa Form1, cum ar fi faceţi clic pe, cursorChanged, DoubleClick, DragDrop, Enter ca aşa mai departe, după cum se arată în diagrama de mai jos

Page 52: tutoriale vba

(Se pare că atunci când faceţi clic pe panoul din dreapta sus a ferestrei cod)

5.2 Scrierea codul

Acum sunteţi gata să scrie cod pentru procedura de eveniment, astfel încât acesta va face ceva mai mult decat de încărcare un formular gol.Codul trebuie introdus între Private Sub ...... End Sub

Cod:Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.Text = "My First VB2010 Program"

Me.ForeColor = Color.ForestGreen

Me.BackColor = Color.Cyan

End Sub

End Classs

Prima linie de cod se va schimba titlul de formular pentru a mea Program de VB2010 În primul rând, a doua linie se va schimba obiectul prim-plan la Padurea Verde (în acest caz, este vorba de o etichetă pe care le inseraţi în formular şi schimba numele sarcina de a prim-plan), precum şi ultima linie modificări de fundal de culoare Csyan.Egale în codul de fapt este folosit pentru a atribui ceva la obiect, cum ar fi atribuirea de culoare galben în prim-plan a obiectului Form1 (sau o instanţă de Form1). Mine este numele dat la clasa Form1. Putem apela, de asemenea, ca acele linii Declaratii. Deci, acţiunile programului va depinde de declaraţiile înscrise de către porgrammer.

Page 53: tutoriale vba

aici este un alt exemplu :

Cod:Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim name1, name2, name3 As Stringname1 = "John"name2 = "Georges"name3 = "Ali"MsgBox(" The names are " & name1 & " , " & name2 & " and " & name3)

End Sub

În acest exemplu, inseraţi un buton de comandă în formular şi a redenumi legenda ei ca arata Nume ascunse.Dim cuvânt cheie este de a declara variabile nume1, nume2 şi name3 ca şir, ceea ce înseamnă că pot ocupa numai text.MsgBox funcţie este de a afişa numele într-o casetă de mesaj, care sunt unite prin "&" semne.De ieşire este prezentată mai jos:

Page 54: tutoriale vba

ComentariiNu aveți permisiunea de a adăuga comentarii.

Visual Basic 2010 Lectia 6

Există mai multe tipuri de date pe care le întâlnim în viaţa noastră de zi cu zi. De exemplu, avem nevoie să se ocupe de date, cum ar fi nume, adrese,, data de bani, cotaţii bursiere, statistici si etc de zi cu zi. În mod similar, în Visual Basic 2010, avem de a face cu tot felul de de date, unele pot fi matematic calculat în timp ce unele sunt sub forma de text sau alte forme. VB2010 imparte datele în diferite tipuri, astfel încât este mai uşor de a gestiona atunci când avem nevoie pentru a scrie cod care implică aceste date.

6.1 Visual Basic 2010 Tipuri de date

Visual Basic 2010 clasifică informaţiile menţionate mai sus în două tipuri majore de date, acestea sunt tipurile de date numerice, precum şi tipurile de date non-numerice.

6.1.1 Tipuri de date numerice

Tipuri de date numerice sunt tipuri de date care constau din numere, care poate fi calculată matematic cu diverşi operatori standard, cum ar fi add, minus, înmulţire, împărţire şi aşa mai departe. Exemple de tipuri de date numerice sunt marci de examinare, inaltimea, greutatea, numărul de elevi într-o clasă, împărtăşesc valori, preţul mărfurilor, facturi lunare, taxe şi etc În Visual Basic 2010, datele numerice sunt împărţite în 7 tipuri , în funcţie de gama de valorile pe care le poate stoca. Calculele care implica numai cifre rotunde sau date care nu au nevoie de precizie, se poate utiliza întreg Întreg lung sau în calcul. Programe de calcul care necesită precizie mare nevoie de a folosi anumite tipuri Single şi Double decizia de date, ele sunt, de asemenea, numite numere reale cu virgulă. Pentru calcularea valută, aveţi

Page 55: tutoriale vba

posibilitatea să utilizaţi următoarele tipuri de date valută. În sfârşit, dacă o precizie chiar mai mult este nevoie pentru a efectua calcule care implică o mai multe puncte zecimale, putem folosi tipurile de date zecimale. Aceste tipuri de date sintetizate în tabelul 6.1

6.1 [img]

[/img]

6.1.2 Non-numerice Tipuri de date

Tipuri de date numerice sunt date care nu pot fi manipulate folosind matematic operatorii standard aritmetică. Datele non-numerice cuprinde date de tip text sau şir de tipuri, tipurile de date data, tipurile de date boolean care stochează numai două valori (adevărat sau fals), tipul de date obiect şi tip de date Variant. Ele sunt prezentate pe scurt în Tabelul 6.2

6.2

6.1.3 Sufixe pentru Literali

Literali sunt valori pe care îl atribuiţi de date. În unele cazuri, avem nevoie să adăugaţi un sufix în spatele unui literal, astfel încât VB2010 se pot ocupa de calcul mai exact. De exemplu, putem folosi num = 1.3089 # pentru un tip de date dublă. Unele dintre sufixele sunt afişate în Tabelul 6.3.

Page 56: tutoriale vba

6.3

În plus, avem nevoie să anexaţi literali şir în termen de două citate şi literalii data şi ora în termen de două semnul #. Siruri de caractere poate conţine orice caractere, inclusiv numere. Următoarele sunt câteva exemple:

memberName="Turban, John." TelNumber="1800-900-888-777" LastDay=#31-Dec-00# ExpTime=#12:00 am#

6.2 Variabile de Management

Variabilele sunt ca nişte cutii de e-mail în oficiul poştal. Conţinutul variabilelor se schimbă de fiecare acum şi apoi, la fel ca casutele de mail. În termen de VB2010, variabilele sunt zone alocate de memoria computerului pentru a stoca datele. Ca si casutele de mail, fiecare variabilă trebuie să fie dat un nume. Pentru a denumi o variabilă în Visual Basic 2010, va trebui să urmeze un set de reguli.

6.2.1 Nume variabila

Următoarele sunt regulile atunci când denumirea variabile în Visual Basic 2010

- Acesta trebuie să fie mai mult de 255 de caractere- Nr spaţierea este permisă- Ea nu trebuie să înceapă cu un număr de- Perioada nu este permisăExemple de nume valide şi nevalide de variabile sunt prezentate în Tabelul 6.4 .

6.4

6.2.2 Variabile declararea

În Visual Basic 2010, trebuie să declare variabilele înainte de a le utiliza prin atribuirea de nume şi tipuri de date. Dacă nu reuşesc să facă acest lucru, programul va afişa o eroare. Ele sunt în mod normal, declarate în partea generală a codurilor de ferestre ", folosind declaraţia Dim.Formatul este după cum urmează:

Cod:Dim Variable Name As Data Type

Page 57: tutoriale vba

Exemple 6.1 :

Cod:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim password As String Dim yourName As String Dim firstnum As Integer Dim secondnum As Integer Dim total As Integer Dim doDate As Date

End Sub

Puteţi combina, de asemenea, le într-o singură linie, separând fiecare variabilă cu o virgulă, după cum urmează:

Dim password As String, yourName As String, firstnum As Integer,.............

Pentru declaraţia de string, există două formate posibile, unul pentru şir de lungime variabilă şi un alt şir de lungime fixă. Pentru şirul de lungime variabila, trebuie doar să utilizaţi acelaşi format ca de exemplu 6.1 de mai sus. Cu toate acestea, pentru şirul de lungime fixă, trebuie să utilizaţi formatul de mai jos:

Dim VariableName as String * n , în cazul în care n defineşte numărul de caractere şir poate conţine.

Exemplu 6.2

Cod:Dim yourName as String * 10

Nulele tau nu poate contine mai mult de 10 litere .

6.2.3 Valori atribuirea Variabile

După declararea diferitelor variabile folosind declaraţiile Dim, putem atribui valori pentru aceste variabile. Formatul general al unei cesiuni este

Variable=Expression

Variabilă poate fi o variabilă declarată sau o proprietate valoare de control. Expresia ar putea fi o expresie matematică, un număr, un şir de caractere, o valoare Boolean (adevărat sau fals) şi etc Următoarele sunt câteva exemple:

Cod:firstNumber=100

Page 58: tutoriale vba

secondNumber=firstNumber-99 userName="John Lyan" userpass.Text = password Label1.Visible = True Command1.Visible = false Label4.Caption = textbox1.Text ThirdNumber = Val(usernum1.Text) total = firstNumber + secondNumber+ThirdNumber 

6.3 Constante

Constante sunt diferite de variabile, în sensul că valorile lor nu se modifică pe parcursul derulării programului.

6.3.1 Declararea unei constante

Formatul de a declara o constantă este

Cod:Const  Constant Name  As Data Type = Value

exemplu 6.3

Cod:Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Const Pi As Single=3.142

Const Temp As Single=37

Const Score As Single=100

End Sub

Visual Basic 2010 Lectia 7

Calculator pot efectua calcule matematice mult mai rapid decât fiinţele umane. Cu toate acestea, calculator în sine nu va fi capabil de a efectua orice calcule matematice fără să primească instrucţiuni din partea utilizatorului. În VB2010, putem scrie cod pentru a instrui computerul pentru a efectua calcule matematice, cum ar fi adunarea, scăderea, înmulţirea, împărţirea şi alte tipuri de operaţii aritmetice. Pentru ca VB2010 a efectua calcule aritmetice, avem nevoie pentru a scrie cod care implică utilizarea de operatori aritmetici diferite.VB2010 operatori aritmetici sunt foarte similare cu operatori aritmetici normale, doar cu mici variatii. Operatorii plus şi minus sunt aceleaşi, în timp ce operatorul de multiplicare utilizează simbolul * şi operatorul de utilizare divizia simbolul /.Lista de operatori aritmetici VB2010 sunt prezentate în tabelul 7.1 de mai jos:

Tabelul 7.1 operatii Aritmetice

Page 59: tutoriale vba

Exemplu 7.1

În acest program, va trebui să introduceţi două textbox, patru labels şi un buton. Faceţi clic pe buton şi puneti în codul de mai jos. Notă modul în care diferiţii operatori aritmetici sunt utilizate. Când executaţi programul, acesta va efectua cele patru operaţii aritmetice de bază şi a afişa rezultatele pe cele patru etichete.

Cod:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim num1, num2, difference, product, quotient As Singlenum1 = TextBox1.Textnum2 = TextBox2.Text

sum=num1+num2difference=num1-num2product = num1 * num2quotient=num1/num2Label1.Text=sumLabel2.Text=differenceLabel3.Text = productLabel4.Text = quotient

End Sub

Example 7.2

Programul poate folosi Teorema lui Pitagora pentru a calcula lungimea ipotenuzei c având în vedere durata de partea adiacente a şi în partea opusă b. În cazul în care aţi uitat formula pentru teorema lui Pitagora, este scris ca

c^2=a^2+b^2

Page 60: tutoriale vba

Cod:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim a, b, c  As Singlea = TextBox1.Textb = TextBox2.Textc=(a^2+b^2)^(1/2)Label3.Text=c

End Sub

Exemplu 7.3 Calculator IMC

O mulţime de oameni sunt obezi acum şi ar putea afecta serios sănătatea lor. Obezitatea a dovedit de către experţi medicali pentru a fi unul din principalii factori care aduce multe probleme medicale adverse, inclusiv boli de inima. Dacă IMC este mai mare de 30, sunteţi considerat obezi. Puteţi consulta la următoarea gamă de valori BMI pentru statutul de greutatea dumneavoastră.

Underweight = <18.5Normal weight = 18.5-24.9Overweight = 25-29.9Obesity = BMI of 30 or greater

Pentru a calcula IMC-ul tău, nu trebuie să consultaţi medicul dumneavoastră, ai putea folosi doar un calculator sau un program de calculator casa, acest lucru este exact ceea ce eu vă arată aici. Calculatorul BMI este un program Visual Basic, care pot calcula indicele de masă corporală, IMC sau a unei persoane pe baza de greutatea corporală în kilograme şi înălţimea corpului în metri. IMC poate fi calculat folosind formula greutate / (inaltime) 2, în cazul în care greutatea se măsoară în kg şi înălţime în metri. Dacă ştiţi doar greutatea şi înălţimea în lb si in picioare, atunci ai nevoie pentru a le converti la sistemul metric (ai putea scrie, într-adevăr un program VB pentru conversie).

Cod:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArsgs) Handles Button1.Click

Dim height, weight, bmi As Singleheight = TextBox1.Textweight = TextBox2.Textbmi = (weight) / (height ^ 2)Label4.Text = bmi

End Sub

Page 61: tutoriale vba

De ieşire este prezentată în diagrama de mai jos. În acest exemplu, înălţimea dumneavoastră este de 1.80 m (aproximativ 5 picior 11), greutatea dumneavoastră este de 75 kg (aproximativ 168Ib), şi a IMC este de aproximativ 23.14815.Lectură sugerează că eşti sănătos. (Nota, 1 picior = 0.3048, 1 lb =. 45359237 kilogram)

Din exemplele de mai sus, puteţi vedea care efectuează operaţii aritmetice este relativ usor. Aici sunt mai multe proiecte de aritmetice, puteţi încerca să programe:

Area of a triangleArea of a rectangleArea of a circleVolume of a cylinderVolume of a coneVolume of a sphereCompound interestFuture valueMeanVarianceSum of angles in polygonsConversion of lb to kgConversion of Fahrenheit to Celsius

…………………………………………………………………………..

Hello, in acest articol voi aborda face doua exercitii, deoarece unul este foarte scurt si nu are rost sa fac un articol doar pentru el.

Primul exercitiu va fi un “counter”, mai exact vom face un buton si un Label in care va aparea de cate ori am apasat pe buton.

Page 62: tutoriale vba

Pentru acest program vom avea nevoie de:

un Label un CommandButton

Am numit labelul numar si am modificat marimea fontului din containerul Properties, iar la Caption am pus cifra zero, apoi am asezat butonul si programul meu a ajuns sa arate astfel:

Acuma, dublu-click pe butonul +1 si scrieti urmatorul cod:

numar.Caption = numar.Caption + 1

Cam asta este tot programul. Va contoriza fiecare click pe butonul +1. Mai exact, programul i-a Caption din labelul nostru numar si il aduna cu 1 de cate ori apasam butonul +1.

In cel de al doilea tutorial voi incepe sa va povestesc despre Variabilele in Visual Basic. Dar pentru a intelege variabilele, inainte de ele voi scrie putin despre tipurile de date in Visual Basic.

Am explicat in mare in urmatorul tabel dimensiunile(in numar de caractere) Valorilor(Data):

Page 63: tutoriale vba

(click pe imagine pentru marire)

Bun, acuma ca stim ce e fiecare(in mare) definirea unei variabile se face astfel:

Dim NumeVariabila As TipData

Unde Dim este tipul variabilei, in cazul nostru Dimension, NumeVariabila este numele variabilei noastre, ii putem da orice nume, cu doua conditii: sa nu contina spatii si sa nu inceapa cu o cifra, As defineste tipul variabilei, iar TipData este tipul variabilei(byte, integer, long, single, double, string, etc).

Pentru a nu aparea probleme cu variabilele trebuie definite tot timpul, putem lucra si cu ele nedefinite, insa pot aparea erori. Visual Basic are o functie care ne vine in ajutor putin, in cazul in care uitam sa definim o variabila, aceasta functie ne spune ca variabila este nedefinita. Aceasta functie se numeste Option Explicit, si pentru a o activa, trebuie sa scriem pe primul rand al programului care foloseste variabile textul Option Explicit

Bun, acuma sa incepem sa facem un calculator foarte simplu. Urmand ca in urmatorul articol sa il “complicam” putin. Pentru acest calculator vom folosi:

doua Textbox doua Label

un CommandButton

Eu mi-am aranjat programul in felul urmator:

Page 64: tutoriale vba

Am schimbat numele Textbox-urilor din Textbox1 si Textbox2 in nr1 si nr2. Cele doua label-uri sunt: semnul +(Caption) si un label cu Caption gol cu (Name) rezultat.

Acuma, vom face ca acest program sa adune numarul introdus in prima casuta(nr1) cu numarul introdus in a doua casuta(nr2). Dublu-click pe butonul = si scriem codul urmator:

Option ExplicitPrivate Sub CommandButton1_Click()Dim operand1 As IntegerDim operand2 As IntegerDim rez As Integer

operand1 = nr1.Textoperand2 = nr2.Textrez = operand1 + operand2

rezultat.Caption = rezEnd Sub

Am inceput cu functia despre care am vorbit mai devreme Option Explicit, apoi a urmat actiunea pe CommandButton1. Am definit trei variabile(operand1, operand2, rez) ca si numar intreg(Integer), apoi le-am dat valori(operand1=nr1.text - aici operand1 ia valorile din prima casuta text(nr1), operand2=nr2.text - aici operand2 ia valorile din a doua casuta text(nr2) si rez=operand1 + operand2 - va face adunarea intre cele doua numere), iar in cele din urma am pus ca  rezultatul rezultat  sa reprezinte valoarea variabilei rez, suma celor doua numere.

Acest calculator va functiona doar cu numere intregi. Pentru a-l face sa functioneze cu numere reale schimbam pur si simplu tipul variabilei din Integer in Double, iar calculatorul nostru va stii si de numere cu virgula.

Inca un lucru mai vreau sa mentionez si am terminat, operatorii in Visual Basic sunt:

+ (adunare)

- (scadere)

* (inmultire)

/ (inpartire)

Page 65: tutoriale vba

^ (ridicare la putere)

Filed under: Digital Life, download, express, microsoft visual basic

Dupa cum am spus, in acest articol ne jucam putin cu calculatorul facut in articolul anterior. Mai exact, in acest articol voi explica putin “conditiile” din Visual Basic: IF si ELSE IF.Vom face aproape acelasi program doar ca in acesta vom folosi:

trei Textbox un CommandButton

un Label

Vom folosi trei Textbox-uri, si anume nr1, nr2, semn. Pentru inceput, asezam putin “calculatorul” sa arate decent, eu l-am asezat astfel:

Primul Textbox din imagine l-am denumit nr1 [(Name) din containerul Properties], al doilea(cel mic) l-am numit semn, iar al treilea nr2. Label-ul unde scrie rezultat trebuie sa fie gol(Properties-Caption) si sa aiba numele rez.

Bun, acuma incepe distractia, vom folosi o conditii pentru a comanda calculatorul sa calculeze cele doua numere in functie de semnul dintre ele.  Dublu-click pe butonul egal, declaram Option Explicit pe primul rand, apoi scriem urmatorul cod:

Dim numar1 As DoubleDim numar2 As DoubleDim calc As StringDim rezultat As Double

numar1 = nr1.Textnumar2 = nr2.Textcalc = semn.Text

If calc = "+" Thenrezultat = numar1 + numar2ElseIf calc = "-" Thenrezultat = numar1 - numar2ElseIf calc = "*" Thenrezultat = numar1 * numar2ElseIf calc = "/" Thenrezultat = numar1 / numar2ElseIf calc = "^" Thenrezultat = numar1 ^ numar2End If

rez.Caption = rezultat

Page 66: tutoriale vba

Ce am facut mai sus: am declarat variabilele numar1, numar2  si rezultat ca fiind Double, deoarece voi avea nevoie de numere reale(cu +/- si virgula), apoi am declarat variabila calc ca fiind String(sir de caractere), aceasta variabila va fi defapt semnul. Apoi am dat valori variabilelor(numar1 = nr1.Text, etc).

Apoi am trecut la partea interesanta, am folosit If, ElseIf si End If. Tot timpul o conditie va incepe cu If, de obicei nu putem exprima totul printr-o singura conditie, atunci vom folosi ElseIf pentru urmatoarele conditii, oricate ar fi, iar la sfarsit, trebuie sa oprim conditia folosind End If. Conditia de mai sus verifica urmatorul lucru: daca calc(semn) este egal cu unul dintre cele cinci semne va calcula cele doua numere in functie de semn si va pune rezultatul in variabila rezultat. La sfarsit, tot ce trebuie sa mai facem este sa afisam rezultatul in label-ul rez, deci: rez.Caption = rezultat

Vom avea nevoie de conditii aproape in fiecare program de acuma inainte, de aceea urmatorul articol va fi tot despre conditii, pentru a intelege mai bine cum functioneaza.

Iata rezultatele mele la testarea programului:

Programul simplu:

Adunare:

Scadere:

Inmultire:

Page 67: tutoriale vba

Impartire:

Ridicare la putere:

Cam atata despre conditii deocamdata.

Pana la urmatorul articol, exersare placuta va doresc!

Salutare, in acest articol voi mai face un program folosind cateva conditii. Va fi putin mai complex, insa nu va fi greu.

Pe scurt, vom face un program simplu cu:

un Textbox un CommandButton

un Label

Label-ul nu este absolut necesar, l-am adaugat pentru ca utilizatorul sa stie ce sa faca in acest program. Textbox-ul l-am denumit varsta [(Name) din Properties] si cam atata. Programul meu arata cam asa pana acuma:

Acuma, dati dublu-click pe butonul Confirma si sa trecem la treaba scriind urmatorul cod:

Page 68: tutoriale vba

Dim ani As Integerani = varsta.TextIf ani > 0 AND ani < 6 ThenMsgBox "Salut bebelusule!", MsgBoxStyle.Information, "Bebelus"ElseIf ani > 5 AND ani < 15 ThenMsgBox "Salut copilule!", MsgBoxStyle.Information, "Copil"ElseIf ani > 14 AND ani < 21 ThenMsgBox "Salut adolescentule!", MsgBoxStyle.Information, "Adolescent"ElseIf ani > 20 AND ani < 31 ThenMsgBox "Salut tinere adult!", MsgBoxStyle.Information, "Tanar Adult"ElseIf ani > 30 AND ani < 61 ThenMsgBox"Salut adultule!", MsgBoxStyle.Information, "Adult"ElseIf ani > 60 ThenMsgBox "Salut batrane!", MsgBoxStyle.Information, "Batran"End If

In codul de mai sus am declarat variabila ani ca si Integer(numar intreg), apoi am creeat niste conditii in functie de care sa primesc un mesaj intr-un Messagebox. Daca varsta este mai mare ca 0 si mai mica decat 6, sa imi spuna ca sunt un bebelus, s.a.m.d.. In alta ordine de idei, la articolul cu primul calculator am uitat sa precizez cativa operatori aritmetici, si anume:

> (mai mare)

>= (mai mare sau egal)

< (mai mic)

<= (mai mic sau egal)

Filed under: Digital Life, download, express, free, gratis, microsoft visual basic, tutorials

Leave a Reply

alutare, in acest articol voi vorbi despre cateva functii predefinite din Visual Basic. Aceste functii au rolul de a ne “ajuta” cu unele actiuni de care avem nevoie. Mai exact, voi explica putin functiile: Len(), Left(), Right(), Mid(), InStr().  Iar la final voi face un mic exercitiu folosind aceste functii.Bun, sa incepem:

Len() - se foloseste pentru a calcula dimensiunea unui sir de caractere. Exemplu: Len(“TEXT”)  va rezulta cifra 4.

Left() - se foloseste pentru a “taia” o parte dintr-un sir de caractere incepand din stanga spre dreapta pana la caracterul definit de noi. Exemplu: Left(“TEXT PREDEFINIT”, 4) va rezulta textul TEXT, deoarece noi i-am spus functiei Left sa afiseze primele 4(caracterul definit de noi) caractere din sirul respectiv.

Right() - la fel ca si Left se foloseste pentru a taia  o parte dintr-un sir de caractere incepand din dreapta spre stanga pana la caracterul definit de noi. Exemplu: Right(“SIMPLE TEXT”, 4) va rezulta textul TEXT, explicatia de la Left este valabila si aici. Practic functia Right() incepe numaratoarea de la ultimul caracter spre primul caracter in ordine crescatoare(T-1, X-2, E-3, T-4).

Mid() - aceasta functie o vom folosi mai putin, ea taie un sir de caractere folosind doua puncte, fata de Right si Left. Exemplu: Mid(“SIMPLE TEXT2″, 7, 11) va rezulta

Page 69: tutoriale vba

textul TEXT, deoarece functia mid incepe sa afiseze caracterele incepand cu al 7-lea caracter(in exemplu al 7-lea caracter este spatiul) pana la al 11-lea caracter(ultimul “T” din cuvantul TEXT).

InStr() - se foloseste pentru a cauta un anumit caracter/sir de caractere/cuvant intr-un text mai lung. Exemplu: InStr(Textbox1.text, “text“) va rezulta pozitia cuvantului text in textul introdus in casuta Textbox1, in cazul in care acesta exista, daca nu exista va rezulta 0(zero).

Acuma, sa facem un exercitiu simplu folosind functiile Len(), Left(), Right(), InStr().

In programul urmator vom folosi:

Un Label Un Textbox

Un CommandButton

Dupa ce am aranjat putin cele trei elemente, programul meu arata asa:

Partea de cod va fi ceva mai lunga, deoarece vom desparti numele de prenume si afisa. Deci, dublu-click pe butonul Afiseaza Informatii , pe prima linie Option Explicit iar apoi in Subrutina butonului nostru:

Dim nume As String

Dim prenume As String

Dim lungimetext As Integer

Dim spatiu As Integer

 

lungimetext = Len(TextBox1.Text)spatiu = InStr(TextBox1.Text, " ")prenume = Left(TextBox1.Text, spatiu - 1)nume = Right(TextBox1.Text, lungimetext - spatiu)

Page 70: tutoriale vba

Label1.Caption = Label1.Caption & "Numele dvs. este: " & nume & ", iar prenumele: " & prenume

Astfel, am declarat patru variabile: nume, prenume(String – sir de caractere), lungimetext, spatiu(Integer – numar real), apoi le-am dat valori: lungimetext a devenit lungimea textului, folosind functia Len, spatiu a devenit pozitia spatiului din sirul nostru de caractere(Prenume Nume) introdus in TextBox1 folosind functia InStr. Am lasat ce e mai greu la sfarsit:

prenume folosind functia Left va prelua textul de la pozitia 1(primul caracter) pana la pozitia spatiu-1(ultimul caracter din primul cuvant), am pus spatiu-1 nu spatiu, pentru ca nu am nevoie si de spatiu in prenumele meu.

nume folosind functia Right va prelua textul de la ultimul caracter introdus pana la pozitia spatiului. Dupa cum am explicat anterior, Right ia ultimul caracter ca fiind primul, penultimul ca fiind al doilea, etc.

Apoi am afisat totul in Label-ul nostru concatenand(unind) Label1.Caption cu variabilele nume si prenume, folosind semnele & inainte si dupa fiecare sir de text sau variabila.

Rezultatul acestui program a fost:

Microsoft Visual Basic #7 – despre Matrici/Vectori

Pentru inceput, o matrice nu este nimic altceva decat o variabila cu mai mult “spatiu”, se declara la fel: Dim matrice(x, y) as Integer -> unde x si y sunt dimensiunile.

In continuare vom face o matrice simpla patratica(5 randuri/5 coloane).

In program vom avea nevoie de un Label si un Buton(optional doua, pentru butorul End).

Page 71: tutoriale vba

Asa arata deocamdata programul meu, acuma Dublu-Click pe Populeaza si scriem codul:Option Explicit Private SubCommandButton1_Click()Dim matrice(4, 4) As IntegerDim i As IntegerDim j As Integer

For i = 0 To 4For j = 0 To 4matrice(i, j) = i & jLabel1.Caption = Label1.Caption & i & j & " "Next jNext iEnd Sub

Bun, acuma sa explic putin, in prima parte a codului am declarat variabilele si matricea/vectorul, apoi, am populat matricea cu numere de la 0 la 4 folosind o iteratie(For), astfel:

am luat coloana i=0 pana la 4, si l-am umplut cu numere de la 0 la 4, apoi, am luat randul j de la 0 la 4 si l-am umplut cu numere de la 0 la 4 folosind linia: matrice(i, j)=i & j care la coloana i si randul j va pune valoarea i si j(mai exact va pune numarul coloanei si numarul elementului din randul respectiv). Apoi, pentru a si afisa matricea noastra ne folosim de randul: Label1.Caption = Label1.Caption & i & ” “ ->care nu face altceva decat sa ia valoarea label-ului existent si sa adauge i si j si un spatiu pentru a arata mai bine matricea. Apoi folosim Next j si Next i pentru a face asta de la 0 la 4.

Page 72: tutoriale vba

Asa va arata matricea in momentul asta. Ceea ce vreau sa mai mentionez este:

am declarat matrice(4, 4) si ea este defapt o matrice 5×5 pentru ca in Visual Basic primul element dintr-o numaratoare este 0(zero)

Butonul Exist se face foarte simplu dând dublu-click pe el si scriind End

Succes!

Microsoft Visual Basic #matrici

In acest articol voi face o noua matrice care se foloseste de siruri de caractere pentru a afisa ceva, in acelasi timp ea va scrie valoarea elementelor intr-un label, unu cate unu.

Avem nevoie de un buton si un TextLabel, dupa ce le-am aranjat ele arata asa:

Dublu-click pe buton si scrieti codul de mai jos:

Dim matrice(3) As String

matrice(0) = "Ana"matrice(1) = "are"

Page 73: tutoriale vba

matrice(2) = "mere"matrice(3) = "frumoase"

For i = 0 To 3MsgBox matrice(i)Label1.Caption = Label1.Caption & " " & matrice(i)Next i

Am definit o matrice simpla de cu 3 elemente(+1 pentru ca numerotarea incepe de la 0). Apoi le-am definit cu matrice(0), matrice(1), matrice(2), matrice(3), apoi am facut o simpla iteratie care sa ia toate numerele de la 0 la 3 si sa imi afiseze un MsgBox  cu valoarea elementului din matrice la punctul i. (matrice(i)), totodata am facut sa afiseze si in TextLabel rezultatul, am luat valoarea actuala a Label-ului si am unit-o cu un spatiu gol si matricea in punctul i.

  HomeExplore

azaUplo

adUsername / Parola inexistente

 

Partea superioară a machetei

Am uitat parola x Creaza cont nou

Administratie

Arta culturaBiologieCasa gradinaDiverseEconomieGeografieGradinitaIstorieJurnalismLimbaLiteratura romanaManagementMedicinaPersonalitatiProfesor scoalaSociologieStiinta Arhitectura constructii AstronomieChimie Drept Fizica

Mediul de programare VISUAL BASICInformatica

Mediul de programare VISUAL BASIC

1.1.

 

ALTE DOCUMENTE

Sortare folosind "qsort()" Virtual Dub XPAntiSpy 3.41 FORCARE Plotarea Allplan Recunoasterea componentelor electronice Topologie wireless Tehnologia informatiei (IT) MS-DOS Concepte de baza ale Tehnologiei Informatiei test

Page 74: tutoriale vba

Informatica Abbyy finereader Accessphotoshop Autocadde date C Dc ExcelFoxpro HardwareJava Linux OracleRetele Sql Visual basicWindows Word Matematica Stiinte politice TutorialsTehnica mecanicaTimp liber

Introducere in mediul de programare Visual BasicVISUAL BASIC este un limbaj de programare 17117l1120r de inalt nivel facindu-si pentru prima data aparitia in prima sa versiune DOS numita BASIC (Beginers' Allpurpose Symbolic Instruction Code). El este cel mai prietenos si cel mai usor de invatat limbaj de programare 17117l1120r . Diferite companii produc software sub diferite versiuni BASIC, printer care enumeram:

        Microsoft QBASIC furnizat o data cu sistemul de operare Windows 95, 98.

        QuickBASIC

        GWBASIC

        IBM BASICA

VISUAL BASIC este un limbaj de programare VISUAL operind intr-un mediu grafic bazat pe reprezentari sub forma de obiecte pe cind ascendentul sau BASIC este un limbaj de programare 17117l1120r ce opereaza intr-un mediu de programare text, programul executindu-se secvential.

Un program VISUAL BASIC este o colectie de subprograme , fiecare cu codul sau de program ce poate fii executat independent si simultan, si care pot fii legate intre ele intr-un mod sau altul.

In momentul lansarii in executie VISUAL BASIC 6 va afisa un ecran care permite:

Putem alege una dintre urmatoarele optiuni:

        Creerea unui nou proiect

        Deschiderea unui proiect existent

        Selectia unei liste a recentelor programe deja deschise

Un proiect reprezinta o colectie de fisiere care compun un anumit tip de aplicatie. Obiectivul prioritar este de a creea programe standard executabile, cu extensia .EXE.

Prin urmare vom executa clic pe icoana Standard EXE pentru a intra in mediul de programare VISUAL BASIC.

Page 75: tutoriale vba

1.2. Manipularea datelor in VISUAL BASICPentru a manipula cu usurinta datele, precum:

nume adrese

bani

datele

evolutia pe piata bursiera a stocurilor

statistici

VISUAL BASIC imparte datele in doua tipuri diferite:

        Date numerice

        Date nenumerice

       

1.3. Date numerice Datele numerice au la baza numerele si sint impartite in sapte mari tipuri, precum in tabela 1.1.

Tabela 1.1.: Tipuri de date numerice 

TIP FORMAT   GAMA DE REPREZENTAREByte 1 byte 0 to 255Integer 2 bytes -32,768 pina la 32,767Long  4 bytes -2,147,483,648 pina la 2,147,483,648

Single 4 bytes

-3.402823E+38 pina la -1.401298E-45 pentru valori negative1.401298E-45 pina la 3.402823E+38 pentru valori pozitive

Double 8 bytes

-1.79769313486232e+308 pina la -4.94065645841247E-324 pentru valori negative 4.94065645841247E-324 pina la 1.79769313486232e+308 pentru valori positive

Currency 8 bytes-922,337,203,685,477.5808 pina la 922,337,203,685,477.5807

Decimal 12 bytes +/- 79,228,162,514,264,337,593,543,950,335

+/- 7.9228162514264337593543950335 (28 pozitii

Page 76: tutoriale vba

zecimale).

1.4. Tipuri de date nenumericeSint prezentate in Tabela 1..2.

Tabela 1.2.: Tipuri de date nenumerice

TIPUL DE DATE FORMAT GAMA DE REPREZENTARE

String(lungime fixa)Lungimea unui string

1 pina la 65,400 caractere

String(lungime variabila )

Lungimea + 10 bytes

0 pina la 2 miliarde caractere

Date 8 bytesIanuarie 1, 100 pina in Decembrie 31, 9999

Boolean 2 bytes True sau FalseObject 4 bytes Orice obiect compus

Variant (numeric) 16 bytesOrice valoare mai mare decit Double

Variant (text)Lungimea+22 bytes

La fel ca si un string variabil

1.5. Utilizarea sufix-urilor in reprezentarea datelorUneori avem nevoie sa adaugam in fata datelor cite un sufix astfel incit VB poate manipula cu acuratete aceste date in timpul efectuarii calculelor. Aceste sufixuri sint prezentate in Tabela 1.3.

Tabela 1.3: Sufix-uri utilizate in reprezentarea datelor

SUFIXTIP DE DATE

& Long! Single# Double@ Currency

Sirurile de caractere (oricare caracter precum numere, date si simboluri) sint incluse intre doua apostrofuri, iar datele de tip Date sint incluse intre doua semne #.

Page 77: tutoriale vba

1.6. Manipularea Variabilelor Variabilele reprezinta locatii de memorie RAM pentru incarcarea temporara a datelor. In Visual Basic fiecare variabila poarta un nume, precum a, b, c, d, i, k, lungime, latime, raza, volum, etc., care respecta urmatoarele reguli:

        Trebuie sa fie mai mici decit 255 caractere

        Nu sint permise spatii intre caractere

        Nici un nume nu incepe printr-un numar

        Punctul nu este permis in cadrul sirului de caractere

Example de variabile valide si invalide sint prezentate in tabela 1.4 .

Tabela 1.4.: Variabile valide si invalide

VALID NAME INVALID NAMEComenzi_IPA Comenzi.IPA  Acest trimestru 7ABC

Client_Date_Personale_ContractNick&fratele                *& is not acceptable

 

1.7. Declararea VariabilelorDeclararea unei variabile consta in specificarea numelui sau si al tipului de date careia ii apartine. In Visual Basic declararea variabilelor are loc inainte ca acestea sa fie utilizate. Ele sint de obicei declarate in sectiunea ferestrei de code utilizind instructiunea Dim (dimensiune) si au formatul urmator:

Dim numele variabilei as Tip de date

Exemple de declarare a unor variabile putem da:

Dim numeutilizator as String ( declararea sirului de caractere "Viorel")Dim parola as String (declararea sirului de caractere "Vasile")Dim primuloperand as Integer (declararea variabilei cu valori intregi primuloperand)Dim rezultat as Integer (declararea variabilei cu valori intregi rezultat)Dim raza as Integer (declararea variabilei cu valori intregi raza)Dim datanasterii as Date (declararea varaiabilei de tip Date datanasterii)

Page 78: tutoriale vba

In sectiunea de cod unde efectuam declararea lor putem scrie aceste variabile pe aceiasi linie sau pe mai multe linii, grupate intre ele si separate printr-o virgula ca de exemplu:

Dim numeutilizator, parola as String

Dim primuloperand, rezultat, raza as Integer

Dim datanasterii as Date

Daca tipul de data nu este specificat Visual Basic automat va declara variabila respective de tip Variant. Pentru declararea unui sir de caractere exista doua formate posibile, unul de lungime variabila iar celalalt de lungime fixa, precum in exemplele de mai jos:

Dim numeutilizator as String (lungime variabila)

Dim parola as String * 9, unde 9 defineste numarul de caractere al sirului, care nu poate fii depasit.

1.8. Asignarea valorilor Variabilelor  Dupa declararea diferitelor variabile cu ajutorul instructiunii Dim vom putea asigna valori acestor variabile, utilizind urmatorul format general:

Variabila = Expresie

unde Variabila poate fii oricare dintre variabilele declarate anterior , iar Expresie ar putea fii o expresie matematica, un numar (initializare), un sir de caractere, o valoare logica booleana (true si false), etc, precum in exemplele de mai jos:

primuloperand = 100 (initializarea variabilei operand)rezultat = 3*primuloperand +100

numeutilizator = "Viorel" parola.Text = parolaLabel1.Visible= true Command1.Visible = false Label4.Caption = textbox1.Text raza = Val(usernum1.Text)

1.9. Operatori in Visual Basic

Pentru efectuarea calculelor aritmetice si generarea de rezultate pentru utilizator vom utiliza diferiti operatori matematici, precum cei prezentati in tabela 1.9.

Page 79: tutoriale vba

Tabela 1.9: Operatori utilizati in Visual Basic

OPERATOR FUNCTIE MATEMATICA EXEMPLU

^ Exponentiala 3^4=81

* Multiplicare 5*4=20

/ Impartire 16/2=8

ModImpartire cu rest (returneaza

doar restul impartirii cu numere intregi)

10 Mod 3 = 1

\Impartire intre numere integi cu

rest ( returneaza doar citul neglijind zecimalele)

21\5=4

+ or & Concatenare sir"Visual"&"Basic"="Visual

Basic"

In afara acestora mai sint si operatorii logici AND, NOT, OR in cazul operarii cu expresii logice booleene.

1.10 Instructiuni de control

1.10.1 Controlul Structurilor        Multe dintre sarcinile implicate in programare sint repetitive

        Orice sarcina care poate fii calculata poate fii construita utilizind constructori:

        secventa     (realizeaza o secventa de actiuni)

        conditie    (daca o conditie este indeplinita atunci se poate trece la realizarea actiunii, in caz contrar se va executa cu totul altceva)

        repetitie     (repeta o operatie)

        Ramificare conditionata

       

        Instructiunea If Else

Bucle (Loops)o Bucla Do

contor = 0

Do Until contor = 1000         contor = contor + 1        MsgBox contor

Page 80: tutoriale vba

Loop

o Bucla Do While

contor = 1

Do        MsgBox contor        contor = contor+ 1Loop While contor < 1001

Select Case

Este utilizata pentru selectarea unei alternative dintre toate cele existente si are urmatorul format general:

Select Case expresie

   Case valoare1        Bloc cu una sau mai multe instructiuni Visual Basic Case valoare2 Bloc cu una sau mai multe instructiuni Visual Basic    Case valoare3 Bloc cu una sau mai multe instructiuni Visual Basic          ...    Case Else Bloc cu una sau mai multe instructiuni Visual Basic      End Select

Tipul de date specificat in expresie trebuie sa fie acelasi din Case valoare

Cuvintul cheie Is este utilizat aici pentru impunerea de conditii in cazul datelor

1.11. Functii in VISUAL BASIC Functiile sint similare cu procedurile normale, rolul lor fiind acela de a accepta anumite valori pentru parametrii de intrare si apoi trecerea acestora in programul principal pentru terminarea executiei. Distingem doua tipuri de functii, functii de biblioteca (interne) si functii create de programator. Formatul general al unei functii este de forma:

Numelefunctiei(argumente)

unde argumentele sint valorile parametrilor ce trebuiesc trecute prin functie programului principal. In cele ce urmeaza vom prezenta doua dintre cele mai utilizate functii interne in programarea Visual Basic MsgBox( ) si InputBox( ).

Page 81: tutoriale vba

1.11.1 Functia MsgBox ( ) Rolul functiei MsgBox( ) este de a produce un "pop-up" caseta de mesaj si a invita (prompt) utilizatorul sa execute mai inti un clic pe butonul de comanda inainte de a continua. Formatul unei caste de mesaj este de forma:

1.11.2 Functia InputBox( ) Functia InputBox( ) afiseaza o caseta de mesaj unde utilizatorul poate introduce o valoare sau mesaj sub forma de text, avind urmatorul format:

RezultatMsg = InputBox(Prompt, Title, default_text, x-position, y-position)

RezultatMsg este o variabila de tip variant care de obicei este declarata ca sir de caractere, ce accepta mesajul de intrare introdus de utilizator. Argumentele functiei au urmatoarea semnificatie:  

        Prompt       - Mesaj afisat normal ca o intrebare

        Title            - Titlul casetei de intrare (Input Box).

        default-text - Textul prestabilit care apare in cimpul de intrare

        x-position si y-position -pozitia sau coordonatele casetei de intrare

        Interfata

        Codul Procedurii pentru butonul OK

1.11.3 Creerea Functiilor proprii ( externe, de catre programatori)Formatul general al functiei este de forma:

Public  Function functionName (Arg As dataType,..........) As dataType

sau

Private  Function functionName (Arg As dataType,..........) As dataType

unde Public semnifica faptul ca functia este valabila in intregul program  pe cind Private semnifica ca functia este aplicabila numai la anumite module sau proceduri.

Page 82: tutoriale vba

Document Info

Accesari: 2752 Apreciat:

Comenteaza documentul:

Nu esti inregistrat Trebuie sa fii utilizator inregistrat pentru a putea comenta

Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca meritasa adaugi un link catre el la tine in site

Copiaza codulin pagina web a site-ului tau.

Copyright © Contact (SCRIGROUP Int. 2013 )

Autentificare sau înregistrare

Acasă Forumuri > Cu mâna pe claviatură > Programare, administrare si securitate >

Visual Basic ProgrammingDiscuție în 'Programare, administrare si securitate' începută de Sniffer, 29 Iulie 2002.

Pagina 2 din 3 < Prec 1 2 3 Următoarea > 1. animaluts back from the dead

Oleg , tu ce Windows ai ?

animaluts, 19 August 2002

#21

Page 83: tutoriale vba

2. imported_Oleg Membru nou

Daca m-ai intrebat in Windows: XPDar pe deasupra mai tin shi Linux Mandrake (ca n-am alt distributiv) ... cine are SuSE ... raspundetzi va rog!

imported_Oleg, 19 August 2002

#22

3. Mask Membru nou

Pentru Sniffer

Deci uite care este raspunsul meu:1.In primul rind se socoate ton foarte urit sa folosesti GoTo in program. Straduite sa nu le folosesti sau sa reduci folosirea lor la minim.2. Excellul intelege variabilele, trebuie doar sa le folosesti corect. De exemplu:-------------Cum e incorect-------------Range("a+1:2").Select Selection.Copy Range("a").Select ActiveSheet.Paste

--------------Cum e corect--------------Range(Str(a + 1) + ":2").SelectSelection.CopyRange(Str(a)).SelectActiveSheet.Paste-----------------Lamurire----------------Ca argument pentru Range tu ii dai o valoare textuala "a+1:2", adica tu nu folosesti variabila _a_(sa presupunem ca a este egal cu 4) in argumentul tau si ca rezultat Range primeste ca argument exact stringul "a+1:2" in loc de "5:2".

Pentru ca variabila _a_ sa fie folosita in expresia ta care este trimisa ca argument pentru Range, trebuie sa formez un string care o sa contina datele din variabila. In primul rind tu calculezi a+1 si primesti 5. In aldoilea rind transferi numarul 5 in stringul "5" folosind functia Str. In altreilea rind concatenezi stringul "5" cu stringul ":2" si ca rezultat primesti exact un string "5:2" care este trimis ca parametru.

La fel si in cazul cind tu trimiti "a" ca argument pentru Range. Daca vrei sa trimiti valoarea textuala a variabilei _a_ atunci foloseste functia Str pentru ca sa o transformi in tip text.

Mask, 19 August 2002

#23

Page 84: tutoriale vba

4. Sniffer Seeking serial monogamy

Mersi mult , o sa vad cum iese si iti scriu !

Sniffer, 20 August 2002

#24

5. Sniffer Seeking serial monogamy

Da cum faci daca si a doua cifra tre sa fie o variabila ?

Exemplu :

========================Range(Str(a + 1) + ":2").Select Selection.Copy Range(Str(a)).Select ActiveSheet.Paste ========================

Daca in loc de 2 tre sa fie o variabila ca in exemplul lui a+1 , atunci cum scriu ca am incercat asa dar nu a mers :

sa zicem ca 2 sta in loc de d========================Range(Str(a + 1) + ":"Str(d)).Select Selection.Copy Range(Str(a)).Select ActiveSheet.Paste ========================

Am crezut ca asa trebuie , dar nu merge !Ce fac ?

Sniffer, 20 August 2002

#25

6. Mask Membru nou

Concatenarea unui string in VB

Aproape e corect. Numai ca incearca sa evaluezi parametrul care tu il trimiti Str(a + 1) + ":"Str(d) - ce avem aici? Un string care e Str(a+1), alt string care e ":" si altreilea string care e Str(d). Acuma scopul nostru e sa le concatenam pe toate 3. Concatenarea a stringurilor in VB se face cu ajutorul operatorului +, adica pentru a concatena Str(a) si ":" si Str(b) trebuie sa scriem urmatoarea expressie: Str(a)+":"+Str(d)

Page 85: tutoriale vba

Tu ai scapat plusul din expresie

Mask, 21 August 2002

#26

7. Sniffer Seeking serial monogamy

Chestia e ca am incercat varianta , dar nu a mers ! Daca ai alta varianta , zii , dar oricum vad eu , poate am gresit ceva si revin !

Sniffer, 21 August 2002

#27

8. Mask Membru nou

La mine totul a mars, controleaza sintaxa.

Mask, 21 August 2002

#28

9. Sniffer Seeking serial monogamy

O.k. Iata chestia. Eu am incercat mai multe variante dar nu mi-a iesit cum trebuie , asa ca o sa-ti explic ce tre sa fac si daca o sa ai ceva timp incearca sa vezi de poti face Modulul , o.k. ?

Des. 1

Deci , sa zicem ca introducem in celula I2 numarul ce trebuie sters din tabela , ex : 4 . modulul tre sa verifice in ce rind se afla numarul 4 si sa copie toate rindurile urmatoare , adica 5 , 6, etc. peste acesta . Adica daca 4 se afla la B7 atunci toate rindurile incepind cu B8 in jos sa le copie in B7 ! Sper ca ai inteles . Tre sa iasa ceva de tipul :

Des. 2

Sper ca ai observat diferenta . Rindul 5 si 6 sau mutat mai sus , numerele se schimba automat ! Dar cum sa fac sa le copii ? Cum sa fac sa iasa cea ce am in Des. 2 ?! :-?

Sniffer, 22 August 2002

#29

10.Mask Membru nou

Page 86: tutoriale vba

Intrebari

Am citeva intrebari:1. Numerele celea(1,2,3,4,5, etc.) tot timpul o sa fie in colonitsa B si o sa starteza din celula 3, adica tot timpul numarul 1 o sa fie in b4, numarul 2 o sa fie in b5, numarul n o sa fie in bn+3? 2. Cum se inscriu numerele in celule? Ai vre-o formula ca celulele sa fie pline? Adica B5=B4+1? Sau le introduci manual?

Mask, 22 August 2002

#30

11.Sniffer Seeking serial monogamy

Da , ai inteles corect . Numerele vor fi in B . Conform la intrebarea cu formula , si asta e corect . Fiecare celula aduna +1 la valoarea celulei precedente ! Si o sa inceapa din celula a treia , adica de la B4 numerele !

Sniffer, 22 August 2002

#31

12.Mask Membru nou

Cam asa tre sa arate codul:

Sub GoRemove()Dim ln As IntegerDim i As IntegerDim rx, ry, column As Integerrx = 9 ' coloana unde se afla numarul rinduui care tre de stersry = 2 ' rindul unde se afla numarul rinduui care tre de sterscolumn = 2 ' rindul in care se afla coloana cu numerele rindurilor din lista

ln = Cells(ry, rx) ' in ln bagam numarul rindului care tre de sters' creem un ciclu care gaseste rindul care tre de stersi = 1While Cells(i, column) &lt;> lni = i + 1Wend

' stergem rindul si mutam rindurile de mai jos in susRows(i).SelectSelection.Delete Shift:=xlUp' renumerotam rindurileWhile Cells(i, column) &lt;> ""Cells(i, column) = lni = i + 1ln = ln + 1

Page 87: tutoriale vba

Wend

End Sub

Mask, 22 August 2002

#32

13.Sniffer Seeking serial monogamy

Mersi , acus incerc !

Sniffer, 22 August 2002

#33

14.Sniffer Seeking serial monogamy

' renumerotam rindurileWhile Cells(i, column) &lt;> ""Cells(i, column) = lni = i + 1ln = ln + 1Wend

In rindul acesta imi da greseala ! Adica e colorat in galben ! Poate nu ai notat corect "" , adica poate celula goal se noteaza altfel ?![/code]

Sniffer, 22 August 2002

#34

15.Sniffer Seeking serial monogamy

' renumerotam rindurileWhile Cells(i, column) &lt;> ""Cells(i, column) = lni = i + 1ln = ln + 1Wend

In rindul acesta imi da greseala ! Adica e colorat in galben ! Poate nu ai notat corect "" , adica poate celula goal se noteaza altfel ?!

Sniffer, 22 August 2002

#35

16.Mask Membru nou

Page 88: tutoriale vba

Care este mesajul greselei?La mine merge fine!

Mask, 22 August 2002

#36

17.Sniffer Seeking serial monogamy

Error

Type mismatch !

Sniffer, 22 August 2002

#37

18.Mask Membru nou

hm ... straniu ...ok, scrie dara Str(Cells(i, column)) in loc de Cells(i, column)

Mask, 22 August 2002

#38

19.Sniffer Seeking serial monogamy

si inca ceva ... daca lasi Celula 2,9 goala atunci modulul sterge rindurile goale de inainte de tabel . Cum faci sa scrii un If de tipul ...

.........ln = Cells(ry, rx) ' in ln bagam numarul rindului care tre de stersIf ln = "" ThenGoTo 1:ElseEnd If ' creem un ciclu care gaseste rindul care tre de stersI = 1.........

1: sub end

sau o alta varianta care sa nu stearga celule de inainte ci sa sara peste ele ?

Sniffer, 22 August 2002

#39

Page 89: tutoriale vba

20.imported_Adrenalin Cu Tractorashu:)

O intrebare din VB

Cum sa aflu cite simboluri ex.":" sunt intro variabila shi de exemplu imi trebuie sa aflu fiecare simbol al citilea este in string Sper ca ma inteles cineva Functia InStr arata numai primul simbol gasit dar daca eu vreau sa aflu pe al-2-lea ? :roll:

imported_Adrenalin, 4 Septembrie 2002

#40

(Trebuie să te autentifici sau înregistrezi pentru a răspunde.) Pagina 2 din 3 < Prec 1 2 3 Următoarea >

Publică această pagină

Acasă Forumuri > Cu mâna pe claviatură > Programare, administrare si securitate >

Acasă Forumuri

o Caută în forumuri

o Ce e nou?

Albume

Ajutor

We.mdRomână (RO)

Contactează-ne Acasă

În sus

RSS

XenForo™ ©2011 XenForo Ltd.

Page 90: tutoriale vba

Biologie Chimie Didactica Fizica Geografie Informatica

Istorie Literatura Matematica Psihologie

Informatica» Prelucrarea fisierelor in Visual Basic

Prelucrarea fisierelor in Visual Basic

Prelucrarea fisierelor in Visual Basic

In prima versiune de Visual Basic, fisierele au fost prelucrate folosind instructiunea Open si alte instructiuni si functii inrudite. Aceste mecanisme sunt suportate complet in Visual Basic 6.0, insa ele pot fi inlocuite, eventual, prin utilizarea modelullui obiectului FSO (File System Object).

Daca proiectati aplicatia dumneavoastra pentru utilizarea bazelor de date, nu veti avea nevoie sa asigurati accesul direct la fisiere. Controlul de date si controalele legate permit citirea si scrierea datele din si in baza de date; acest procedeu este mult mai usor de folosit de cat utilizarea tehnicilor de acces direct la fisiere.

Tipuri de acces la fisiere

contine, de fapt, o succesiune de bytes stocati pe disc. Cand aplicatia acceseaza un fisier, ea trebuie sa presupuna ca bytes reprezinta caractere, numere, siruri s.a.m.d.

In functie de tipul de date pe care le contine fisierul, trebuie sa folositi tipul potrivit de acces la fisiere. In Visual Basic, exista trei tipuri de acces la fisiere:

— Pentru citirea si scrierea fisierelor text in blocuri continui.

Informatica

Access

Adobe photoshop

Autocad

Baze de date

C

Calculatoare

Corel draw

Excel

Foxpro

Html

Internet

Java

Linux

Mathcad

Page 91: tutoriale vba

Matlab

Outlook

Pascal

Php

Powerpoint

Retele calculatoare

Sql

Windows

Word

Concepte ale controlului automat in sistemele de control timp real - controlul operational

Macromedia Dreamweaver

Programe informatice

UNITATEA DE DISC FLEXIBIL(UDF)

Fundamentele programarii - probleme

TINERET SI PUTERE SOFT ROMANEASCA

VISUAL BASIC - TEST GRILA

Inginerie Software - Definirea si specificarea cerintelor soft

LISTE CIRCULARE SIMPLU INLANTUITE

SISTEME DE OPERARE

Page 92: tutoriale vba

Aleator (random) — Pentru citirea si scrierea fisierelor text sau binare cu inregistrari de lungime fixa.

— Pentru citirea si scrierea fisierelor structurate arbitrar.

Accesul secvential este destinat prelucrarii fisierelor de text simple. Acessul secvential presupune ca fiecare caracter din fisier reprezinta fie un caracter de text fie o secventa de formatare a textului (cum ar fi, un caracter de linie noua). Datele sunt stocate drept caractere ANSI.

Fisierul deschis in acces aleator (sau acces direct) se presupune ca este format din inregistrari (articole) de lungime fixa identice. Puteti folosi tipuri de date definite de utilizator pentru a crea articole cu numeroase campuri; fiecare camp putand avea un tip diferit de date. Datele sunt stocate ca informatii binare.

va permite sa utilizati fisiere pentru a stoca orice informatie vreti. Ele sunt similare fisierelor in acces aleator, cu exceptia faptului ca nu se face nici o prezumptie privind tipul de date sau lungimea inregistrarilor. Totusi, pentru regasirea corecta a datelor trebuie sa cunoasteti cum au fost stocate datele.

Functiile si instructiunile ce se pot utiliza pentru accesul la fisiere

In tabelul urmator sunt prezentate pe scurt principalele instructiuni ce se pot utiliza pentru accesul la un fisier:

DescriereAsigura executarea operatiilor de intrare/iesire asupra unui fisier.

Incheie operatiile de intrare/iesire pentru un fisier deschis cu instructiunea Open.Citeste intr-o variabila datele dintr-un fisier disc deschis cu instructiunea Open.Scrie datele dintr-o variabila intr-un fisier pe disc deschis cu instructiunea Open.Citeste datele dintr-un fisier deschis in acces secvential si le atribuie unor variabile. Citeste o singura linie dintr-un fisier secvential deschis si o atribuie unei variabile de tip String.

Scrie intr-un fisier cu acces secvential datele formatate pentru afisare.

Scrie intr-un fisier variabilele precizate separandu-le prin virgule si incadrand intre ghilimele sirurile de caractere.Sterge un fisier de pe discRedenumeste un fisier, director sau dosar. Stabileste pozitia pentru urmatoarea operatie de citire/scriere intr-un fisier deschis cu instructiunea Open Declara un tip de data definit de utilizator.

Principalele functii utilizate in prelucrarea fisierelor sunt prezentate in urmatorul tabel:

Returneaza un intreg reprezentand valoarea booleana True cand s-a intalnit sfarsitul de fisier in cazul unui fisier deschis pentru acces secvential sau aleator. Returneaza un sir continand caracterele citite dintr-un fisier deschis in modul Input sau Binar.Returneaza un intreg lung repezentand lungimea, in bytes, a unui fisier deschis cu instructiunea Open.Returneaza un intreg lung care specifica pozitia curenta de citire/scriere dintr-un fisier deschis cu instructiunea

Page 93: tutoriale vba

Returneaza un intreg lung care specifica pozitia curenta de citire/scriere intr-un fisier deschis.Returneaza un intreg lung care specifica lungimea, in bytes, a unui fisier.Returneaza un intreg care reprezinta urmatorul numar de fisier disponibil pentru utilizare intr-o instructiune Open.

Tabelul urmator prezinta principalele instructiuni si functii disponibile in functie de tipul de acces la fisier:

& FunctiiTipul de acces

Secvential Aleator

Binar

X X X- X XX - XX - -X - -X X XX - -- X X- X -X - -

Fisiere in acces secvential

Accesul secvential lucreaza cel mai bine cand vreti sa prelucrati fisiere ce contin numai text, cum ar fi fisierele create cu un editor obisnuit de text (WordPad, Notepad) – adica, fisiere in care datele nu sunt organizate intr-un sir de inregistrari. Accesul secvential nu este indicat pentru stocarea unui sir de numere, deoarece fiecare numar este memorat ca un sir de caractere. Spre exemplu, un numar de 4 cifre va necesita pentru memorare 4 bytes, in loc de 2 bytes cat ar fi nevoie pentru a stoca numarul respectiv ca un intreg codificat binar..

Deschiderea fisierelor pentru acces secvential

Cand deschideti un fisier pentru acces secvential, puteti sa executati una din urmatoarele operatii:

Citirea caracterelor dintr-un fisier (modul Input);

Scrierea caracterelor intr-un fisier (modul Output)

Adaugarea caracterelor intr-un fisier (modul Append)

Pentru a deschide un fisier in acces secvential se foloseste o instructiune Open a carei sintaxa este:

Open <nume> For <mod> As #<nrfisier> [Len = <lng>]

O expresie de tip String care specifica un nume de fisier, putand include directorul/dosarul si unitatea in care se gaseste fisierul.Un cuvant cheie care specifica modul de deschidere al fisierului. Poate fi unul din urmatoarele cuvinte

Page 94: tutoriale vba

cheie: Input (citire), Output (scriere) sau Append (adaugare).

Un numar corect de fisier, cuprins intre 1 si 511. Se foloseste pentru a specifica fisierul in instructiunile si functiile de prelucrare a fisierului respectiv. Un intreg, cel mult egal cu 32767 (bytes), care se poate utiliza in cazul fisierelor secventiale pentru a preciza numarul de caractere din zona tampon (buffer).

Cand un fisier secvential este deschis pentru citire (modul Input), el trebuie sa existe, in caz contrar se produce o eroare de executie.

Cand incercati sa deschideti un fisier secvential inexistent pentru scriere (modul Output) sau adaugare (modul Append), instructiunea Open creaza mai intai fisierul specificat si apoi il deschide.

Argumentul optional Len specifica numarul de caractere ce se pastreaza in buffer atunci cand se copiaza datele intre fisier si programul dumneavoastra.

Dupa deschiderea unui fisier secvential pentru o operatie de citire, scriere sau adaugare trebuie sa-l inchideti, folosind instructiunea Close, inainte de-al redeschide pentru un alt tip de operatie.

Scrierea datelor in fisierele secventiale

Pentru a stoca intr-un fisier secvential continutul unor variabile se executa urmatoarele operatii:

Se deschide fisierul respectiv pentru o operatie de scriere sau adaugare. Spre exemplu pentru a scrie in fisierul Test.dat continutul unei variabile numite sLinie, deschiderea fisierului se poate realiza astfel:

Open “Test.dat” For Output As #1

Se foloseste instructiunea Print # sau Write # pentru a transmite in fisier continutul variabilei sLinie, astfel:

Print #1, sLinie

Write #1, sLinie

Instructiunea Write # permite scrierea intr-un fisier a unei liste de expresii numerice si/sau siruri de caractere. In fisiere, valorile fiecarei expresii se separa prin virgule, iar sirurile de caractere sunt incluse intre ghilimele. Spre exemplu, segmentul de cod:

Dim sNume As String, iNumar As Integer

sNume = ”Ionescu Vasile”

Page 95: tutoriale vba

iNumar = 24536

Write #1, sNume, iNumar

va scrie in fisierul desemnat prin numarul de fisier #1 urmatoarea inregistrare:

“Ionescu Vasile”,24538

inclusiv toate semnele de punctuatie.

Folosirea instructiunilor Write # si Input # pentru scrierea si respectiv citirea fisierului secvential simuleaza accesul direct sau binar la fisier. Ele sunt foarte indicate atunci cand vreti sa folsoiti date organizate in inregistrari (sau articole) fara a folosi un tip de data definit de utiliztor.

Sintaxele instructiunilor Print # si Write # sunt identice:

Print | Write #<nr.fisier>, [<lista_iesire>]

<nr.fisier>Numarul cu care a fost deschis fisierul.

<lista_iesire Lista variabilelor a caror continut se va scrie in fisier. In lista variabilele se vor separa prin virgule.

Citirea datelor din fisierele secventiale

Pentru prelucrarea continutului unui fisier secvential se executa urmatoarele operatii:

Se deschide fisierul pentru o operatie de citire. Spre exemplu, pentru deschiderea fisierului Test.dat din exemplu anterior se va folosi o instructiune Open de forma:

Open “Test.dat” For Input As #1

Se folosesc instructiunile Line Input # sau Input # sau functia Input() pentru a citi datele intr-o variabila de program. Spre exemplu, pentru a citi datele din fisierul Test.dat intr-o variabila numita sLinie se poate utiliza una din urmatoarele linii de cod:

Line Input #1, sLinie

Input #1, sLinie

Page 96: tutoriale vba

sLinie = Input(10, #1)

Input() poate fi folosita pentru a citi intr-o variabila orice numar de caractere dintr-un fisier secvential. Sintaxa apelului functiei Input() este urmatoarea:

<nr.carcatere>, [#]<nr.fisier>)

<nr.caractere> O expresie numerica corecta care specifica numarul de caractere ce se va returna.

<nr.fisier> Numarul de fisier asociat prin instructiunea Open.

Instructiunea Line Input # se foloseste in special atunci cand datele au fost scrise in fisier folosind instructiunea Print . Sintaxa instructiunii este:

Line Input #<nr.fisier>, <variabila>

<nr.fisier> Numarul cu care a fost deschis fisierul.<variabila> Numele variabilei, de tip String, in care se vor citi datele.

Instructiunea citeste o linie de caractere din fisier, adica toate caracterele intalinite pana la secventa carriage return – (secventa de coduri ASCII 13 si 10). Instructiunea Line Input # recunoaste aceasta secventa de coduri, atunci

cand se citeste o linie intr-o variabila, dar nu le pastreaza.

Instructiunea Input # permite citirea unei liste de valori numerice si/sau sir de caractere scrise intr-un fisier folosind instructiunea Write #. Sintaxa acestei instructiuni este:

<nr.fisier>, <lista_intrare>

<nr.fisier>Numarul asociat fisierului la deschidere.

<lista_intrareLista de variabile, separate prin virgule, in care se vor citi datele scrise intr-o inregistrare din fisier.

Fisiere in acces direct

Bytes din fisierele in acces aleator formeaza inregistrari (articole) identice; fiecare inregistrare putand contine unul sau mai multe campuri. O inregistrare cu un singur camp corespunde unui tip standard de data, cum ar fi un intreg sau un sir de

Page 97: tutoriale vba

lungime fixa. O inregistrare cu mai multe campuri corespunde unui tip de data definit de utilizator, folosind instructiunea Type

Definirea tipului de inregistrare

Inainte de a deschide un fisier pentru acces aleator trebuie sa definiti un tip care va corespunde inregistrarilor pe care le va contine sau se gasesc in fisier. Spre exemplu, pentru a prelucra un fisier ce contine sau va contine date despre persoane, trebuie sa declarati un tip de data definit de utilizator, numit Persoana astfel:

As Integer

As String * 15

As String * 15

As Date

As String * 30

As String * 20

As String * 2

As String * 11

Lungime, in bytes, a unei astfel de inregistrari este de 103 bytes (icodul ID de tip Integer ocupa 2 bytes, data nasterii de ocupa 8 bytes, iar sirurile ocupa spatiul precizat prin valorile atasate).

Declararea variabilelor

Pentru a putea prelucra datele dintr-un fisier in acces aleator este necesar sa declarati o variabila a tipului de data definit de utilizator asociat inregistrarilor din fisier, folosind una din instructiunile de declarare variabile. Spre exemplu:

Dim recAbonat As Persoana

declara o variabila locala a tipului Persoana.

Deoarece toate inregistrarile dintr-un fisier in acces aleator trebuie sa aiba aceeasi lungime, este util ca elementele de tip sir de caractere dintr-un tip de data definita de utilizator sa aiba o lungime fixa, asa cum s-a vazut in declaratia tipului

, unde spre exemplu, campurile Nume si Prenume au o lungime fixa de 15 caractere. Daca sirul real contine mai putine caractere de cat lungimea fixata pentru elementul de tip sir corespunzator, Visual Basic il va completa cu spatii. Daca insa, sirul este mai lung de cat dimensiunea campului, el va fi trunchiat.

Daca folositi siruri cu dimensiune variabila, marimea totala a oricarei inregistrari scrise cu instructiunea Put sau citite cu nu trebuie sa depaseasca lungimea inregistrarii declarate in clauza Len a instructiunii Open.

Page 98: tutoriale vba

Pentru a putea exemplifica in continuare utilizarea unor instructiuni pentru fisierele in acces direct vom considera ca in program au fost incluse urmatoarele linii de cod:

‘ Declararea unui tip de data definit de utilizator

As Integer

As String * 15

As String * 15

As Date

As String * 30

As String * 20

As String * 2

As String * 11

Dim artAbonat As Persoana ‘ Varibila a tipului Persoana

Dim iNrFisier As Integer ‘ Numarul asociat fisierului la deschidere

Dim lLungArt As Long ‘ Lungimea, in bytes, a inregistrarii

Dim lPozitie As Long ‘ Pozitia inregistrarii curente

Dim iUltimArt As Long ‘ Numarul ultimei inregistrari

lLungArt = LenB(artAbonat) ‘ Determina lungimea unei inregistrari

Aceste linii de cod asigura definirea unui tip de date, declararea unor variabile si determinarea lungimii, in bytes, a inregistrarilor fisierului.

Deschiderea fisierelor in acces aleator

Instructiunea Open necesara deschiderii unui fisier in acces aleator are urmatoarea sintaxa:

<nume_fisier> [For Random] As <nr.fisier> Len = <lung.art>

Numele fisierului ce va fi deschis in acces aleator. Poate fi un specificator complet de fisiere, adica numele si extensia fisierului va fi precedat de calea si unitatea de disc pe care se afla fisierul. Numarul de fisier (cuprins intre 1 si 511) asociat la deschiderea fisierului..Specifica lungimea, in bytes, a inregistrarii.

Page 99: tutoriale vba

Spre exemplu, pentru deschiderea fisierului Aleator.dat se poate folosi urmatoarea linie de cod:

Open 'Aleator.dat' For Random As iNrFisier Len = lLungArt

Deoarece accesul aleator este tipul prestabilit de acces la fisiere, cuvintele cheie For Random pot lipsi din instruciunea de deschidere a unui fisier in acces aleator.

Daca lungimea declarata (argumentul <lung.art>) este mai mica de cat lungimea articolului scris in fisier, se genereaza

Deoarece la deschiderea unui fisier in acces aleator nu se precizeaza tipul operatiei (de citire sau de scriere), fisierul repsectiv poate fi scris si/sau citit; deci intr-un fisier cu acces aleator se pot actualiza inregistrarile.

Editarea fisierelor deschise in acces aleator

Pentru a edita datele dintr-un fisier deschis in acces aleator trebuie parcurse urmatoarele operatii:

Deschiderea fisierului in acces aleator.

Pozitionarea pe inregistrarea de editat.

Citirea in variabile de memorie a inregistrarii de editat.

Modificarea valorilor din variabilele de memorie.

Rescrierea inregistrari editate.

Citirea inregistrarilor in variabile

Pentru a copia o inregistrare din fisier in variabile de memorie se foloseste instructiunea Get a carei sintaxa

#]<nr.fisier>, [<nr.art>], <variabila>

<nr.fisier>Numarul de fisier care a fost asociat la deschiderea fisierului.

<nr.art> Numarul articolului (expresie numerica de tip Long) care va fi citit. Reprezinta pozitia inregistrarii in fisier. Daca nu se precizeaza acest argument, se citeste inregistrarea curenta.

<variabila> Variabila de memorie in care sunt citite datele (o variabila a unui tip de data definit de utilizator).

Spre exemplu, pentru a citi inregistrarea curenta in variabila recAbonat de tip Persoana, declarate anterior, se

Page 100: tutoriale vba

poate folosi urmatoarea linie de cod:

Get #1, , recAbonat

Scrierea variabilelor in inregistrari

Pentru a scri o inregistrare intr-un fisier in acces aleator se foloseste instructiunea Put, a carei sintaxa este:

#]<nr.fisier>, [<nr.art>], <variabila>

<nr.fisier>Numarul de fisier care a fost asociat la deschiderea fisierului.

<nr.art>Numarul articolului (expresie numerica de tip Long) care va fi scris. Daca nu se precizeaza aceasta valoare, se scrie in pozitia curenta, adica dupa ultima inregistrare citita sau scrisa.

<variabila> Variabila din care sunt scrise datele (o variabila a unui tip de data definit de utilizator).

Spre exemplu, pentru scrierea continutului variabilei recAbonat de tip Persoana, declarate anterior, in inregistrareai cu numarul lPozitie se poate utiliza linie de cod urmatoare:

Put #1, lPozitie , recAbonat

Inlocuirea articolelor

Pentru a inlocui o inregistrare se foloseste o instructiune Put specificand pozitia (numarul de inregistrare) inregistrarii pe care vreti s-o inlocuiti. Spre exemplu, pentru a inlocui a 11-a inregistrare se va utiliza urmatoarea linie de cod:

Put #1, 11, recAbonat

Adaugarea de noi inregistrari

Pentru a adauga noi inregistrari la sfarsitul unui fisier deschis in acces aleator se folosec urmatoarele linii de cod:

lUltimArt = Lof(iNrFisier) / lLungArt + 1

Put #1, lUltimArt, recAbonat

Prima linie de cod determina numarul de inregistrari din fisier si-l majoreaza cu o unitate, pentru a putea scrie dupa ultima inregistrare din fisier. Functia Lof() determina lungimea, in bytes, a unui fisier deschis.

Stergerea inregistrarilor

Inregistrarile dintr-un fisier deschis in acces aleator nu pot fi sterse; se poate doar goli campurile, inregistrarea ramanand in continuare in fisier. Totusi operatia de stergere se poate simula executand urmatoarele operatii:

1. Se deschide un nou fisier.

Page 101: tutoriale vba

2. Din fisierul original se copiaza in noul fisier numai inregistrarile corecte.

3. Se inchid ambele fisiere.

4. Se sterge fisierul original folosind instructiunea Kill, a carei sinatxa este urmatoarea:

Kill <nume_fisier>

unde <nume_fisier> este o expresie sir de caractere care specifica numele fisierului ce se va sterge, putand include calea si unitatea unde se gaseste fisierul respectiv.

5. Se redenumeste noul fisier cu numele vechiului fisier folosind instructiunea Name, a carei sintaxa este urmatoarea:

Name <nume_fisier_vechi> As <nume_fisier_nou>

unde <nume_fisier_vechi> si <nume_fisier_nou> reprezinta numele vechiului fisier (putand include calea si unitatea unde se gaseste fisierul) si respectiv noul nume de fisier. Fisierul indicat prin <nume_fisier_nou> nu trebuie sa existe.

Cand prelucrati fisiere deschise in acces aleator trebuie sa respectati urmatoarele reguli:

Datele scrise in fisier cu instructiunea Put se citesc cu instructiunea Get.

Prima inregistrare dintr-un fisier deschis pentru acces aleator are <nr.art> egal cu 1, al doilea are <nr.art> egal cu 2, s.a.m.d. Daca in instructiunile Put sau Get omiteti <nr.art>, se scrie/citeste urmatoarea inregistrare dupa ultima prelucrata sau referita de catre ultimul apel al functiei Seek(). Functia Seek() returneaza o valoare de tip Long care specifica pozitia curenta pentru scriere/citire a fisierului deschis in acces aleator cu instructiunea Open. Sintaxa

Seek() este:

<nr.fisier>)

<nr.fisier> reprezinta numarul asociat fisierului la deschidere.

Pentru ca pe timpul prelucrarii fisierelor in acces aleator sa nu se produca erori neprevizibile, este indicat ca lungimea datelor citite/scrise in fisier sa corespunda cu lungimea specificata in clauza Len a instructiunii Open.

Deoarece lungimea reala a unei inregistrari depinde de tipul de date asociat campurilor din tipul definit de utilizator este indicat ca lungimea sa se determine nu prin insumarea spatiului necesar fiecarui camp, ci prin apelarea functiei

, a carei sintaxa este:

<variabila>)

<variabila> reprezinta numele variabilei ce contine sau va contine datele scrise respectiv citite in/din fisier.

<variabila> ce se scrie/citeste este un sir de lungime variabila, datele sirului sunt precedate de un descriptor de 2 bytes ce contine lungimea sirului. Deci lungimea inregistrarii specificata in clauza Len din instructiunea Open trebuie sa fie cu cel putin 2 bytes mai mare de cat lungimea reala a sirului.

Page 102: tutoriale vba

<variabila> ce se scrie/citeste este un tablou dinamic, la numarul total de bytes necesar tabloului se adauga un descriptor a carui lungime este egala cu 2 plus de 8 ori numarul dimensiunilor tabloului. Spre exemplu, urmatoarea declaratie de tablou necesita 118 bytes atunci cand tabloul este scris intr-un fisier:

Dim MyArray(1 To 5,1 To 10) As Integer

Cei 118 bytes sunt distribuiti astfel: 18 bytes pentru descriptor (2 + 8 * 2; tabloul are doua dimensiuni) si 100 bytes pentru date (5 * 10 * 2; cinci linii, fiecare cu 10 coloane de intregi).

Lungimea inregistrarii specificata in clauza Len din instructiunea Open trebuie sa fie mai mare sau cel putin egala cu suma tuturor bytes necesari citirii/scrierii datelor tabloului si a descriptorului de tablou.

Tablourile de lungime fixa nu au un descriptor de tablou; deci in fisier vor exista numai datele tabloului.

<variabila> este un Variant a tipului numeric, la numarul de bytes necesari stocarii datelor se mai adauga 2 bytes pentru pastrarea tipului (VarType) de numar. Spre exemplu, VarType este egal cu 3 pentru datele de tip Long. Deci lungimea inregistrarii specificata in clauza Len din instructiunea Open trebuie sa fie mai mare sau cel putin egala cu lungimea reala a inregistrarii plus 2 bytes.

<variabila> apartine oricarui alt tip diferit de sir de lungime variabila, Variant sau tablou dinamic, in/din fisier se scriu/citesc numai datele. Deci lungimea inregistrarii specificata in clauza Len din instructiunea Open trebuie sa fie mai mare sau cel putin egala cu lungimea reala a inregistrarii.

Prelucrarea unitatilor, dosarelor si fisierelor

Cand programati in Windows, este foarte important sa aveti posibilitatea de a adauga, muta, schimba, crea sau sterge dosare/fisiere, de a obtine informatii despre unitati si de a le manipula.

Visual Basic va permite sa procesati unitatile, dosarele si fisierele in doua moduri diferite: folosind metodele traditionale cum ar fi instructiunile Open, Write # etc. si prin intermediul unui nou set de instrumente – modelul obiectului File System

Modelul obiectului FSO ofera aplicatiilor posibilitatea de a crea, modifica, muta si sterge dosare sau de a detecta daca anumite dosare exista si daca da unde se gasesc ele. De asemenea, puteti obtine informatii despre dosare, cum ar fi numele acestora, data cand au fost create etc.

De asemenea, modelul obiectului FSO usureaza procesarea fisierelor. Cand procesati fisiere, principalul obiectiv al dumneavoastra este stocarea datelor intr-un spatiu eficient si intr-un format usor de accesat. De asemenea, aveti nevoie de posibilitati de creare a fisierelor, de inserare si modificare a datelor si de citirea datelor. Puteti stoca datele intr-o baza de date, cum ar fi Jet sau SQL, dar aceasta va adauga o suprasarcina semnificativa aplicatiei. Din mai multe motive, este posibil sa nu doriti sa aveti o asemena durere de cap sau accesul la date necesar nu impune folosirea tuturor facilitatilor bazelor de date. In acest caz, stocarea datelor intr-un fisier text sau binar este cea mai eficienta solutie.

Modelul obiectului FSO admite crearea si manipularea fisierelor text prin intermediul obiectului TextStream. Obiectul nu manipuleaza fisiere binare; acestea vor fi create si manipulate folosind instructiunile traditionale pentru fisiere.

Page 103: tutoriale vba

Obiectele modelului FSO

Modelul obiectului FSO are urmatoarele obiecte:

Descriere

Permite culegerea de informatii despre unitatile atasate sistemului, cum ar fi cat spatiu este disponibil, care este numele partajat al acestora etc. Prin “unitate” nu se intelege in mod obligatoriu un hard-disc. Aceasta poate fi o unitate CD-ROM, un disc RAM etc. De asemenea, nu este necesar ca unitatile sa fie fizic atasate sistemului; ele pot fi conectate logic prin intermediul unui LAN (Local Area Network – retea locala de calculatoare).Permte crearea, stergerea sau mutarea dosarelor, precum si interogarea sistemului despre caracteristicile acestora: nume, cale etc. Permite crearea, stergerea si mutarea fisierelor, precum si interogarea sistemului despre caracteristicile acestora: nume, cale etc.Este principalul obiect al grupului si contine metodele care permit crearea, stergerea, obtinerea de informatii si in general manipularea unitatilor, fisierelor si dosarelor. Multe dintre metodele acestui obiect le duplica pe cele ale altor obiecte.Va ofera posibilitatea sa cititi si sa scrieti fisiere text.

Programarea in modelul obiectului FSO

Programarea in modelul obiectului FSO implica trei etape principale:

Utilizarea metodei CreateObject sau declararea unei variabile de tip FileSystemObject pentru a crea un nou obiect.

Utilizarea uneia dintre metodele obiectului nou creat.

Accesarea proprietatilor obiectului.

Modelul obiectului FSO este continut intr-o biblioteca de tip numita Scripting, aflata in fisierul Scrrun.Dll. Daca nu aveti o referinta la aceasta biblioteca, selectati caseta de validare a optiunii 'Microsoft Scripting Runtime' din caseta de dialog

(se afiseaza selectand comanda References din meniul Project). Folosind fereastra Object Browser puteti vizualiza obiectele, colectiile, proprietatile, metodele si evenimentele obiectului FSO, precum si constantele acestuia.

Crearea si utilizarea obiectului FileSystemObject

Pentru a crea un obiect FileSystemObject puteti folosi una din urmatoarele procedee:

Declarand o variabila a obiectului FileSystemObject, ca in aceasta linie de cod:

Dim fso As New FileSystemObject

Folosind metoda CreateObject, ca in urmatoarea linie de cod:

Set fso = CreateObject('Scripting.FileSystemObject')

Page 104: tutoriale vba

Scripting este numele bibliotecii de tip, FileSystemObject este numele obiectului pentru care vreti sa creati o

Primul procedeu lucreaza numai in Visual Basic, in timp ce al doilea procedeu lucreaza atat in Visual Basic cat si in

Urmatorul pas este folosirea uneia dintre metodele obiectului FileSystemObject. Spre exemplu, daca vreti sa creati un nou obiect, puteti folosi metoda CreateFolder sau CreateTextFile (modelul obiectului FSO nu admite crearea sau stergerea

stergeti obiectele, puteti folosi metodele DeleteFile si DeleteFolder ale obiectului FileSystemObject sau a obiectelor File si Folder.

Utilizand metodele corespunzatoare, puteti copia si muta fisiere sau dosare.

Unele functionalitati ale modelului obiectului FileSystemObject sunt redundante. Spre exemplu, puteti copia un fisier CopyFile a obiectului FileSystemObject sau metoda Copy a obiectului File object. Ambele metode lucreaza

la fel. Ele exista pentru a oferi o mai mare flexibilitate programarii.

Pentru a accesa o unitate, un dosar sau un fisier existent trebuie sa folositi una din metodele “get” ale obiectului GetDrive, GetFolder sau GetFile.

Dim fso As New FileSystemObject, fil As File

Set fil = fso.GetFile('c:test.txt')

De remarcat ca, totusi, nu este necesar sa folositi metodele 'get' pentru obiectele nou create, deoarece functiile de creare returneaza deja o cale de acces la aceste obiecte. Spre exemplu, daca creati un nou dosar folosind metoda CreateFolder, nu trebuie sa folositi apoi metoda GetFolder pentru a accesa proprietatile acestuia, cum ar fi Name, Path, Size etc. Trebuie doar sa setati o variabila la functia CreateFolder pentru a obtine o cale de acces la noul dosar creat, apoi puteti accesa proprietatile, metodele si evenimentele acestuia:

Private Sub Create_Folder()

Dim fso As New FileSystemObject, fldr As Folder

Set fldr = fso.CreateFolder('C:MyTest')

MsgBox 'Dosarul creat se numeste: ' & fldr.Name

Din momentul in care aveti o cale de acces la un obiect, puteti folosi proprietatile lui. Spre exemplu, sa presupunem ca vreti sa obtineti numele unui anumit dosar. In primul rand creati o instanta a obiectului, apoi obtineti o cale de acces la acesta cu metoda potrivita (in acest caz, metoda GetFolder, deoarece dosarul deja exista):

Set fldr = fso.GetFolder('c:')

Page 105: tutoriale vba

Dupa ce ati obtinut calea de acces la un obiect Folder, puteti verifica proprietatea Name a acestuia:

Debug.Print 'Numele dosarului este: '; fldr.Name

Daca vreti sa vedeti cand a fost modificat un fisier, folositi urmatoarele linii de cod:

Dim fso As New FileSystemObject, fil As File

Set fil = fso.GetFile('c:detlog.txt') ' Obtinerea obiectului File dorit

Debug.Print 'Ultima modificare: '; fil.DateLastModified ' Afisarea datei

Lucrul cu unitati si dosare

Folosind modelul obiectului FSO puteti lucra cu unitatile si dosarele in mod programatic la fel cu o faceti interactiv in

Obtinerea informatiilor despre unitati

Drive va permite sa obtineti informatii despre diferitele unitati atasate sistemului fie fizic, fie printr-o retea de calculatoare. Proprietatile acestui obiect va permit sa obtineti urmatoarele informatii:

Spatiul total al unitatii, in bytes (proprietatea TotalSize)

Spatiul disponibil pe unitate, in bytes (proprietatile AvailableSpace sau FreeSpace)

Ce litera este asignata unitatii (proprietatea DriveLetter)

Ce tip de unitate este, cum ar fi: amovibila, fixa, retea, CD-ROM sau disc RAM (proprietatea DriveType)

Numarul de serie al unitatii (proprietatea SerialNumber)

Tipul de sistem folosit de unitate, cum ar fi FAT, FAT32, NTFS etc. (proprietatea FileSystem)

Daca o unitate este disponibila pentru utilizare (proprietatea IsReady)

Numele de partajare si/sau a volumului (proprietatile ShareName si VolumeName)

Calea sau dosarul radacina al unitatii (proprietatile Path si RootFolder)

Exemplu de folosire a obiectului Drive

Urmatorul exemplu prezinta modul de folosire a obiectului Drive pentru culegerea informatiilor despre o unitate. In acest cod nu veti bedea o referinta la un obiect Drive real, in schimb, veti folosi metoda GetDrive pentru a obtine o referinta la

existent (in acest caz, drv):

Private Sub Command3_Click()

Page 106: tutoriale vba

Dim fso As New FileSystemObject, drv As Drive, s As String

Set drv = fso.GetDrive(fso.GetDriveName('c:'))

s = 'Unitatea ' & UCase('c:') & ' - ' & drv.VolumeName & vbCrLf

s = s & 'Spatiul total: ' & FormatNumber(drv.TotalSize / 1024, 0)

s = s & ' Kb' & vbCrLf & 'Spatiul liber: '

s = s & FormatNumber(drv.FreeSpace / 1024, 0) & ' Kb' & vbCrLf

Lucru cu dosare

Tabelul urmator prezinta cele mai des folosite operatii cu dosarele si metodele necesare acestora:

Metoda

FileSystemObject.CreateFolder Stergerea unui dosar Folder.Delete sau FileSystemObject.DeleteFolder

Folder.Move sau FileSystemObject.MoveFolder

Copierea unui dosar Folder.Copy sau FileSystemObject.CopyFolder

Obtinerea numelui unui dosar Folder.Name

Determinare existentei unui dosar pe o unitate FileSystemObject.FolderExists

Obtinerea unei instante la un obiect Folder FileSystemObject.GetFolder

Gasirea numelui dosarului parinte al unui dosar FileSystemObject.GetParentFolderName

Gasirea caii dosarelor sistemului FileSystemObject.GetSpecialFolder

Acest exemplu ilustreaza utilizarea obiectelor Folder si FileSystemObject pentru manipularea dosarelor si obtinerea informatiilor despre ele:

Private Sub Command10_Click()

' Get instance of FileSystemObject.

Dim fso As New FileSystemObject, fldr As Folder, s As String

Set fldr = fso.GetFolder('c:') ' Obtinerea obiectului Drive.

Debug.Print 'Numele dosarul parinte este: ' & fldr

Page 107: tutoriale vba

Debug.Print 'Continut de unitatea ' & fldr.Drive

If fldr.IsRootFolder = True Then ' Afsarea numelui radacinii.

Debug.Print 'Acest dosar este dosar radacina.'

Debug.Print ' Acest dosar nu este dosar radacina.'

' Crearea unui nou dosar folosind obiectul FileSystemObject.

fso.CreateFolder ('c:Bogdan')

Debug.Print 'Created folder C:Bogdan'

' Afisarea numelui de baza al dosarului.

Debug.Print 'Numele de baza = ' & fso.GetBaseName('c:Bogdan')

fso.DeleteFolder ('c:Bogdan') ‘ Stergerea noului dosar creat

Debug.Print 'S-a sters dosarul C:Bogdan'

Lucrul cu fisiere

In Visual Basic puteti lucra cu fisiere folosind noile obiecte orientate FSO cum ar fi Copy, Delete, Move si , impreuna cu altele sau prin folosirea vechilor functii si instructiuni existente cum ar fi Open, Close,

etc. De retinut ca puteti muta, copia sau sterge fisiere indiferent de tipul acestora.

Exista doua mari categorii de manipulari ale fisierelor:

Crearea, adaugarea sau eliminarea datelor si citirea fisierelor

Mutarea, copierea si stergerea fisierelor

Crearea fisierelor

Exista trei cai de a crea un fisier de text secvential (referit uneori ca 'text stream'). Una dintre cai se bazeaza pe utilizarea CreateTextFile. Pentru a crea un fisier de text gol se folosesc urmatoarele linii de cod:

Dim fso As New FileSystemObject, fil As File

Set fil = fso.CreateTextFile('c:testfile.txt', True)

Page 108: tutoriale vba

Modelul obiectului FSO nu suporta inca crearea fisierelor cu acces direct sau binare. Pentru a crea fisiere in acces direct sau binare se folosesc instructiunile de prelucrare a fisierelor clasice.

O a doua cale de creare este utilizarea metodei OpenTextFile a obiectului FileSystemObject avand indicatorul ForWriting

Dim fso As New FileSystemObject, ts As New TextStream

Set ts = fso.OpenTextFile('c:test.txt', ForWriting)

Cea de a treia cale de creare consta in utilizarea metodei OpenAsTextStream avand indicatorul ForWriting setat:

Dim fso As New FileSystemObject, fil As File, ts As TextStream

Set fso = CreateObject('Scripting.FileSystemObject')

fso.CreateTextFile ('test1.txt')

Set fil = fso.GetFile('test1.txt')

Set ts = fil.OpenAsTextStream(ForWriting)

Adaugarea datelor in fisier

Dupa ce fisierul text a fost creat, puteti adauga date in el executand urmatoarele operatii:

Deschiderea fisierului text pentru scrierea datelor. Pentru deschiderea fisierului puteti utiliza fie metoda OpenAsTextStream al obiectului File fie metoda OpenTextFile a obiectului FileSystemObject.

Scrierea datelor. Pentru a scrie date intr-un fisier text se folosesc metodele Write sau WriteLine ale obiectului . Diferenta dintre Write si WriteLine consta in faptul ca WriteLine adauga caracterele de linie noua la

sfarsitul sirului specificat. Daca vreti sa adaugati o linie goala in fisierul text, folositi metoda WriteBlankLines.

Inchiderea fisierului. Pentru inchiderea unui fisier, se foloseste metoda Close a obiectului TextStream.

In continuare se prezinta un exemplu de prelucrare a unui fisier text:

Set fso = CreateObject('Scripting.FileSystemObject')

Set txtfile = fso.CreateTextFile('c:testfile.txt', True)

txtfile.Write ('Acesta este un test. ') ‘ Scrie o linie

‘ Scriera unei linii de caractere

Page 109: tutoriale vba

txtfile.WriteLine('Testare 1, 2, 3.')

' Scrierea a trei linii goale

txtfile.WriteBlankLines(3)

Citirea fisierelor

Pentru a citi datele dintr-un fisier text, se folosesc metodele Read, ReadLine sau ReadAll ale obiectului TextStream:

MetodaCitirea unui numar specificat de caractere dintr-un fisier

Read

Citirea unei linii intregi (pana la caracterul linie noua, dar fara sa le ReadLine

Citirea intregului continut al unui fisier text ReadAll

Daca folositi metoda Read sau ReadLine si vreti sa sariti peste o anumita portiune de date, puteti folosi metoda Skip sau

Textul rezultat in urma utilizari unei metode de citire este stocat intr-un sir ce poate fi afisat intr-un control, analizat prin operatorii de siruri (cum ar fi, Left, Right si Mid), concatenat etc.

vbNewLine contine un caracter sau caractere (in functie de sistemul de operare) pentru avansul cursorului la inceputul liniei urmatoare (carriage return -linefeed)..

Dim fso As New FileSystemObject, txtfile, _

fil1 As File, ts As TextStream

Set txtfile = fso.CreateTextFile('c:testfile.txt', True)

MsgBox 'Scrierea fisierului', vbCritical

Set fil1 = fso.GetFile('c:testfile.txt') ‘ Scrierea unei linii.

Set ts = fil1.OpenAsTextStream(ForWriting)

ts.Write 'Hello World'

Page 110: tutoriale vba

‘ Citirea continutului fisierului.

Set ts = fil1.OpenAsTextStream(ForReading)

Mutarea, copierea si stergerea fisierelor

Modelul obiectului FSO are cate doua metode pentru mutarea, copierea si stergerea fisierelor:

MetodaFile.Move sau FileSystemObject.MoveFileFile.Copy sau FileSystemObject.CopyFileFile.Delete sau FileSystemObject.DeleteFile

Urmatorul exemplu creaza un fisier text in directorul radacina a unitatii C, scrie cateva informatii in el, il muta intr-un , realizeaza o copie intr-un director numit temp si sterge copiile din ambele directoare. Pentru a rula acest

exemplu, asigurati-va ca exista cele doua directoare numite tmp si temp in directorul radacina a unitatii C.

Dim fso as New FileSystemObject, txtfile, fil1, fil2

Set txtfile = fso.CreateTextFile('c:test.txt', True)

MsgBox 'Scrierea fisierului'

txtfile.Write ('Acesta este un test.') ‘ Screrea unei linii.

‘ Inchidere fisierului.

MsgBox 'Mutarea fisierului in c:tmp', vbCritical

' Obtinerea unei cai de acces la radacina unitatii C:.

Set fil1 = fso.GetFile('c:test.txt')

fil1.Move ('c:tmptest.txt') ‘ Mutare in directorul tmp.

Page 111: tutoriale vba

MsgBox 'Copierea fisierului in c:temp', vbCritical

fil1.Copy ('c:temptest.txt') ‘ Copierea fisierului in temp

MsgBox 'Stergerea fisierelor'

' Obtinerea cailor de acces la locatiile curente ale fisierelor.

Set fil1 = fso.GetFile('c:tmptest.txt')

Set fil2 = fso.GetFile('c:temptest.txt')

‘ Stergerea fisierelor.

MsgBox 'Asta-i tot!', vbCritical

Copyright © 2013 - Toate drepturile rezervate

Visual Basic blogJust another WordPress.com weblog

Functiile ToLower,ToUpper si Trim pt.variabile   string

Module Module1

Sub Main()

'citirea datelor de la tastatura'

Console.WriteLine("Bine ati venit!")Console.WriteLine("")

Console.Write("Introduceti numele:")Dim nume As Stringnume = Console.ReadLine()Console.WriteLine("")

Console.Write("Introduceti prenumele cu majuscule:")

Page 112: tutoriale vba

Dim prenume As Stringprenume = Console.ReadLine()Console.WriteLine("")

Console.Write("Introduceti localitatea:")Dim localitate As Stringlocalitate = Console.ReadLine()Console.WriteLine("")

'afisarea datelor citite de la tastatura'

'folosire operator concatenare &'

'afisare nume'Console.WriteLine(" Prima afisare" & " Prima metoda")Console.WriteLine(nume)Console.WriteLine("")

'la apasarea tastei ENTER afiseaza'Console.ReadLine()

'afisare prenume'Console.WriteLine(" A doua afisare" & " A doua metoda")Console.WriteLine(prenume)Console.WriteLine("")'la apasarea tastei ENTER afiseaza'Console.ReadLine()

'afisare localitate'Console.WriteLine(" A treia afisare" & " A treia metoda")Console.WriteLine(localitate)Console.WriteLine("")'la apasarea tastei ENTER afiseaza'Console.ReadLine()

' conversie in litere mari a numelui citit'Console.WriteLine("Conversia numelui in litere mari " & nume.ToUpper())

'conversie in litere mici a prenumelui citit'Console.WriteLine("Conversia numelui in litere mari " & prenume.ToLower())Console.ReadLine()

End Sub

End Module

Efectul rularii:

Page 113: tutoriale vba

Functia trim elimina spatiile dintr-un sir de caractere . Este folosit in cazul variabilelor string.

Exemplu:

Efectul rularii:

Page 114: tutoriale vba

About these ads

Published in: Aplicatii consola

on September 29, 2009 at 6:12 pm  Leave a Comment  

The URI to TrackBack this entry is: http://visbasic.wordpress.com/2009/09/29/functiile-tolower-si-toupper/trackback/

RSS feed for comments on this post.

Leave a Reply

September 2009M T W T F S S    Oct »  1 2 3 4 5 67 8 9 10 11 12 1314 15 16 17 18 19 2021 22 23 24 25 26 2728 29 30  

Page 115: tutoriale vba

Categories: o Aplicatii consola

o Aplicatii GUI

Archives:

o January 2010

o October 2009

o September 2009

Blogrollo WordPress.com

o WordPress.org

Blog at WordPress.com. | RSS 2.0 | Comments RSS 2.0 | The Quentin Theme.

Follow

Follow “Visual Basic blog”

Get every new post delivered to your Inbox.

Powered by WordPress.com

Structura programelor in Visual Basic

Codul sursă de pentru dezvoltarea aplicaţiilor Visual Basic este implementat în module (echivalente conceptual cu unit-urile Pascal). Un modul poate conţine declaraţii de variabile şi/sau definiţii de proceduri şi funcţii.

În Visual Basic există trei tipuri de module: - module standard (. BAS)

- module ataşate formelor (. FRM) - conţin (alături de decl. de variabile, proceduri sau funcţii utilizator) proceduri de tratare a evenimentelor declanşate de forme sau controale ale acstora

- module de definire de clase (. CLS) - pentru crearea de obiecte. Declaraţii de variabile în Visual BasicDim nume-variabila [As tip] Numele de variabile: - încep cu o literă, - au lungimea maximă de 255 caractere, - au nume unic în cadrul domeniului de vizibilitate.

Page 116: tutoriale vba

Domeniul de vizib. al variabilelor declarate în funcţii/proceduri este corpul funcţiei/procedurii. Variabilele locale a căror declaraţie este precedată de cuvântul cheie Static îşi păstrează valoarea între două apeluri succesive ale funcţiei/procedurii în care au fost declarate.

Domeniul de vizib. al var. declarate în afara funcţiilor sau procedurilor este modulul. Domeniul de vizib. al variabilelor a căror declaraţie este precedată de cuvântul cheie Public este întreaga aplicaţie.

În Visual Basic declararea unei variabile nu este obligatorie (declaraţie implicită - se alocă memorie pentru o variabilă nedeclarată în momentul iniţializării acesteia).

Tipuri de date utilizate în Visual Basic Tip Sp. de memorare (octeţi) Domeniu ValoareiniţialăByte 1 0 - 255 0Boolean 2 True/False FalseInteger 2 -32768... 32767 0Long Integer 4 -2147483648... 2147483647 0Single 4 max 3. 402823E+38 0Double 8 - 0Currency 8 - 0Date 8 1/1/100... 12/31/9999 -Object 4 adr. obiecte VB, controale, etc -String lungime sir 1 - 65. 400 car ""Variant 16 poate stoca toate tipurile definite in sistem Empty Declaraţii de proceduri/funcţii în Visual Basic A) Proceduri[Private|Public][Static]Sub NumeProcedura (lista-parametrii) instructiuniEnd Sub B) Funcţii[Private|Public][Static]Function NumeFunctie (lista-param) [As tip] instructiuni NumeFunctie = expresie `valoare returnata instructiuniEnd Function Structuri de control în Visual BasicA) Structuri condiţionale IF... THEN If conditie Then instructiuneIf conditie Then instructiuni

Page 117: tutoriale vba

End If IF... THEN... ELSE If conditie1 Then [instructiuni-1][ElseIf conditie2 Then [instructiuni-2]] ... [Else [instructiuni-n]]End If SELECT CASESelect Case expresie-de-test [Case lista-expresii-1 [instructiuni-1]] [Case lista-expresii-2 [instructiuni-2]] . . . [Case Else [instructiuni-n]]End Select B) Structuri iterative (de ciclare) Do... Loop (nr. nedefinit de pasi) - cu test iniţialDo While conditie instructiuniLoop Do Until conditie instructiuniLoop - cu test finalDo instructiuniLoop While conditie Do instructiuniLoop Until conditie For... Next (nr. cunoscut de pasi) For var-contor = start To final [Step incrementare] instructiuni

Page 118: tutoriale vba

Next [var-contor] For Each... Next (parcurgere colecţii de date) For Each element In colectie instructiuniNext element C) Structuri de salt necondiţionat Exit For / Exit Do (ieşire din structuri iterative) For var-contor = start To final [Step incrementare] [instrucţiuni] [Exit For] [instructiuni]Next [var-contor] Do [{While | Until} conditie] [instructiuni] [Exit Do] [instructiuni]Loop Exit Sub / Exit Function (ieşire din proceduri/funcţii)...

folosirea fisierelor in Visual Basic     

Visual Basic-ul are integrat o multime de functii si proceduri utile in lucrul cu fisiere. Pentru ca acest tutorial sa aiba o structura mai usoara de inteles am sa incep cu procesarea fisierelor text . Pentru deschiderea acestora se foloseste comanda OPEN astfel: Open "cale" For Atribut As #numar

,unde "cale" este este calea catre fisier, "atribut" este descriptorul operatiilor pe care le putem face.El poate lua urmatoarele valori: --> Input -- pentru citire.Neexistenta fisierului duce la mesaj de eroare. -->Output -- pentru scriere.Neexistenta fisierului duce la creearea acestuia. -->Append -- pentru adaugarea de date la sfarsitul fisierului -->Binary -- pentru deschiderea fisierului in mod binar Pentru numar este recomandata folosirea procedurii FreeFile() care returneaza primul numar disponibil. Exemple: Dim ff As Byte ff=FreeFile() Open "c:\autoexec.bat" For Input As ff

Scrierea intr-un fisier se poate face cu ajutorul urmatoarelor functii: -->Write -- se foloseste dupa urmatoarea sintaxa :Write #numar, continutul ce se doreste a fi

Page 119: tutoriale vba

scris

-->Print -- se foloseste dupa aceiasi sintaxa ca si Write -->Put -- se foloseste in cazul fisierelor deschise in mod binar conform sintaxei:Put #numar, ,continutul ce se doreste a fi scris

Exemple: .. Dim s as String s="test" Print #ff, s Write #ff, s Put #ff, , s ..

Citirea dintr-un fisier se poate face cu ajutorul urmatoarelor functii: -->Input -- se foloseste dupa sintaxa Input #numar , sir de variabile sau variabila

-->Get -- se foloseste in cazul fisierelor deschise in mod binar conform sintaxei: Get #numãr,, variabilã

Inchiderea unui fisier se face cu ajutorul comenzii CLOSE astfel : Close #numar

Pentru ca lucrul cu fisiere si directoare sa fie facil Microsoft$ a creat o multime de functii si procedurii utile.Mai jos se afla o scurta enumerare a lor impreuna cu o descriere: ---> Name As --> redenumeste un fisier sau ii schimba locatia.Se foloseste sub forma : Name cale1 As cale2 Name "c:\test.in" As "c:\tset.ni" Name "c:\test.in" As "d:\test\test.in"

---> FileCopy --> copiaza un fisier.Se foloseste sub forma : FileCopy locatie1, locatie2 FileCopy "c:\test.in", "c:\test\test.in"

---> Kill --> sterge unul sau mai multe fisiere(suporta '*' si '?').Se foloseste sub forma : Kill cale Kill "c:\windows\temp\*.*"

---> CurDir$ --> returneaza directorul curent ---> ChDrive --> schimba drive-ul\partitia curent\a.Se foloseste sub forma : ChDrive drive\partitie ChDrive "D:"

---> ChDir --> schimba directorul curent.Se foloseste sub forma : ChDir director

Page 120: tutoriale vba

ChDir "c:\windows"

---> MkDir --> creaza un director.Se foloseste sub forma : MkDir nume_director MkDir "c:\test"

---> RmDir --> sterge un director.Se foloseste sub forma : RmDir director RmDir "c:\test"

---> LOF --> returneaza marimea fisierului in octeti.Se foloseste sub forma :LOF (numar)

---> EOF --> returneaza "True" in cazul in care s-a atins sfarsitul fisierului.Se foloseste sub forma :EOF (numar) credite:Trimbitas Sorin si modificarii facute de mine_________________Impossible is nothing !!

Acasa Echipa Dr. VB Cine suntem? Cursuri cu Dr.VB Consultanta VB Forum Visual Basic Video Visual Basic Articole VB Resurse ITLearning Contact Dr.VB

Altele

Cauta in articolePartea superioară a

machetei

Sunteti aici:DrVB.ro Altele Cum pot să… folosesc fereastra “Immediate”

Cum pot să… folosesc fereastra “Immediate”

Page 121: tutoriale vba

Publicat de Echipa Dr.VB in categoria Altele - 0 Comentarii - (14 April, 2012 la

ora 6:52 am)

PreambulFolosim ferestra “Immediate” pentru executa rapid comenzi visual basic.Aceste comenzi nu sunt salvate in modul de cod, scopul principal este acela de a testa fie o comanda sau a afla/modifica valori ale unor proprietati.Fereastra ” Immediate” poate fi folosita si pentru a tipari valori intermediare ale unor variabile, deasemeni in scopuri de testare.Metoda folosita in cod pentru tiparire in “Immediate” este “Debug.Print”.

Pasul 1Deschideti aplicatia Excel 2010, deschideti VBE (Alt + F11).Pentru activarea ferestrei “Immediate”, in cadrul VBE (Visual Basic Editor), actionam fie:- Metoda 1: Combinatia de taste Ctrl + G- Metoda 2:  Din meniul “View” comanda  “Immediate Window” (1)Si acesta fereastra este redimensionabila (din margini) sau repozitionabila (prin tragerea cu mous-ul) in orice pozitie de pe ecran.

Page 122: tutoriale vba

Pasul 2Pentru a interoga/modifica valoarea unei  proprietati:Interogare (read) valoare proprietate: in interiorul ferestrei “Immediate” (1) tastam semnul “?” urmat de denumirea obiectului si a proprietatii de interogat  (ex: pentru a afla denumirea foi de calcul active in Excel vom tasta “?ActiveSheet.Name” sau versiunea de Excel “?Application.Version”) dupa care actionam tasta “Enter”; valoarea proprietatii va fi tiparita pe linia imediat urmatoare.Modificarea valorii unei proprietati (pentru proprietatile care accepta modificare): vom scrie in “Immediate” denumirea obiectului si a proprietati (2) urmate de semnul egal si noua valoare (intre ghilimele daca acea valoare este text). Ex: modificarea denumirii foi de calcul active de sa scrie ActiveSheet.Name = “DenumireNoua”. Acesta comanda se va executa la actionarea tastei “Enter”Aceste comenzi vor ramane tiparite in fereastra “Immediate” putand fi refolosite oricand sau pot fi sterse la nevoie.

Pasul 3Pentru a tipari in ferestra “Immediate” in timpul derularii unei proceduri:In procedura, acolo unde se doreste testarea valorii unei proprietati, se va insera comanda “Debug.Print ” (1) si numele obiectului si a proprietatii. Ex:

Page 123: tutoriale vba

daca dorim sa tiparim valoarea celulei A2 la un moment inntermediar in timpul executarii de cod vom folosi comanda: Debug.Print Range(“A2″).ValueValoarea va fi tiparita in “Immediate” si va ramane pana la stergerea manuala  (2)Folosim acesta metoda si ca o alternativa la comanda “MsgBox”, atunci cand dorim doar listarea valorii nu si intreruperea executiei de cod

Page 124: tutoriale vba

Lasa un comentariu

Nume (Obligatoriu)

Mail (nu va fi publicat) (Obligatoriu)

Website

Lasa un comentariu

Page 125: tutoriale vba

Acasa - Video VB - Articole VB - Forum VB

Copyright © 2011 Dr. VB | Termeni si conditii

cursuri-excel.ro - cursuri-access.ro - cursuri-powerpoint.ro - cursuri-outlook.ro - cursuri-word.ro - cursuriproject.ro

Introducere practică în Prolog (I)Creat: 2011/jun       Comentarii

backtracking | partiţii | Prolog | triplete pitagoreice primitive

În programarea logică, ideea de bază este exprimată prin Algorithm = Logic + Control. Componenta Logic - asimilată cu "program Prolog", sau "bază de date" - vizează descrierea problemei: ce fapte se cunosc (aserţiuni iniţiale asupra obiectelor problemei) şi ce reguli generale ("parametrizate" faţă de obiectele problemei) trebuie folosite pentru a deduce ulterior alte fapte (noi).

Componenta Control reprezintă însuşi interpretorul (ori fiinţa raţională) care va "executa" programele; interpretorul de Prolog "aplică" metoda deducerii (plecând de la baza de date furnizată de program) şi un mecanism intern de backtracking recursiv - căutând sistematic valori cu care să "înlocuiască" necunoscutele implicate în scopul ("goal") satisfacerii clauzelor curente.

Sunt în uz diverse implementări ale componentei "Control" (vezi Prolog Systems) şi în mare ele respectă un acelaşi standard (ISO Prolog). Aici avem în vedere şi utilizăm SWI-Prolog.

O exemplificare clasică: relaţii de rudenie

În privinţa ordinii exemplificărilor cuprinse în lucrări introductive de Prolog - prezentarea unei baze de date pe o temă larg cunoscută - cum ar fi, relaţiile de rudenie - este clasică (la fel cu programele "Hello world!" cu care debutează prezentarea în alte limbaje).

Părinţii lui Fred sunt Ed şi Edna (vezi The Flintstones); Pebbles este fiica lui Fred; etc.

man('Fred'). % exprimă faptul că "Fred este bărbat" man('Ed').woman('Edna'). % Edna este femeiewoman('Wilma').woman('Pebbles').parent('Ed', 'Fred'). % Fred este un copil al lui Edparent('Edna', 'Fred').parent('Fred', 'Pebbles').parent('Wilma', 'Pebbles').grandparent(X, Z) :- % X este bunic/bunică a lui Z dacă (notat :-):

Page 126: tutoriale vba

parent(X, Y) % există Y încât este valabil parent(X, Y) , % şi (virgula conjugă clauzele) parent(Y, Z). % este satisfăcut parent(Y, Z).

Am declarat nişte fapte - man('Fred', woman('Wilma') etc. - nişte relaţii - parent(Ed,Fred) etc. - şi o regulă (pentru a fi "grandparent"). Caracterul . (denumit "full-point") încheie declaraţia.

'Fred' - cu apostrof - este o constantă (alternativa era fred, cu litere mici dar fără încadrare cu apostrof); Fred - cu majusculă iniţială şi neîncadrat de apostrof - ar fi interpretat ca o variabilă (cum sunt mai sus X, Y, Z). Interpretorul va substitui o variabilă cu un obiect sau altul, după caz.

Să lansăm interpretorul SWI-Prolog, swipl:

vb@vb:~/docere/doc/Prolog$ swipl% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 2,224 bytesWelcome to SWI-Prolog (Multi-threaded, 32 bits, Version 5.10.1)Copyright (c) 1990-2010 University of Amsterdam, VU AmsterdamSWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,and you are welcome to redistribute it under certain conditions.Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?-

Fie "flintstones.pl" fişierul în care am salvat declaraţiile de mai sus; la promptul ?- tastăm:

?- [flintstones].% flintstones compiled 0.00 sec, 1,604 bytestrue.

?-

Interpretorul a încărcat şi a compilat fişierul respectiv, afişând din nou promptul. Putem pune întrebări (interogări, "queries") şi putem formula diverse scopuri (similar cu "program main()").

?- man('Fred').true. % acest fapt există în baza de date

?- man('Mister').false. % Nu există (şi nici nu poate fi dedus)

?- man(Fred). % aici Fred este o variabilă!Fred = 'Fred' ; % se tastează ; pentru a obţine răspunsuri alternativeFred = 'Ed'.

?-

Interogarea man(Fred) - unde Fred este o variabilă (puteam folosi la fel de bine man(X), de exemplu) - are drept răspunsuri toate valorile cu care se poate înlocui "necunoscuta" Fred astfel încât să fie satisfăcută clauza "man". Interpretorul caută o potrivire în baza de date, afişează răspunsul găsit şi apoi aşteaptă: dacă se tastează ; (pentru "sau" soluţie alternativă) atunci reia căutarea.

Page 127: tutoriale vba

În momentul încărcării şi compilării programului, interpretorul indexează intern termenii respectivi (după nume şi după ordinea apariţiei lor în program) - astfel că acum găseşte foarte uşor termenul "man" (împreună cu "ramurile" respective: 'Fred' şi 'Ed', în această ordine); găsind prima potrivire posibilă - anume man(Fred) = man('Fred') - interpretorul marchează intern "ramura" respectivă - astfel că (după ce se tastează ;) căutarea unei alternative va fi reluată începând din acest loc.

?- parent(X, 'Pebbles'). % Cine sunt părinţii lui 'Pebbles'?X = 'Fred' ; % sau X = 'Wilma'.

?- parent(X, 'Pebbles'), woman(X). % Dar cine este mama lui 'Pebbles'?X = 'Wilma'.

Pentru ultima interogare de mai sus, interpretorul găseşte întâi "potrivirea" parent('Fred', 'Pebbles') şi consideră mai departe valoarea 'Fred' pentru toate apariţiile lui X în cadrul interogării; dar cu această instanţiere a variabilei X, clauza woman('Fred') este nesatisfăcută - "Fail" - şi atunci revine - "Redo" - la cealaltă "ramură", instanţiind X cu 'Wilma':

?- trace. % pentru a trasa pas cu pas execuţia următoarei interogăritrue.

[trace] ?- parent(X, 'Pebbles'), woman(X). Call: (7) parent(_G793, 'Pebbles') ? creep Exit: (7) parent('Fred', 'Pebbles') ? creep Call: (7) woman('Fred') ? creep Fail: (7) woman('Fred') ? creep Redo: (7) parent(_G793, 'Pebbles') ? creep Exit: (7) parent('Wilma', 'Pebbles') ? creep Call: (7) woman('Wilma') ? creep Exit: (7) woman('Wilma') ? creepX = 'Wilma'.

Dacă valorile unuia dintre argumentele prevăzute în clauze sunt indiferente, atunci putem folosi o variabilă anonimă - reprezentată prin _:

[trace] ?- notrace. % Anulează trasarea pas cu pastrue.

[debug] ?- parent(X, _). % Care sunt părinţii?X = 'Ed' ; % sau (se tastează ;) X = 'Edna' ; % sau X = 'Fred' ; % sau X = 'Wilma'.

[debug] ?- grandparent(X, 'Pebbles'). % Cine sunt bunicii lui 'Pebbles'?X = 'Ed' ;X = 'Edna' ;false.

[debug] ?- findall(X, parent(X, _), Result_list). % Listă cu părinţiiResult_list = ['Ed', 'Edna', 'Fred', 'Wilma'].

[debug] ?- findall(X, grandparent(X, _), L). % Listă cu buniciiL = ['Ed', 'Edna'].

Page 128: tutoriale vba

?- explain(findall) va expune o documentare pentru predicatul predefinit respectiv (aici, findall); pentru documentare se poate folosi şi help(findall), dar "explain" indică şi fişierul-sursă aferent (uneori, aici găseşti cea mai bună lămurire a lucrurilor!).

Am observat mai sus, dar este de subliniat: căutarea în baza de date se face "de sus în jos" - ceea ce înseamnă că ordinea clauzelor este importantă - cu eventuală revenire la precedentul punct în care există alternative neexplorate; în cazul "execuţiei" unei clauze (sau interogări) compuse din mai multe subclauze conjugate prin , - ordinea operării este "de la stânga la dreapta" (iar aici "operare" nu înseamnă "evaluare şi atribuire" ca în alte limbaje, ci substituţie şi unificare, urmărind "potrivirea" finală a termenilor).

Exemplificări aritmetice

Prolog a apărut în 1972 şi are tangenţe conceptuale mai degrabă cu SQL (unde deasemenea folosim interogări şi baze de date relaţionale), decât cu limbajele "clasice" (Pascal a apărut în 1970, iar C în 1978). Pentru tratarea serioasă a unor aspecte matematice, limbajele "clasice" (începând cu limbajul de asamblare) sunt desigur cele mai potrivite; altfel însă, diverse aspecte aritmetice pot fi tratate în orice limbaj şi este interesant de văzut asemenea exemple în Prolog şi în SQL.

Cel mai mare divizor comun

Amintim cum s-ar scrie o funcţie Pascal care furnizează "Gcd":

function GCD(a, b: integer): integer;

begin

if b = 0 then GCD := a

else GCD := GCD(b, a mod b);

end;

Se recunoaşte desigur, algoritmul lui Euclid şi fiind formulat recursiv, poate fi reflectat uşor în Prolog (unde recursivitatea este "limba maternă"):

gcd(A, B, G) :- % gcd(A,B) este G dacă:

(B =:= 0 -> G is A % în cazul când B are valoarea 0, G = A

; % altfel,

R is A mod B, % (R fiind restul împărţirii lui A la B),

gcd(B, R, G) % avem G = gcd(B,R).

).

Am definit un predicat cu o singură clauză, gcd/3 (de aritate 3, adică având 3 argumente). Construcţia ( clauză -> clauză_1 ; clauză_2 ). corespunde cu "IF clauză THEN clauză_1 ELSE clauză_2".

Pentru cazul valorilor numerice, operatorii prevăzuţi pentru egalitate, inegalitate şi "mai mic sau egal" diferă ca simbol de alte limbaje: =:= (egalitate), =\= (inegalitate), =< (mai mic sau egal).

Page 129: tutoriale vba

R is Expresie asigură evaluarea expresiei aritmetice din partea dreaptă şi eventual, instanţierea variabilei R cu valoarea rezultată; forma echivalentă este is(R, Expresie).

Lansăm swipl şi tastăm la promptul interpretorului:

?- [pitagora]. % consultă fişierul pitagora.pl

% pitagora compiled 0.00 sec, 592 bytes

true.

?- listing. % listează definiţiile

gcd(C, A, B) :-

( A=:=0

-> B is C

; D is C mod A,

gcd(A, D, B)

).

true.

?- gcd(12, 21, G). % o interogare

G = 3.

listing înlocuieşte identificatorii de variabile din program cu câte o anumită majusculă.

Dar putem face şi probe mai interesante decât am făcut mai sus (pe numerele 12 şi 21):

?- X is 3**20 * 5**10 * 7**12, Y is 3**25 * 7**8 * 11**11, gcd(X, Y, G).

X = 471304534201247574228515625, % 320 * 510 * 712

Y = 1393590653142003761801219090073, % 325 * 78 * 1111

G = 20100618201669201. % cel mai mare divizor comun

?- G is 3**20 * 7**8. % verificare: cel mai mare divizor comun este 320 * 78

G = 20100618201669201.

Pentru aritmetica numerelor întregi sau raţionale, SWI-Prolog - ca şi alte interpretoare, pentru diverse limbaje - foloseşte biblioteca GMP (scrisă în C şi limbaj de asamblare) - încât putem folosi "gcd" şi pentru numere mari, cum am ilustrat mai sus.

Însă din punctul de vedere al definiţiei "gcd", proba cea mai interesantă este aceasta:

?- gcd(0, 0, G).

G = 0.

Deci se "încalcă" definiţia uzuală, în care cel mai mare divizor comun este definit cu excepţia cazului când ambii operanzi sunt nuli. Corect ar fi fost ca gcd(0, 0, G) să fie "false" (nu "G = 0"), la fel cum:

Page 130: tutoriale vba

?- gcd(12, 21, 5). % "este adevărat că 5 este cel mai mare divizor pentru 12 şi 21"?false. % Nu.

?- gcd(12, 21, 3). % "este adevărat că 3 este cel mai mare divizor pentru 12 şi 21"?true. % Da.

Tratarea acestui caz de excepţie (omis şi în funcţia Pascal de mai sus) ar necesita de obicei instrucţiuni în plus în cadrul funcţiei, constituţia "clasică" a unei funcţii recursive fiind: verifică "condiţia de oprire"; dacă este satisfăcută, atunci returnează un anumit rezultat şi "exit" - altfel, determină noii parametri şi reapelează funcţia cu aceştia.

Şi pe de o parte, verificarea condiţiei de oprire va decurge la fiecare nouă reapelare, iar pe de alta - "exit" înseamnă "curăţarea" succesivă a cadrelor-stivă create pe parcursul reapelărilor, revenind "înnapoi" la contextul iniţial de apel al funcţiei recursive respective.

Putem imita şi în Prolog această manieră "clasică" de tratare, dar dispunem şi de o metodă specifică, în fond mai "directă" (şi posibil, mai eficientă): anume, putem specifica diverse cazuri particulare în clauze separate (dar "în cadrul" aceluiaşi predicat):

gcd(A, 0, A) :- A > 0. % dacă A > 0, atunci gcd(A, 0) este A

gcd(A, B, G) :- % gcd(A,B) este G dacă: B > 0, % B > 0 (n-a ajuns zero) şi R is A mod B, % (R fiind restul împărţirii lui A la B), gcd(B, R, G). % avem G = gcd(B,R).

Acum predicatul "gcd" este format din două clauze; condiţiile A > 0 şi B > 0 exclud cazul gcd(0, 0, G) (acum obţinem corect "false" şi nu valoarea 0). În plus, am reuşit astfel (separând clauzele) să evităm construcţia IF-Then-Else (care este în general costisitoare, ca timp de execuţie).

Lucrurile nu decurg totuşi după cum ar fi de dorit:

[trace] ?- gcd(2, 0, 2).

Call: (6) gcd(2, 0, 2) ? creep % găseşte clauza gcd(A, 0, A), "înlocuind" A cu 2

^ Call: (7) 2>0 ? creep % "A > 0" ? (din prima clauză)

^ Exit: (7) 2>0 ? creep

Exit: (6) gcd(2, 0, 2) ? creep

true ; % prima clauză este satisfăcută, dar există alternative (tastăm ;)

Redo: (6) gcd(2, 0, 2) ? creep % găseşte şi a doua clauză, cu A <-- 2 şi B <-- 0

^ Call: (7) 0>0 ? creep % "B > 0" ? (din a doua clauză)

^ Fail: (7) 0>0 ? creep

Fail: (6) gcd(2, 0, 2) ? creep

false. % a doua clauză nu este satisfăcută

Page 131: tutoriale vba

Având scopul gcd(2,0,2), interpretorul a căutat în baza de date curentă o declaraţie potrivită scopului respectiv şi a găsit întâi regula cu antetul gcd(A,0,A) (prin înlocuirea "necunoscutei" A cu valoarea 2, capul acestei reguli devine identic scopului de satisfăcut).

Găsirea unei "potriviri" are de obicei, două urmări: interpretorul reţine intern locul în care a găsit-o (dacă ulterior va fi cazul, va relua căutarea din acel loc) şi respectiv, se trece la "executarea" corpului constituent al regulii găsite.

În cazul redat mai sus, se execută (6) şi apoi (7), încheind cu rezultatul "true" verificarea primei reguli găsite. Dar după ce afişează acest răspuns, interpretorul trece în starea de aşteptare: dacă se tastează ; atunci interpretorul execută "Redo" - adică reia căutarea din precedentul punct în care a reţinut că există alternative (în cazul de faţă, alternativa următoare în baza de date este gcd(A,B,G) care se potriveşte scopului prin substituţia lui A cu 2, a lui B cu 0 şi a lui G cu 2).

Este clar că execuţia ar fi trebuit încheiată imediat după verificarea primei reguli. O metodă uzuală pentru a impune aceasta (influenţând din afară, mecanismul intern de backtracking) constă în folosirea operatorului denumit cut şi notat prin ! (acesta elimină - sau "taie" - punctele de revenire precedente). Prima clauză se rescrie atunci astfel:

gcd(A, 0, A) :- A > 0, !. % ("cut") ignoră alternativele precedentului "Call"

Cu această mică modificare (am adăugat ! în prima clauză "gcd"), dacă reluăm trasarea pentru gcd(2,0,2) (redată mai sus pentru cazul fără "cut") - constatăm că acum execuţia se încheie corect, adică imediat după constatarea verificării primei clauze.

Triplete pitagoreice primitive

Să găsim triunghiurile dreptunghice distincte care au catetele numere naturale coprime; acestea sunt numite primitive Pythagorean triple (PPT).

Vorbim deci de tripletele (a,b,c) de numere întregi pozitive care satisfac relaţiile: a < b, gcd(a, b) = 1 şi c2 = b2 + a2 (unde gcd este predicatul definit mai sus, pentru cel mai mare divizor comun).

"a < b" exclude triunghiurile congruente (triplete ca (3,4,5) şi (4,3,5)), iar "a şi b sunt coprime" exclude asemănarea (de exemplu (3k, 4k, 5k) în care k este un factor arbitrar).

O descriere brută a proprietăţii PPT poate fi următoarea:

ppt(A, B, C) :- % (A,B,C) este PPT (dar cu C <= 100) dacă: between(5, 100, C), % C are o valoare 5..100 between(4, C, B), % B referă un întreg 4..C (valoarea curentă a lui C) between(3, B, A), % A referă un întreg 3..B_curent gcd(A, B, 1), % A şi B nu au divizori comuni (afară de 1) C^2 =:= A^2 + B^2. % şi în final, este verificată teorema lui Pitagora

Privind between/3: ?- help(between)., sau ?- explain(between).

Page 132: tutoriale vba

Adăugăm această definiţie în fişierul "pitagora.pl" (unde există deja predicatul gcd/3) şi reîncărcăm fişierul (la promptul interpretorului tastăm "scurtătura" [pitagora].). Formulăm întâi interogări de forma "este adevărat că tripletul cutare este PPT ?":

?- ppt(3, 4, 5).

true. % se îndeplinesc toate clauzele PPT

?- ppt(4, 3, 5).

false. % Nu satisface a treia clauză ("not" between(3,B,A), unde B=3 şi A=4)

?- ppt(30, 40, 50).

false. % Nu satisface a patra clauză (avem "not" gcd(30,40, 1))

Pentru un alt exemplu, (20, 99, 101) este PPT - dar ppt(20,99,101) va răspunde "false", pentru că nu este satisfăcută prima clauză şi ca urmare, nu se mai ajunge la verificarea celorlalte clauze.

Dar definiţia de mai sus permite şi întrebări de genul "care sunt valorile care satisfac" PPT:

?- ppt(A, 20, C).false. % Nu există A, C încât A este prim cu 20 şi A2 + 202 = C2

?- ppt(A, 40, C).A = 9,C = 41 ; % tripletul (9, 40, 41) este PPT (şi tastăm ;)false. % Nu există o altă soluţie (A, 40, C)?- ppt(X, Y, 65).X = 33,Y = 56 ; % tripletul (33, 56, 65) este PPTX = 16,Y = 63 ; % (16, 63, 65) este PPTfalse. % Nu mai sunt soluţii (pentru C=65)

Dacă vrem o afişare mai convenabilă, putem folosi predicatul predefinit writeln; iar dacă vrem să forţăm "Redo" (reluarea căutării pentru o altă soluţie, fără să mai tastăm ;) atunci putem adăuga fail:

... % operăm la sfârşitul definiţiei lui ppt:

C^2 =:= A^2 + B^2, % am şters . final, înlocuind cu ,

writeln((A, B, C)), fail.

Reîncărcând apoi "pitagora.pl", vom obţine:

?- ppt(X, Y, 65).

33,56,65

16,63,65

false.

fail forţează backtracking-ul, încât primim deodată toate răspunsurile.

De obicei însă, alta ar fi perspectiva care ne-ar interesa: vrem tripletele "libere" (fără să fixăm vreo valoare A, B, sau C) până la o anumită limită (de exemplu, toate sistemele PPT cu C ≤ 1000; sau eventual, numai pe acelea pentru care 1000 ≤ C ≤ 2000).

Page 133: tutoriale vba

Deci, în primul rând, trebuie să considerăm două argumente Min şi Max, între valorile cărora să varieze "necunoscuta" C. Putem considera pentru Min valoarea implicită 5:

ppt(N) :- ppt(_, _, N, 5). % toate PPT (c,b,a) cu 5 ≤ c ≤ N (c > b > a)

ppt(N, Min) :- ppt(_, _, N, Min). % toate PPT (c,b,a) cu Min ≤ c ≤ N (c > b > a)

ppt(A, B, Max, Min) :- between(Min, Max, C), % generează o valoare C încât Min ≤ C ≤ Max between(4, C, B), % 4 ≤ B ≤ C_curent between(3, B, A), % 3 ≤ A ≤ B_curent A^2 =:= (C - B) * (C + B), % ceva mai convenabil, decât C^2 =:= A^2 + B^2 gcd(A, B, 1), % A şi B sunt coprime writeln((C, B, A)), fail. % afişează soluţia şi reia ("Redo")

Dacă vrem toate PPT până la 100: ppt(100) (vezi imaginea alăturată). Renunţând la clauza gcd(A,B,1) (o putem "comenta", prefixând cu %) şi repetând - reîncărcăm fişierul şi lansăm ppt(100) - vom obţine toate cele 52 de triplete pitagoreice până la 100 (nu numai pe cele 16 care sunt PPT).

Însă de exemplu pentru ppt(600, 500), rezultatul (lista PPT, între 500 şi 600) se obţine mult mai încet. Aceasta, pentru că - faţă de versiunea "brută" iniţială - nu am prevăzut decât "optimizări" minore (nelegate de fondul problemei): am înlocuit "C^2 =:= A^2 + B^2" cu o expresie care se evaluează ceva mai repede şi pe de altă parte, am inversat locurile pentru această clauză şi respectiv, clauza gcd(A,B,1) (ceea ce este totuşi important: pentru exemplul din imagine, gcd(A,B,1) se va apela acum numai pentru cele 52 de triplete pitagoreice).

Un PPT (a,b,c) are câteva proprietăţi implicite foarte simple, de care am putea ţine seama în vederea eficientizării programului.

Page 134: tutoriale vba

a şi b fiind coprime, rezultă că a, b, c sunt prime două câte două şi c este impar; deci between(Min, Max, C) ar trebui să genereze doar valorile C impare.

Pătratele dau sau restul 0, sau restul 1 la împărţirea prin 3; deci, reducând modulo 3 egalitatea a2 + b2 = c2, avem sau 0+1=1, sau 1+0=1 (cazul 0+0=0 trebuie respins fiindcă a,b,c sunt coprime; cazul 1+1=1 trebuie evident, respins). Rezultă că sau a, sau b este divizibil cu 3 (iar c nu poate fi multiplu de 3).

O analiză similară pentru resturile împărţirii prin 4 arată că valorile C trebuie să fie nu numai impare (cum am văzut mai sus), dar chiar congruente cu 1 modulo 4.

Analog avem: modulo 16, pătratele sunt 0, 1, 4, sau 9; analizând cazurile posibile pentru a2 + b2 = c2 (modulo 16) rezultă că fie a, fie b este multiplu de 4.

Putem evita deocamdată, modificarea "radicală" a programului de mai sus (ar trebui rescris between, încât să genereze numai anumite valori - dar în feluri diferite pentru C, B şi respectiv pentru A). Putem sintetiza cele stabilite mai sus în două clauze: produsul a*b se divide cu 12 şi respectiv, C ia numai valori congruente modulo 4 cu 1:

ppt(A, B, Max, Min) :- between(Min, Max, C), % generează o valoare C încât Min <= C <= Max 1 =:= C mod 4, % Dar respinge imediat ("Redo") dacă C nu este 1 modulo 4 between(4, C, B), between(3, B, A), 0 =:= A*B mod 12, % "Redo" dacă A*B nu se divide cu 12 A*A =:= (C - B) * (C + B), % A*A este mai eficient ca A^2 (sau A**2) gcd(A, B, 1), writeln((C, B, A)), fail. % afişează soluţia şi reia ("Redo")

Reîncărcând "pitagora.pl" putem constata că viteza de execuţie se măreşte de câteva ori, faţă de prima versiune. De exemplu, lista PPT până la 500 rezultă cam în 8 secunde; dar mai departe până la 1000, se ajunge totuşi la 1 minut:

?- time(ppt(1000)). % pentru documentare, ?- help(time).

5,4,3

13,12,5

. . . . . .

985,864,473

997,925,372

/* în cazul A^2 =:= (C - B) * (C + B)

52,959,287 inferences, 64.073 CPU in 64.121 seconds (100% CPU, 826543 Lips) */

/* în cazul A*A =:= (C - B) * (C + B)

52,959,130 inferences, 55.258 CPU in 55.295 seconds (100% CPU, 958397 Lips) */

Page 135: tutoriale vba

Iniţial, am folosit în program operatorul de ridicare la putere, A^2; dar - cum se poate deduce din listingul de mai sus - acesta necesită inferenţe în plus şi timp mai mare decât înmulţirea de întregi (fiindcă angajează reprezentări şi calcul în virgulă mobilă).

Dacă îndrăznim mai departe… ppt(2000, 1000) rezultă cam în 6.5 minute (folosind A*A; respectiv, peste 7 minute când s-ar folosi A^2).

Dar programul poate servi pentru diverse alte obiective (nu numai pentru a lista tripletele PPT între două limite fixate, ca mai sus). De exemplu: care PPT (A,B,C) cu C < 1000 au A divizibil cu 100:

?- L=[100,200,300,400,500,600,700,800,900], % Lista multiplilor de 100 (< 1000)| member(A, L), % selectează în A un membru din lista L| ppt(A, Y, 1000, 100). % PPT (A, Y, C) cu C < 1000629,621,100641,609,200661,589,300689,561,400false.

Care triplete PPT între 1000 şi 2000, au A impar între 49 şi 63:

?- between(49, 63, A), 1 =:= A mod 2, ppt(A, Y, 2000, 1000).

1201,1200,49

1301,1300,51

1405,1404,53

1513,1512,55

1625,1624,57

1741,1740,59

1861,1860,61

1985,1984,63

false.

Pentru tripletele obţinute mai sus avem C - B = 1. Există şi alte asemenea triplete? Putem folosi "ppt" inclusiv în scopul verificării satisfacerii proprietăţii PPT prin ?- ppt(45, 1012, 1013, 5). (sau, un exemplu cu A=900: ?- ppt(900,2419,2581, 2581).).

Numărarea soluţiilor, în Prolog

Dacă ne interesează câte soluţii sunt şi nu lista acestora, în SWI-Prolog putem folosi meta-predicatul aggregate(count, Goal, Result): apelează clauzele sau predicatul Goal şi contorizează soluţiile, returnând numărul acestora în variabila "Result".

Să eliminăm în prealabil, ultima linie din programul de mai sus (nu ne mai interesează "writeln" - deci comentăm întreaga linie şi punem . după clauza gcd(A, B, 1)); reîncărcând apoi "pitagora.pl", putem obţine numărul de triplete PPT între diverse limite, astfel:

?- aggregate(count, ppt(1000), S).

S = 158.

Page 136: tutoriale vba

?- aggregate(count, ppt(2000,1000), S).

S = 161.

Deci 158 de triplete PPT au ipotenuza mai mică decât 1000 - ceea ce este corect (vezi A101931) şi sunt 161 de triplete PPT cu ipotenuza cuprinsă între 1000 şi 2000.

Obs. Numărul de PPT cu ipotenuza < N este aproximativ N / (2*PI) ≊ 0.1591549*N (D. N. Lehmer, 1900) şi avem prilejul să verificăm calitatea acestei aproximări: pentru N=1000 ea dă 159, iar pentru N=2000 dă 318 (faţă de valorile exacte 158 şi respectiv 158+161 = 319).

Putem formula şi o investigaţie mai "amănunţită":

?- time((member(N, [100,200,300,400,500,600,700,800,900,1000]),

Min is N-100,

aggregate(count, ppt(N, Min), S), % PPT cu ipotenuza între Min şi N

writeln((Min-N:S)), fail)).

0-100:16 % 16 PPT cu ipotenuza < 100

100-200:16 % 16 PPT cu ipotenuza între 100 şi 200

200-300:15

300-400:16

400-500:17

500-600:15

600-700:17

700-800:16

800-900:12

900-1000:18

% % 52,959,340 inferences, 55.136 CPU in 55.187 seconds (100% CPU, 960527 Lips)

time/1 cere un singur argument şi de aceea, am parantezat setul celor patru clauze care formează interogarea (regulă uzuală, când mai multe clauze ale unui aceluiaşi scop trebuie văzute ca un singur argument). Dacă adunăm valorile obţinute aici pe intervale de lungime 100 - obţinem într-adevăr, totalul de 158 găsit anterior pentru numărul de PPT până la 1000.

Dar aggregate face parte dintr-un modul specific interpretorului SWI-Prolog. O soluţie mai portabilă constă în folosirea unui predicat ca findall (sau "find_all" în alte interpretoare):

?- findall( (A, B), ppt(A, B, 500, 5), L ), length(L, S).

L = [(3,4),(5,12),(8,15),(7,24),(20,21),(12,35),(9,40),(28,45), (..., ...)|...],

S = 80.

Orice triplet PPT este unic determinat de catetele sale; findall/3 colectează soluţiile (A,B) ale ppt(A,B,500,5) în lista L; apoi, length/2 furnizează în S lungimea listei L, deci numărul de PPT.

Page 137: tutoriale vba

Desigur, am parantezat (A, B) încât să constituie un singur argument în "findall"; dar în acest caz, "parantezarea" este în acelaşi timp un şablon pentru elementele listei (în L avem: (3, 5), etc.) şi se putea folosi şi vreun alt format (de exemplu, findall(A-B, ...) ducea la L = [ 3-4, 5-12, ...]). De observat în plus, verificarea estimării lui Lehmer: 0.1591549 * 500 ≊ 79.58 ≊ 80.

Mai dăm un exemplu (în care avem iarăşi o "parantezare", în scopul unificării într-un singur argument): să găsim PPT în care catetele sunt numere consecutive:

?- findall( A-B, (ppt(A, B, 1000, 5), B-A =:= 1), L ), length(L, S).L = [3-4, 20-21, 119-120, 696-697],S = 4.

Această metodă serveşte situaţia în care este necesară lista soluţiilor (ca obiect în contextul execuţiei programului, nu doar ca afişare), în scopul prelucrării în program. Dacă vrem doar numărul de soluţii, atunci metoda bazată pe "findall" devine artificială (nu este necesară lista soluţiilor).

Prin urmare, ajungem la această problemă: cum se contorizează soluţiile unui predicat, în Prolog? Într-un limbaj ca C++ instituim o variabilă globală iniţializată cu 0 şi o incrementăm după fiecare soluţie obţinută. Dar în Prolog variabilele sunt totdeauna "locale" predicatului în care apar şi în plus, nu există "atribuire" (memorare a unei valori într-o variabilă) ci "unificare"; intern, "ppt(A,B,100,5)" (şi orice alt termen) este reprezentat printr-o structură de pointeri (unul pentru functorul "ppt" şi câte unul pentru fiecare argument) şi "unificarea" revine în fond la validarea faptului că doi pointeri (sau copii locale ale lor) referă o aceeaşi zonă (deci variabilele corespondente "au aceeaşi valoare").

În Prolog, "program" înseamnă declaraţii într-o "bază de date" şi interogări - încât "global" revine la un fapt/regulă/predicat care, fie există din start (predicate predefinite) fie este definit în baza de date indicată interpretorului de către utilizator, fie este adăugat bazei de date existente, prin efectul curent al execuţiei interogărilor programului-utilizator. (este de observat că este vorba de "global", dar nici într-un caz de "variabilă globală").

Se pot adăuga declaraţii în baza de date existentă folosind assertz (sinonim cu assert) şi asserta ("la sfârşit", respectiv "la început"); iar pentru "extragere" şi eliminare - retract:

?- assert(elev(['Popa', 'Ion'])).

true.

?- elev(Nume).

Nume = ['Popa', 'Ion'].

?- retract(elev(X)).

X = ['Popa', 'Ion'].

?- elev(Nume).

false.

În acest exemplu de lucru, prin prima interogare s-a adăugat elev(['Popa', 'Ion']) în baza de date; apoi s-a chestionat: există o valoare pentru "necunoscuta" Nume care să satisfacă termenul "elev"?. Într-o interogare ulterioară, am folosit retract pentru a extrage într-o variabilă X argumentul

Page 138: tutoriale vba

termenului "elev" existent şi a elimina apoi acest termen din baza de date (interogarea ulterioară "elev(Nume)" nu mai poate fi satisfăcută, fiindcă faptul respectiv nu mai există).

Un meta-predicat count(Goal, N) care să lanseze repetat un predicat Goal indicat ca argument şi să contorizeze de câte ori este satisfăcut acesta (altfel spus, să dea numărul N de soluţii ale predicatului indicat ca argument) se poate defini folosind assert şi retract astfel:

% count(Goal, N) furnizează în N numărul soluţiilor predicatului Goal

count(Goal, N):-

assertz(contor(0)), % iniţializează contorul de soluţii

count_(Goal), % lansează repetat Goal şi actualizează contorul

/* Următoarea clauză se va executa numai dacă count_(Goal) dă "true" */

retract(contor(N)). % obţine în N valoarea finală a contorului

count_(Goal):- % Apelează repetat Goal, cât timp este satisfăcut ("true").

call(Goal), % Când Goal dă "false", încheie count_(Goal) cu "false".

retract(contor(N)), % Dacă Goal este "true": N = rangul soluţiei precedente,

M is N + 1, % retractează contorul curent, incrementează N şi

assertz(contor(M)), % înscrie contorul corespunzător acestei ultime soluţii.

fail. % Forţează backtracking la call(Goal), pentru o nouă soluţie.

count_(_). % Încheie count_(Goal) cu "true" şi după ce s-au epuizat soluţiile.

Uneori e mai greu de explicat "ce face" programul, decât să-l scrii - dar ne-am străduit mai sus, să comentăm corespunzător clauzele respective. Dacă ultima clauză ar lipsi, atunci apelul "count_(Goal)" (a doua linie din "programul principal") s-ar încheia cu "false" şi nu s-ar mai ajunge la clauza "retract(contor(N))"; poate că formularea cu If-Then-Else este mai clară:

% formulare cu If-Then-Else (nu mai necesită clauza finală "count_(_).")

count(Goal, N):-

assertz(contor(0)), % iniţializează contorul de soluţii

( count_(Goal) % va apela recursiv Goal, până când rezultă "false"

; % "ELSE" (count_(Goal) nu este satisfăcut) - execută "retract"-ul

retract(contor(N)) %

).

Însă în program am preferat (am justificat undeva mai sus, de ce) varianta fără If-Then-Else, adăugând atunci clauza finală count_(_)..

Într-un exemplu redat mai sus am văzut cum putem folosi aggregate pentru a obţine numărul de soluţii: s-a generat lista soluţiilor şi s-a afişat lungimea acestei liste. Să lansăm acelaşi test, folosind de data aceasta count, pentru a număra direct soluţiile:

Page 139: tutoriale vba

?- time(( % a doua paranteză este necesară fiindcă time/1 are un singur argument

member(N,[100,200,300,400,500,600,700,800,900]),

Min is N - 100,

count(ppt(N, Min), S),

writeln(Min-N: S), fail

)).

0-100:16

100-200:16

. . . . . .

700-800:16

800-900:12

% 38,584,787 inferences, 39.969 CPU in 40.000 seconds (100% CPU, 965362 Lips)

Desigur, constatăm că - numărând direct soluţiile prin count, fără a genera lista acestora ca în aggregate - timpul este sensibil mai bun (40 secunde, faţă de 55 secunde).

În În jurul unei probleme de echilibru (II) ne-am ocupat de generarea unui anumit tip de partiţii întregi, constituind fişierul "espart2.pl" conţinând predicatele "espart2" şi "parts_2". Dacă vrem să contorizăm soluţiile folosind predicatul definit mai sus count, înlocuim linia

Suma_curenta =:= Numar_de_inclus -> scrie([Numar_de_inclus | Part])

din corpul predicatului parts_2" (linie prin care afişam soluţia curentă), cu:

Suma_curenta =:= Numar_de_inclus -> true % Nu mai interesează soluţiile, ci numărul lor

şi adăugăm în fişierul "espart2.pl" următorul predicat (angajând şi count):

espart3(N, Count) :-

halfTrig(N, Suma_initiala),

count(parts_2(N, [0], Suma_initiala), Count).

Încărcând pe lângă "pitagora.pl" (în care avem definit count) şi "espart2.pl" (după salvarea modificărilor precizate mai sus), putem formula de exemplu, următoarea interogare:

?- between(10, 25, N), espart3(N, X), writeln(N: X), fail.

10:40 15:722 20:15272 25:353743

11:70 16:1314 21:28460 false.

12:124 17:2410 22:53222

13:221 18:4441 23:99820

14:397 19:8220 24:187692

Am obţinut astfel numărul de "s-partiţii" ale segmentului natural [n], pentru n=10..25 (dar vezi totuşi În jurul unei probleme de echilibru ( I ) o soluţie mai rapidă, angajând o funcţie generatoare pentru numărul de s-partiţii).

Page 140: tutoriale vba

    Username / Parola inexistente

Register

Home Documente Upload Resurse Alte limbi

CATEGORII DOCUMENTE

Afaceri

Calculatoare

Casa masina

Didactica pedagogie

Diverse

Educatie

Finante

Geografie

Istorie & politica

Legislatie

Limba

Management

Sanatate

Tehnologie

DISTRIBUIE DOCUMENTUL

Vizualizari: 580

Distribuie URL

Adauga cod

DOCUMENTE SIMILARE

Share on facebook Share on twitter Share on email Share on print More Sharing Services 0

Componentele arhitecturii ISA x86 PROIECT INGINERIA SISTEMELOR

Internetul - Comunicarea client - server

Limbajul algoritmic (pseudocodul) Stergerea folderelor si fisierelor CODIFICAREA DATELOR Utilizarea vederilor dinamice in administrarea bazei de date Oracle9I

Page 141: tutoriale vba

Importanta:

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

HTML in site

Termeni si conditii de utilizare | Contact © SCRIGROUP 2013. All rights reserved

price.ro Forum > Help > Aplicaţii şi Internet > Am nevoie de-o indrumare in Excel...

: Am nevoie de-o indrumare in Excel...

bertiAs vrea sa fac o mica baza de date in Excel... si nu stiu cum.

Problema se da in felu urmator:

intr-o celula am un numar, cand introduc in numarul celula vreau ca numaru sa fie salvat pe un alt sheet (sa zicem Sheet2).

In momentul in care schimb din nou numarul din celula respectiva, vreau ca noul numar sa fie salvat in urmatoarea celula din Sheet2. Adica sa formeze un fel de History...

Am tot cautat o comanda, care sa-mi permita sa scriu intr-o celula "remotely", imi imaginez ceva de genu WriteTo(B2,"Test")... exista asa ceva? Sau cum s-ar putea face altfel?

Sper ca m-am facut inteles :)

Multumesc anticipat de raspunsuri !

Page 142: tutoriale vba

AdrianB1Ca sa scrii o valoare intr-o celula comanda este:

Worksheets(i).Cells(j, k).Value = valbertiAdrian, asta-i comanda de VB?

Din pacate nu ma prea descurc cu V Basicu', alta solutie nu exista? Ma refer la vreo comanda "clasica" de Excel!liviutzaok, tu ai nevoeid e putin Visual Basic pentru cestia asta. ma cam ocup, asa ca as incerca sa-ti trimit un fisier care sa te ajute. PM me ca sa ti-l dau pe mail, te rog. Altminteri, ca idee, e simplu:cand schimbi celula, valoarea e pusa in prima casuta libera din zona urmatoare. doar ca excelul nu poate face asta implicit, ci trebuie sa folosesti o boaba de programare.bertiCu ajutorul lui Liviutza am rezolvat problema. Thanks again! :)

Intr-adevar merge doar cu Visual Basic, dar nu-i asa de greu pe cat pare.WormAm si eu o intrebare, daca tot suntem la capitolul Excel: exista posibilitatea ca atunci cand sterg o celula dintr-un rand, celulele imediat urmatoare sa "umple" golul lasat (sa se mute automat la stanga)?Muchos gracias!cata181Asta vrei?WormNu, vreau ca atunci cand sterg continutul unei celule, toate celulele din dreapta sa se mute automat spre stanga (sa nu ramana celule goale la inceputul randului).liviutzain principiu cred ca se poate realiza si asta cu un pic de visual basic, dar e profund nerecomandat. daca ai formule cumva in document, stergerea unor celule si mutarea altora poate face ca formulele sa se duca in balarii. daca poti sa-mi detaliezi problema pe care o ai e rezolvat, poate am vreo idee.WormIdeea era sa nu stea datele "imprastiate"; este vorba de un fisier care se modifica destul de des pe parcursul unei zile si se sterg in mod aleator diverse celule iar ceea ce vreau eu ar avea rolul de a usura cautarea (stiu ca exista si Ctrl+F dar ar fi mult mai simplu asa cum vreau eu).

Thanx!liviutzadepinde care e structura datelor, in cazul asta. Cel mai ok ar fi sa stergi o coloana intreaga sau un rand intreg. In principiu, intr-o lista oarecare datele de pe orica rand pot fi sterse independent de datele din celelalte randuri. Asta daca datele din lista sunt asezate cat de cat ordonat. In conditiile in care ai un tabel cu linii si coloane in care stergi din cand in cand ceva e sters aleatoriu e cam bulibaseala din start. poate ar trebui sa schimbati sistemul in ceva cu linii si coloane in care sa poata fi sterse, cum ziceam, linii sau coloane fara sa afecteze restul datelor. In felul asta ai putea executa "compactarea" datelor la intervale stabilite de timp. ar merge chiar si pe modelul vostru, dar nu poate sa-l faca decat cineva care stie toate "regulile".pUnKRoCK

Page 143: tutoriale vba

Salutari. Cer si eu ajutorul expertilor in Excel. Atasez o imagine din care reiese cam ce vreau. Nu stiu insa daca e realizabil, insa incercarea moarte nu are, nu?! :yeap: Multumiri. :jap:Thor1983Se poate.Vezi ca la Formula ai si expresii conditionale,tot ce iti trebuie.La Insert Function/Logical ai IF. Daca nu te descurci revino cu amanunte.pUnKRoCKAaa... nu ma descurc! :damn:

PS: Precizez ca valorile din tabelele din dreapta sint constante!liviutzacred ca e o chestie de sintaxa. daca ai de pus doua conditii, ar trebui scris cam asa

daca a=1 si a=2

se scrie

=if(and(a=1,a-2),da,nu)Thor1983Uite ca merge. In casuta G1 scrii: =IF(AND((D1="Da"),(F1=L1)),(M1*E1))PS:vezi ca te ajuta cand construiesti sheet-ul sa folosesti chiar indicele casutei respective,nu un indice ales de tine. De ex. pt. M1 foloseste M1 sau m1,in loc de k1.Spor la treaba1pUnKRoCKMa gindesc daca pot introduce in cimpul L un mic "meniu" cu sageata de unde sa pot selecta valorile corespunzatoare lui j1-j10 (la fel, intr-un cimp separat acelasi lucru pentru m1-m9 si p1-p4), iar in cimpul D1 o sageata de unde sa pot alege intre da si nu. Mai exact sa dau click pe sageata jos in D1, selectez da, apoi in cimpul L1 selectez j3 si in cimpul M sa apara automat valoarea k3 (sau l3 in cazul alegerii lui nu).Nu stiu daca m-am facut inteles, dar j1-j10 iau valoarea k1-k10 daca D=da, si l1-l10 daca D=nu. Similar pentru m1-m9 si p1-p4!Ajutati un om la nevoie, fac cinste daca iese! Promit. :jap::thumbs:pUnKRoCKThor1983, merge !!! Mersi!!! :thumbs: Intrebare: merge sa pun intr-un cimp 2 sau mai multe formule? Daca da, cum fac?pUnKRoCKOk, am descoperit! Se pot pune mai multe functii intr-o celula cu + intre formule cu precizarea ca in formula lui Thor1983 trebuiesc inlocuite virgulele cu ";"Mersi Thor1983, sint dator de cinste. Cind vrei tu, unde vrei tu! Promisiunea e promisiune! :jap:psihologuE sigur realizabil, dar nu e prea clar :)Uite un screenshot si fisierul Excel.Am rezolvat treaba numai pentru celula g (restul sunt asemanatoare si te descurci, cred)."g=K1*e" - nu prea vad cum inmultesti stringul "da" cu o lta valoare (numerica), asa ca am pus eu peste tot numere. Daca "da" inseamna 1 sau alte chestii d-astea, aia e altceva. Oricum se face la fel.Esenta rezolvarii e un if in if.Deci celula notata de tine g va respecta o logica trivalenta (daca nu sunt indeplinite conditiile

Page 144: tutoriale vba

din cele 2 ramuri - ce contin AND, va aparea "st nedef").

"C:\book.gif"

Functia din celula g1 arata cam asa:

"=IF(AND(D1="da";F1=J1);K1*E1;IF(AND(D1="nu";F1=M1);N1*E1;"st. nedef."))"

Foarte intuitiva interfata, daca m-am chinuit sa inserez o imagine de pe hard si se vede ce a iesit. Cum naiba se foloseste insert image???Roger(...)cu precizarea ca in formula lui Thor1983 trebuiesc inlocuite virgulele cu ";"

De fapt contează ce setare ai în Control Panel - Regional Settings - Numbers - LIST SEPARATORpUnKRoCKDupa indicatiile lui Thor1983 pina la urma functia din G arata cam asa:=IF(AND((H8="da");(J8=150));(I8*0,029))+IF(AND((H8="da");(J8=125));(I8*0,02))+IF(AND((H8="da");(J8=100));(I8*0,012))+IF(AND((H8="da");(J8=80));(I8*0,008))+IF(AND((H8="da");(J8=65));(I8*0,005))+IF(AND((H8="da");(J8=60));(I8*0,004))+IF(AND((H8="da");(J8=50));(I8*0,003))+IF(AND((H8="da");(J8=35));(I8*0,001))+IF(AND((H8="da");(J8=25));(I8*0,0005))+IF(AND((H8="nu");(J8=250));(I8*0,049))+IF(AND((H8="nu");(J8=200));(I8*0,031))+IF(AND((H8="nu");(J8=150));(I8*0,018))+IF(AND((H8="nu");(J8=125));(I8*0,012))+IF(AND((H8="nu");(J8=100));(I8*0,008))+IF(AND((H8="nu");(J8=80));(I8*0,005))+IF(AND((H8="nu");(J8=65));(I8*0,003))+IF(AND((H8="nu");(J8=50));(I8*0,002))+IF(AND((H8="nu");(J8=40));(I8*0,001))+IF(AND((H8="nu");(J8=25));(I8*0,0005))Si functioneaza cum trebuie!Mersi guys! :thumbs:liviutzaca idee, ar fi de retinut faptul ca pe doua calculatoare diferite formulele nu arata la fel. adica o formula luata de aici cu copy / paste s-ar ptuea sa nu functioneze. asta din cauza ca Excel-ul foloseste ca separatori intre variabilele functiilor ceea ce e definit pe fiecare calculator in parte - de exmplu, virgula in cazul meu, punct si virgula in cazul lui pUnKRoCK.peraSalutare. Am si eu nevoie de o indrumare in Excel.Mai exact as vrea ca in coloana w din sheet2 sa imi apara textul "X" daca in sheet1 A2=da, "Y" daca B2=da sau "Q" daca si A2 si B2 sint da. Nu ma intereseaza situatia in care si A2 si B2 sint "nu".Multumesc.:jap:miahi=IF(AND(Sheet1!A2="da";Sheet1!B2="da");"Q";IF(Sheet1!A2="da";"X";IF(Sheet1!B2="da";"Y";"don't care")))peraWow, ce prompt.Mersi man, merge !!! I-am dat un copy/paste si e ok, acum incerc sa inteleg logica, ca sa pot folosi metoda si cu alta ocazie.:jap:pera

Page 145: tutoriale vba

Salutare.As mai avea o intrebare legata de Excel si anume:Am un fisier (sa-i spunem o baza de date) cu diverse informatii (tabelul de sus din imagine) si vreau ca atunci cind in alt fisier introduc date doar in primele doua coloane, restul informatiilor sa fie extrase automat din tabelul baza de date.Este posibil acest lucru? Daca da, v-as fi recunoscator daca mi-ati explica cum se face.:jap:RogerFoloseşte funcţia VLOOKUP. Scuze că nu pot da mai multe detalii, eram doar în trecere...WSVezi arhiva atasata. Sa le pui in acelasi director.Nu am reusit sa fac cautare dupa ambele campuri asa ca am facut cautare numai dupa bloc.Datele sunt in Book1, iar actualizarea se face automat in Book2.Cand deschizi Book2 s-ar putea sa te intrebe daca vrei sa faci update la link-uri. Sa dai click pe Update.

Succes!!!peraMultumiri pentru raspunsuri. :thumbs:WS, ma intereseaza totusi sa caut dupa ambele cimpuri (cartier si bloc), pentru ca pot exista mai multe blocuri cu acelasi nume si pot aparea incurcaturi.Inca ceva: am un fisier care are aproximativ 60 de sheet-uri. Cum fac sa unesc continutul tuturora intr-un singur sheet?Mersi. :jap:WormExista o conditionare (sau o alta modalitate) ca data mai veche cu 3 luni decat data curenta sa se coloreze intr-o culoare iar data mai veche de 4 luni decat data curenta sa se coloreze in alta culoare? Daca era vorba de cifre, era simplu dar faza cu data m-a cam bagat in ceata...

Multumesc!WSEu aici am facut ca data mai veche de 3 luni sa se coloreze in rosu, iar ce nu indeplineste conditia sa se coloreze in albastru. In principiu am calculat in doua coloane diferite diferenta dintre luna curenta si cea din celula, respectiv diferenta dintre anul curent ci cel din celula si apoi am comparat valorile respective cu 3. Pe modelul asta poti adauga cate conditii doresti. Daca vrei poti sa ascunzi cele doua coloane.Consulta si fisierul atasat.Succes!miahiMerg şi concatenate formulele într-o formulă mare de conditional formatting, nu trebuie neapărat puse în alte coloane.WSAsa este, insa mi s-a parut mai explicit asa.liviutzanici macar nu e nevoie sa le concatenezi. cel mai simplu e sa utilizezi conditional formatiing, care acepta pana la 3 conditii exprimate separat. Se ajunge in meniul repsctiv cu fromattinf / conditional formatting, si e extrem de util pentru a modifica aspectul unor celule in functie de continutul lor sau de alte conditi.miahi

Page 146: tutoriale vba

Păi conditional formatting se subînţelege, e mai mult de muncă să faci colorarea prin scripting.WormVa multumesc tuturor pentru raspunsuri dar... inca n-am reusit. Si nu pot sa-mi dau seama de ce nu merge! Am incercat cu solutia data de WS; din cate vad doar o conditionare merge. O intrebare: la inceputul formulei pentru cea de-a doua conditionare folosesc tot =AND? Am incercat asa si nu merge; si am incercat si cu =OR.Multumesc inca odata!WSIa vezi acum, ar trebui sa mearga.Problema la tine e ca datele mai vechi de 4 luni sunt mai vechi si decat 3 luni, adica sa indeplineste si prima conditie. Acum datele mai vechi de 4 luni se coloreaza in rosu, cele mai vechi decat 3 luni in verde, iar celelalte raman neschimbate.Sper ca am fost suficient de clar.Succes!!!WormWS, te rog, ataseaza-mi din nou fisierul, ca n-am reusit sa-l deschid pe cel de mai sus. Si spune-mi ce bere bei :beer:WSUite arhiva refacuta. Initial am arhivat cu WinZIP pe maximum (enhanced deflate). Acum am arhivat pe normal, asa ca ar trebui sa mearga. :thumbs:WormMultumesc, WS!BogdanAm si eu nevoie de o indrumare.Problema e in felul urmator: Am un fisier produse.xls in care am Numele produselor si pretul lor. Acum am un nou fisier (de ex. test.xls) inca care vreau sa afisez informatii (pretul) din produse.xls; acest lucru l-am facut cu functia VLOOKUP (dupa ce am citit pe forum :D ). Acum vine problema, toate is bune si frumoase in fisierul test.xls, daca introduci corect numele produsului. Cum se poate face ca numele produsului care il scrii intr-ul cell din test.xls, sa il poti selecta dintr-o lista de produse formata din produsele din fisierul produse.xls, fara sa deschizi fisierul produse.xls.

(ceva asemanator ca atunci cand intr-o coloana din excel cand incepi sa scrii iti apare cuvantul selectat care incepe cu literele care le-ai scris)

sper ca am fost inteles.

Va multumescliviutzao solutie, din mai multe posibile:

ai nevoie undeva, in test.xls, de linkuri la lista de produse din produse.xls. lista din test.xls se poate afla undeva intr-o coloana ascunsa, sa zicem B, iar tabelul "real" poate incepe de pe coloana D.

dupa asta se foloseste functia Data Validation. se afla in Data / Data validation, si permite ca in celulele la care se aplica sa poti introduce doar anumite valori, mai precis valori din lista ta de produse. de asemenea, permite ca in celulele selectate sa apara si optiunea de "scroll" si sa se vada lista valorilor care pot fi introduse in celula.

Page 147: tutoriale vba

PM me, daca ai intrebari suplimentare, si bafta!WormIntr-un fisier Excel am Auto Filter; cum fac ca in drop-down list sa imi apara mai mult de 1000 de referinte?

Thanx!WSIn helpul Excel-ului scrie:Only the first 1000 unique entries in a list appear when you click the arrow.WormMda, eram in viteza si n-am mai stat sa ma uit in help, nu mai zic de Google, ...O bila neagra (ca rosii nu mai avem) pentru Excel...

Multumesc, WS!WormSi inca o intrebare: nu reusesc sa trag cu VLOOKUP intr-un tabel centralizator date din 3 tabele; stiu ca se poate dar nu stiu exact ce semn trebuie sa pun in formula (imi trage datele dintr-un singur tabel). Scuze ca va plictisesc cu maruntisuri dar din help-ul Excel-ului n-am reusit sa aflu (si bineinteles ca iar n-am timp de sapat).

Thanx again!liviutzas-ar putea sa gresesc, dar nu cred ca se poate.cu o singura utilizare de vlookup. daca ai 3 tabele de forma:

a1:b20c1:d20f1:g20

nu poti utilzia un singur vlookup ca sa tragi date din cele trei tabele. merge o formula mai lunga care sa faca asta. daca vrei, da-mi un excel cu exemplu pe personala si incerc sa ti-l rezolv.AdrianB1Deja din întrebările pe care le pui cred că se simte nevoia unui Access. Excel nu e făcut să spele şi rufe, nu are "anti-calcar" :)

Serios, am văzut monştri în Excel (40 MB, zeci de foi şi zeci de mii de linii şi formule), dar i-aş împuşca pe cei care le-au creat. E un monument de contraproductivitate, deja o mică aplicaţie (de-aia sugeram Access) se impune.WormVa multumesc! Pana la urma n-a mai fost nevoie dar o sa incerc sa gasesc o solutie, pana la urma, ca mi-a ramas pe creieras :) Eram in viteza si nu m-am mai gandit si la tabele pivot sau la alte solutii.

Multumesc inca odata!peraSalutare. Revin si eu cu problema expusa aici (http://www.price.ro/forum/showpost.php?p=175965&postcount=27). am reusit cu functia VLOOKUP, insa aceasta creeaza confuzii

Page 148: tutoriale vba

atunci cind gaseste mai multe blocuri cu acelasi nume.Cum fac totusi ca VLOOKUP sa caute dupa doua cimpuri (cartier si bloc, in modelul atasat) ?Sau, exista o alta modalitate de a extrage informatii dintr-un tabel gen baza de date, conditionind interogarea de cautarea pe doua coloane din baza de date? (ca sa fiu mai clar, ceva de genul : Daca A= "Dr.Taberei" si B = "bloc A32" => adresa, etaje, scari...)Multumiri.liviutzacel mai usor e sa faci o concatenare. incearca fisierul atasat, ar trebui sa te ajute.peraLiviutza, multumesc mult, este exact ceea ce aveam nevoie. :thumbs: Esti tare, ramin dator.:jap:peraRevin cu o intrebare.Cum pot uni continutul a doua celule, in alta celula (a treia) ?Exemplu: presupunind ca celula A1 contine textul "mar", iar celula B1 contine textul "par", doresc ca celula C1 sa contina textul "mar par". Multumesc. :jap:Roger= A1 & B1

& - ca sa le trateze ca stringuri. o să-ţi iasă mărpăr, poţi insera un spaţiu: =A1 & " " & B1 ca să-ţi iasă "măr păr".peraMultumesc mult. :jap:Ma gindisem ca pot folosi exemplul dat de liviutza cu concatenarea, dar nu stiam cum sa pun pauza intre cele doua cuvinte. :DpsystemSalutare. Ca sa nu mai deschid un alt thread, am sa vin si eu cu o intrebare(problema):Se da un banal tabel pe 2 coloane. Pe ambele coloane se regasesc numere. Se realizeaza un grafic te tip smoth-line avand ca sursa acest tabel(pe axa x o coloana, iar pe y cealalta). Este ceva de genul f(x)=y.Intrebarea vine in felul urmator: cum reusesc sa identific, pentru o valoare a lui x(sau y) corespondentul sau pe cealalta axa(in mod clasic se traseaza o perpendiculara pe grafic iar acolo unde intalneste graficul se trage o alta perpendiculara pe axa rezultand un punct). Asta as dori sa fac insa nu stiu cum, am incercat si cu trand insa acesta nu trece exact peste graficul meu. Cum sa fac?liviutzadin pacate, nu e atat de simplu pe cat pare. In primul rand, acel tip de grafic foloseste doar o serie de valori, sa zicem din coloana B. Valorile din coloana A nu sunt "puse"pe grafic, ci constituie "categorii", asa ca valoarea lor nu are importanta.

Verticala se poate face automat. In "format data series/options" se bifeaza "drop lines". ai putea obtine ceva de genul pozei pe care am incercat sa o atasez.

Cu orizontalele nu am reusit sa dau de o solutie. Cred ca nu se poate rezolva decat prin programare (si inca destul de multa) sau manual. Oricum, pe un grafic cu mai multe valori diferite ar ajunge sa arate cam rau, pentru ca orizontalele s-ar intersecta.psystem

Page 149: tutoriale vba

Verticala se poate face automat. In "format data series/options" se bifeaza "drop lines". ai putea obtine ceva de genul pozei pe care am incercat sa o atasez.

Cu orizontalele nu am reusit sa dau de o solutie. Cred ca nu se poate rezolva decat prin programare (si inca destul de multa) sau manual. Oricum, pe un grafic cu mai multe valori diferite ar ajunge sa arate cam rau, pentru ca orizontalele s-ar intersecta.Asta am incercat si eu insa nu este relevant. Dupa cum ai spus si tu, imi trebuie si orizontalele. Eu ma gandeam ca poate ar fi o functie sau ceva de genu' insa nu am gasit nimic.

In concluzie, nu prea ar exista vre-o solutie buit-in, nu?liviutzaar exista o solutie extrem de complicata, dar realizabila - 3 grafice puse unul peste altul - graficul tau si 2 cu bars - unul orizontal si unul vertical. calcculand ca lumea unde trebuie sa fie suprapuse cele 3, se poate face. si se poate utiliza oricand dupa aceea, deci nu e nevoie sa refaci operatiunea complexa de fiecare data.psystemAha, dupa cum ai spus si tu, destul de complicat insa cine stie, poate chair o sa mearga. Insa cum faci sa suprapui cele 3 grafice si sa se mai si vada ceva sub ele?liviutzaPot sa le dai area = none, adica transparente. In felul asta, daca le pui unul peste altul se vad doar barele, liniile, etc.

Am incercat, si nu prea iese.. tot barele orizontale sunt problema.psystemAm inteles! Se pare ca o sa raman la solutia clasica cu rigla si creionul. :D Asta e! Multumesc oricum pentru promptitudine si pentru raspunsuri.lache1ALTA PROBLEMA EXCEL SAU ACCESS:

documentul excel contine sheeturi structurate ca denumire dupa literele alfabetului: sheet "a","b","c", etc in ele sunt date referitoare la firme a caror denumire incepe cu literele a, b, c, etc capul de tabel de pe fiecare sheet e acelasi: FIRMA, SOLD INITIAL, FACTURA , DATA ,SUMA, SCADENTA, ETC

se vrea un query in access dupa data scadentei(<=) ai inteles pana acum?

am reusit sa fac link la fiecare sheet in access dar trebuie sa fac query dupa multiple tabele. partea proasta este ca nu stiu cum sa fac asta avand tabele cu aceeasi aceeasi structura a datelor union query rezolva asta? daca da cum?

dupa query trebuie ca tabelul de raspuns sa aiba un singur cap de tabel (cel de mai sus) si toate firmele cu datele lor una sub alta.

ar mai ajuta daca as putea sa fac "merge" la toate sheeturile in unul singur(eventual daca se poate updata singur ar fi super )

Page 150: tutoriale vba

HELPlache1hai ca m-am prins oarecumam facut un test cu 2 sheeturi la care am facut link in access si apoi query la ele astfel:

SELECT *FROM a, bWHERE (((a.SCADENTA)<=[data scadentei]) And ((b.SCADENTA)<=[data scadentei]));

problema este ca mi-a multiplicat datele de cel putin 4 ori unele, altele dee mai multe ori.

ce am gresit?liviutzama tem ca nu pot sa te ajut cu partea de access, dar in excel lucrurile ar fi fost simplissime in felul urmator:

varianta 1:a - concatenarea sheet-urilor intr-unul singurb - pe rezultat, aplicat un advanced filter / unique items

varianta 2a - aplicat advanced filter / unique items in fiecare sheetb - concatenat rezultatele

cred ca 2-ul e mai rapid, sau macar mai antrenant :jap:lache1si cum concatenezi concret?vreau exemplu de comandaliviutzanu exista o "comanda". e nevoie de putin VBA. sau le lipesti de mana (copy / paste de 25 de ori intr-un sheet nou), daca trebuie facut o singura data. dupa care concatenarea e ca in discutia de mai sus...rissariaSal all,am o problema: am o coloana cu o gramada de linii, propozitiile din linii sunt in engleza si trebuie sa le traduc. Vreau sa fac o functie ce sa-mi gaseasca propozitiile unice si sa mi le puna intr-o multime, sa traduc cuvintele si sa fac un if si sa pun traducerea ptr fiecarea in linia corespunzatoare.Ma poate ajuta cineva?Preturi Memorii vBulletin v3.0.0 Gamma, Copyright ©2000-2013, Jelsoft Enterprises Ltd.

Stefan Arhipdespre computere

Home

Page 151: tutoriale vba

Despre

Curriculum

Evolutie

Intrebari

Linux

Index

Home > IT, Scripting > Crearea unui script in VBScript

Crearea unui script in VBScript

2010/03/18 stedanarh Leave a comment Go to comments

În articolul de ieri, am prezentat cum se poate realiza un script în Batch. Automatizarea poate fi realizată şi prin scrierea de scripturi în VBScript. Pentru aceasta, vom folosi Notepad++ selectând din meniul Language opţiunea V – VB:

Page 152: tutoriale vba

Cel mai simplu program constă în afişarea unui mesaj prin comanda msgBox, urmat de textul ce se doreşte a se afişa:

Page 153: tutoriale vba

Vom salva fişierul cu un nume sugestiv şi cu extensia VBS:

Page 154: tutoriale vba

În momentul lansării acestui script (prin dublu click pe fişierul salvat) vom vedea mesajul pe care am dorit a fi afişat:

Pentru a se introduce de către utilizator a unei valori, se foloseşte comanda inputBox, urmată (în cea mai simplă formă de utilizare) de un text încadrat de ghilimele şi paranteze. Pentru

Page 155: tutoriale vba

reafişarea valorii introduse, vom folosi variabila n pe care o vom utiliza în comanda msgBox.

Page 156: tutoriale vba

Scriptul în desfăşurare, în momentul introducerii datelor:

Page 157: tutoriale vba

Scriptul în desfăşurare, în momentul afişării datelor:

Prezint un alt treilea script simplu, care cuprinde o buclă decizională. Se cere a se introduce o opţiune (1 sau 2). Dacă se alege 1 sau 2, se va afişa mesajul Ai ales ’1′, sau Ai ales ’2′. Se poate vedea cum se foloseşte procedura

if condiţie then opţiune1else opţiune2end if

Page 158: tutoriale vba

Funcţia vbcrlf se foloseşte pentru a se scrie pe mai multe rânduri un text. Se foloseşte înaintea unui rând nou.

Page 159: tutoriale vba

Scriptul lansat, la momentul introducerii datelor:

Page 160: tutoriale vba

Scriptul lansat, la momentul afişării datelor:

Prezint un alt script uşor de înţeles, care realizează suma numerelor naturale cuprinse într-un interval (101 .. 102).

Se declară variabilele utilizate (i, x, m1, m2).Se iniţializează acestea (m1 = 101, m2 = 200, x = 0).Se efectuează calculele printr-o buclă repetitivă indexată după i (for i = m1 to m2).Se afişează rezultatul prin procedura msgBox, folosindu-se pentru transformarea din număr în

Page 161: tutoriale vba

text a procedurii formatNumber.

Page 162: tutoriale vba

La lansarea scriptului, acesta realizează calculele şi afişează rezultatul, 15050:

Prezint un script pentru lansarea în execuţie a unor programe. Se foloseşte wScript.createObject şi wshShell.run. Am folosit şi procedura decizională multiplă Select

Page 163: tutoriale vba

Case:

Page 164: tutoriale vba

În momentul rulării scriptului, apare o primă fereastra de dialog care întreabă dacă se doreşte lansarea programului Paint. Dacă răspundem pozitiv, aceasta se va deschide.

Page 165: tutoriale vba

Dacă vom răspunde negativ la fereastra de dialog precedentă, se va afişa cea de-a doua fereastră de dialog care întreabă dacă se doreşte a se lansa programul Calculator.

Page 166: tutoriale vba

Dacă răspundem pozitiv, se va lansa în execuţie aplicaţia Calculator instalată:

About these ads

Categories: IT, Scripting Comments (2) Trackbacks (0) Leave a comment Trackback

1.

cosmin

2011/05/14 at 8:52 pm | #1

Reply | Quote

Salut, as avea nevoie de un exemplu simplu de joc in vbs, stiu ca cer cam mult insa nu gasesc niciunde si am timp limitat:(((… trebuie sa predau o tema insa nu stiu cum sa incep, am facut doar exemple simple si cand ma gandesc la un joc, oricat de simplu habar nam cum sa incep….:((((:(((

o

stedanarh

2011/05/16 at 4:06 am | #2

Page 167: tutoriale vba

Reply | Quote

Am incercat ceva aici: http://stedanarh.wordpress.com/2011/05/16

Leave a Reply

Cum se dezinstaleaza corect un program   (UnLocker) Crearea unui script in   Batch RSS feed

Email Subscription

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 28 other followers

Blog Stats

441,110 hits

Search for: Partea inferioară a machetei

March 2010M T W T F S S« Feb   Apr »1 2 3 4 5 6 78 9 10 11 12 13 1415 16 17 18 19 20 2122 23 24 25 26 27 2829 30 31  

Page 168: tutoriale vba

Categories

IT (353) o Dezinstalare (3)

o Instalare (59)

o Linux (135)

o Prezentare (14)

o Programe (41)

o Scripting (35)

o Trucuri (36)

o Utilizare (24)

Archives

January 2013  (2) July 2012  (2)

June 2012  (1)

May 2012  (3)

April 2012  (1)

March 2012  (1)

November 2011  (2)

October 2011  (6)

September 2011  (1)

August 2011  (2)

July 2011  (1)

June 2011  (1)

May 2011  (1)

January 2011  (1)

December 2010  (23)

November 2010  (19)

October 2010  (31)

September 2010  (30)

August 2010  (30)

July 2010  (30)

June 2010  (29)

Page 169: tutoriale vba

May 2010  (30)

April 2010  (29)

March 2010  (30)

February 2010  (28)

January 2010  (19)

Recent Posts

Generarea listei cu aplicatiile instalate printr-un VBScript ce foloseste   WMI Aflarea sistemului de operare al unui computer din retea prin VBScript si   WMI

Instalarea Telnet in Windows   7

Double Commander – manager de fisiere open-source, cross-platform,   64bit

jEdit – editor texte open-source, cross-platform,   64bit

Zapping TV fara   sunet

Activarea hibernarii in Windows 7 din linia de   comanda

Crearea unui stick USB bootabil cu mai multe sisteme de   operare

Star Wars in Command   Prompt

Martisor   electronic

Mesaj cu timer in   VBScript

Verificarea valabilitatii   ITP-ului

Identificarea tipului unei variabile in   VBScript

Detectarea denumirilor proprietatilor extinse ale   fisierelor

Detectarea proprietatilor extinse ale   fisierelor

Recent Comments

corina chirita on Program de mecanizare (managem…

Daniel on Program de mecanizare (managem…

säkerhetsdörrar stoc… on Instalarea FreeCommander   …

proiectewebdesign on Instalarea FreeCommander   …

florin on Program de mecanizare (managem…

Page 170: tutoriale vba

Top Clicks

stedanarh.files.wordpress… stedanarh.files.wordpress…

stedanarh.files.wordpress…

izarc.org

db.tt/81CaEln3

Meta

Register Log in

Entries RSS

Comments RSS

Blog at WordPress.com .

Top WordPress Blog at WordPress.com. The INove Theme. Follow

Follow “Stefan Arhip”

Get every new post delivered to your Inbox.

Join 28 other followers

Powered by WordPress.com

Inserarea macrocomenzilor (Create) cu Visual Basic Editor în Office Word 2003

by gmp

Meniu:Tools -> Macro -> MacrosTools -> Macro -> Visual Basic Editor

Combinaţie de taste:Alt+F8Alt+F11

Crearea, editarea, executarea şi depanarea codului VBA (Visual Basic for Applications) în aplicaţiile Microsoft Office se fac cu programul Microsoft Visual Basic Editor.

Page 171: tutoriale vba

Deşi nu se restrâng ca domeniu de utilizare la aplicaţiile Office (Word, Excel, Powerpoint, Access, Outlook), proiectele VBA pot fi executate doar din cadrul unor astfel de aplicaţii, ceea ce poate constitui un dezavantaj. Numeroasele componente disponibile permit însă crearea unor aplicaţii complexe, mediul de dezvoltare fiind asemănător pachetului Microsoft Visual Studio (Visual Basic, Visual C).

Interfaţa editorului este complexă, pe lângă componentele grafice uzuale (meniuri, bare de butoane) existând câteva ferestre asociate unor activităţi specifice:

View Code (vizualizare şi editare cod; tasta F7) View Object (vizualizare obiect; combinaţia de taste Shift+F7)

Object Browser (tasta F2)

Immediate Window (executarea imediată a unei linii de cod; combinaţia de taste Ctrl+G)

Locals Window (vizualizarea variabilelor locale şi a valorilor acestora)

Watch Window (afişează valorile unor expresii specificate, fiind utilă în depanarea programelor)

Project Explorer (combinaţia de taste Ctrl+R)

Properties Window (vizualizarea proprietăţilor unui obiect; tasta F4)

Un proiect (Project) poate conţine:

proceduri: acestea pot fi generale (neasociate vreunui obiect sau eveniment) sau de eveniment (se execută automat când are loc un anumit eveniment);

formulare: permit crearea unor formulare complexe cu casete, butoane şi alte elemente cărora li se pot asocia diverse acţiuni la diverse evenimente;

module;

clase.

No Comments - Leave a comment

 

Bine aţi venit pe pagina Colegiului Tehnic Craiova!

 

Page 172: tutoriale vba

Lecţia 7

Folosirea controalelor şi a codului respectiv

Până acum totul ar trebui să fie limpede. Nu este greu, deoarece am vorbit mai mult despre ce se poate face, cum se poate, de ce se poate face... . Ei... acum e timpul sa lucrăm mai mult. Până şi titlul lecţiei ne dă impresia unei probleme mai dificile. Dar dacă până acum totul este clar, atunci aşa va fi şi în continuare. Deci să începem...

Am aflat ce sunt controalele, am aflat unde sunt ele, ştim de unde le putem modifica proprietăţile, acum iată cum le folosim într-un program.

Pentru a vedea cel mai bine cum se folosesc şi cum arată ele într-o aplicaţie, deschideţi proiectul controls.vbp (extensia VBP vine de la Visual Basic Project). După ce aţi încărcat programul, porniţi-l (F5), vedeţi ce face, după care opriţi-l din butoanele proprii.

 

Aplicaţia "Folosirea controalelor si a codului respectiv"

 

Această aplicaţie are rolul de a vă învăţa cum se folosesc controalele principale şi cum se introduce codul sursă (adică programul de fapt care se foloseste de obiecte).

În Visual Basic, în fereastra Project alegeţi "frmMain (main.frm)". O să vedeţi că imediat se modifică şi conţinutul ferestrei Properties, care acum va lua numele de "Properties – frmMain". Dar de fapt, cine este "frmMain" ? Păi, dacă aţi citit cu atenţie în lecţia anterioară şi aţi aflat că fiecare control are şi un prefix, pe lângă nume, înseamnă ca ştiţi că este vorba despre Forma principală. Deci, în fereastra Properties, puteţi modifica proprietăţile Formei, cum ar fi: textul care apare în Bara Titlu a aplicaţiei (această variabilă poartă numele de caption); ce butoane de control să apară în dreapta (minimize, maximize, etc); ce iconiţă să apară în stânga în Bara Titlu, etc...

Page 173: tutoriale vba

După cum v-aţi şi imaginat, exact acelaşi lucru puteţi face şi la celelalte obiecte plasate pe forma principală. Apăsaţi cu click-stânga pe butonul "Buton de comanda" şi veţi vedea cum se schimbă conţinutul ferestrei Properties.

Folosiţi-vă imaginaţia pentru a vă gândi la câte "aspecte" îi puteţi da Formelor din programul dumneavoastră. Acest lucru se poate realiza prin modificarea proprietăţilor obiectelor Formei şi a celor din Formă. Puteţti realiza o formă după placul dumneavoastră: cu mouse-ul puteţi mări Forma (trageţi de colturi), îi puteţi schimba culoarea de fundal, etc... Dar gata cu "design"-ul, e timpul pentru codul din program!

Comanda SHOW; HIDE

 

Foarte bine. Acum ştiţi că Proiectul pe care îl aveţi "deschis" în Visual Basic este compus din 7 Forme. V-aţi întrebat cum se deschide o formă doar de la apăsarea unui buton ? De fapt, trebuie să vă întrebaţi care sunt comenzile care fac această "deschidere". Păi, să vedem! Să luăm, spre exemplu butonul "Buton de comanda" care face deschiderea spre fereastra cu acelaşi nume. În program, fereastra care se deschide poartă numele de frmButton. Pentru a edita codul din interiorul butonului acesta daţi un dublu-click pe butonul acesta. Vi s-a deschis fereastra "Controls – frmMain (Code)". În primele rânduri din această fereastră vedeţi scris următorul cod:

 

Private Sub cmdButtons_Click()

frmButton.Show

End Sub

 

Prima şi ultima linie de mai sus, sunt "comenzi" de subrutină, care nu trebuie sa vă preocupe prea mult. Practic ele vă ajută să ştiţi de unde până unde puteţi "manevra" prin intermediul comenzilor un obiect.

Linia din mijloc este comanda care deschide fereastra frmButton. De ce are această linie un "nume" aşa ciudat ? De ce mai are şi un punct în el ? Păi, nu este de loc ciudat, ci doar trebuie să întelegeţi cum funcţionează. "frmButton" înseamnă că ceea ce va urma după punct sunt comenzi adresate obiectului cu acest nume. "." După punct urmează comanda adresată obiectului respectiv.

Page 174: tutoriale vba

"Show" înseamnă în engleză "apari". Deci, simplu... mai pe româneşte "Forma cu numele frmButton apari!". Si cu asta basta. Dacă, de exemplu am vrea să facem un buton pe care dacă apăsăm, să facem să dispară o fereastră care este deja pe ecran, am scrie următorul cod: [numele formei].Hide (hide – de la ascunde)

 

Comanda END

 

Dacă vedeţi codul butonului "Exit" veţi vedea scris:

End

Aceasta este comanda care face, ca în orice moment programul să se închidă.

 

Comanda (Ciclul) IF-THEN ; ELSE-END IF

 

Daca sunteţi familiarizat cu mediul de lucru BASIC, veţi întelege foarte repede modul de "funcţionare" al acestei comenzi. În programul demonstrativ, observaţi cum funcţionează "Caseta de control". Acum, vedeţi cum funcţionează codul programului. Pentru aceasta vedeţi codul înscris în frmCheck (pentru a vedea codul pentru o formă întreagă, dublu-click-stânga pe Form).

Pentru cei care nu stiu, comanda IF-THEN este de fapt un analizator de posibile valori ale unei variabile, de exemplu. În limbaj normal, s-ar traduce şi exemplifica astfel:

 

Dacă Butonul1 este apăsat Atunci ieşi din programDacă Butonul1 este altfel decât apăsat Atunci fă beep

Sau mai simplu de scris:

Dacă Butonul1 = apăsat Atunci

Ieşi

Page 175: tutoriale vba

Sau (altceva) 'in caz de altceva

Fa Beep

Încheie Dacă

 

(important de reţinut în acest proces este ordinea în care sunt introduse posibilităţile)

Cum s-ar traduce cuvintele îngrosate de mai susă Păi, Dacă si Atunci sunt If si respectiv Then iar Sau si Încheie Dacă le-ati ghicit! Sunt Else si End If. De înţeles, cu siguranţă aţi înţeles la ce ajută. Daca nu, nu vă faceţi probleme, veţi înţelege şi mai bine din codul concret din programul demonstrativ:

If chkBold.Value = 1 Then

txtDisplay.FontBold = True

Else

txtDisplay.FontBold = False

End If

 

Vă lăsăm pe dumneavoastră să înţelegeti mai bine cum funcţionează acest ciclu în programul demonstrativ.

 

Comanda (Instructiunea) REM sau '

În fapt, aceasta nu este chiar o comandă, sau o insţructiune, ci este o simplă remarcă. De la cuvântul remarcă, porneşte şi abreviaţia REM după care urmează un comentariu în program.

 

Form1.Hide' Deschide Forma1sau Rem Deschide Forma1

 

Page 176: tutoriale vba

 

 

 

Variabile, setări de valori si proprietăti în cod

 

Cu toţii ştim ce sunt variabilele şi ştim că toate obiectele din programele realizate cu Visual Basic au anumite proprietăţi, sau anumite valori pentru variabilele lor. Ştim că acestea se pot schimba foarte uşor din fereastra Properties în momentul creării programului. Dar cum se modifică aceste proprietăţi în timpul rulării unui program ? Simplu:

se scrie numele integral al obiectului + [.] + variabila + [=] + valoare

 

exemplu:

shpCard.Left = -500

Deci, obiectul cu numele shpCard va trebui să îşi modifice proprietatea Left din cea actuală în -500. Un alt exemplu este modificarea unei etichete:

lblDisplay.Caption = "Aceasta este ce va apare aici"

Cât despre variabilele proprii pe care vreţi să vi le definiţi aici modul de lucru este şi mai usor. Scrieţi numele variabilei pe care vreti să o creaţi + [=] + valoarea sa. Ca să nu vă încurcaţi, puteţi folosi şi comanda LET înainte de şir. Exemplu:

LET elevi = 40

Sau elevi = 40

 

Variabile predefinite:

 

Page 177: tutoriale vba

După cum aţi văzut mai sus variabilele sunt în mare parte definite de dumneavoastră. Adică simplu, unui cuvânt cheie îi atribuiti un număr, un sir de caractere, etc... Ei bine, mai există şi Variabile predefinite. Acestea au tot un nume cheie şi tot o valoare. Dar care nu este atribuită de dumneavoastră. Astfel de variabile sunt: variabila timp (TIME, care "ştie" ora, DATE, cu data, locaţia mouse-ului, etc...). Despre aceste valori puteţi afla mai multe folosindu-vă de help-ul din Visual Basic.

 

 DAO (Data Access Objects) (I)Lucrul cu obiectele DAO Proiectarea bazelor de date în Microsoft Access Stabilire unei referinţe la biblioteca de obiecte DAO Referirea obiectelor DAO în Visual Basic Adăugarea de noi obiecte DAO la o colecţie Lucrul cu date externe Utilizare DAO cu surse de date ODBCUtilizare Dao cu Microsoft Jet Obiectul DBEngine Colecţia Workspaces Metoda CreateWorkspace Colecţia Errors Colecţia Databases Colecţia TableDefs Colecţia Fields Colecţia Indexes Colecţia QueryDefs Colecţia Parameters (obiectul QueryDef) Colecţia Relations (obiectul Database)

Biblioteca de tipuri Microsoft DAO oferă o cale de control a unei baze de date din orice aplicaţie care suportă Visual Basic for Applications. Anumite obiecte DAO reprezintă structura bazei de date iar altele reprezintă datele însăşi. Prin intermediul obiectelor DAO se pot crea şi gestiona baze de date locale sau la distanţă într-o multitudine de formate, se poate lucra cu datele lor.

În acest capitol se explică cum se pot programa obiectele DAO din aplicaţiile Microsoft Office.

Lucrul cu obiectele DAOObiectele DAO se utilizează pentru a lucra în mod programatic cu o bază de date. Principalele acţiuni privesc:

crearea unei baze de date, modificarea structurii tabelelor, interogărilor, indexărilor şi relaţiilor,

regăsirea, adăugarea, ştergerea sau modificarea datelor din bază,

implementarea securităţii datelor,

Page 178: tutoriale vba

lucrul cu date în diferite formate de fişiere şi legarea tabelelor din alte baze de date la baza curentă,

conectarea la baze de date pe servere la distanţă şi construirea de aplicaţii client/server.

Observaţie. Pentru a utiliza obiectele DAO, trebuie ca la instalarea pachetului Microsoft Office să se selecteze şi boxa de control Data Access.

Obiectele DAO sunt organizate într-o structură ierarhică. Obiectul DBEngine este de nivelul cel mai înalt şi conţine toate celelalte obiecte şi colecţii ale ierarhiei DAO. Următorul tabel conţine o descriere sumară a obiectelor.

Obiect Descriere

Connection Conectarea prin reţea la o bază de date Open Database Connectivity (ODBC).

Container Informaţii de securitate pentru diferite tipuri de obiecte ale bazei de date.

Database Baza de date deschisă.

DBEngine Obiectul cel mai de sus al ierarhiei.

Document Informaţia de securitate pentru obiecte individuale din baza de date.

Error Informaţii de eroare privind accesul la date.

Field Câmp în obiecte TableDef, QueryDef, Recordset, Index, Relation.

Group Contul grupului în baza curentă.

Index Indexul tabelei.

Parameter Parametru de interogare.

Property Proprietate a unui obiect.

QueryDef Definiţia unei interogări salvate în baza de date.

Recordset Mulţime de înregistrări definite de o tabelă sau de o interogare.

Relation Legătura (relaţia) dintre două câmpuri de tabel sau interogări.

TableDef Definiţia unei tabele salvate în baza de date

User Contul utilizatorului în grupul de lucru curent.

Workspace Sesiunea DAO activă.

Page 179: tutoriale vba

 

Proiectarea bazelor de date în Microsoft Access

Deşi se pot crea baze de date prin VB cu DAO, uneori, pentru baze de date cu oarecare grad de permanenţă, se poate alege varianta de

a proiecta baza de date în mediul Access destinat pentru asemenea operaţiuni şi deschiderea bazei cu DAO din altă aplicaţie care suportă Visual Basic.

La crearea unei baze de date în Access, următoarele lucruri sunt de reţinut.

o Când se deschide un fişier .mdb creat în Access din altă aplicaţie, nu se poate lucra cu forme, rapoarte, macro-uri sau module Access. Formele şi rapoartele trebuiesc proiectate, deasemenea şi codul VB, în aplicaţia unde se lucrează.

o Dacă se scrie cod pentru procesarea unei baze de date în Access, codul respectiv nu se va executa în mod necesar şi la copierea în modulele altei aplicaţii. Pentru execuţie trebuie, în acest caz, să se elimine/înlocuiască toate entităţile specifice Access-ului (obiecte, metode, proprietăţi sau funcţii).

o În Access se utilizează funcţia CurrentDb pentru a returna o referinţă la baza de date curent deschisă în fereastra Access. Se poate utiliza DAO pentru a lucra cu această bază. Dacă se copie acest cod în altă aplicaţie care are Visual Basic, se va modifica textul sursă încât să se utilizeze metoda OpenDatabase a obiectului Workspace.

o Microsoft Access creează proprietăţi suplimentare ale obiectelor DAO. Atunci când se formează o bază cu DAO în Visual Basic şi această bază este deschisă ulterior în microsoft Access, se pot observa şi alte proprietăţi adăugate obiectelor. Aceste proprietăţi sunt şi ele enumerate în colecţia Properties a obiectului DAO.

Stabilirea unei referinţe la biblioteca de obiecte DAO

Referinţa se poate realiza în mod automat, de exemplu de către Microsoft Access, sau manual prin succesiunea uzuală: Visual Basic Editor – meniul Tools – References – selectare Microsoft DAO 3.5 Object Library. După stabilirea referinţei se pot vedea obiectele DAO în Object Browser selectând DAO în lista Project/Library.

Pentru anumite probleme de compatibilitate, pentru proiectele mai vechi, se poate referi Microsoft DAO 2.5/3.5 compatibility library. Proba completă pentru a vedea dacă este nevoie de referirea bilbiotecii de compatibilitate este compilarea codului sub DAO 3.5. Dacă nu există erori rezultă că nu este necesară biblioteca de compatibilitate.

Referirea obiectelor DAO în Visual Basic

Obiectele DAO pot fi referite în cod în acelaşi mod ca orice alt obiect. Deoarece obiectul DBEngine nu are o colecţie, poate fi referit direct. Celelalte obiecte se vor referi în cadrul colecţiilor unde aparţin şi potrivit locului din ierarhia deobiecte.

Page 180: tutoriale vba

Fiecare obiect poate fi referit într-o colecţie

prin valoarea proprietăţii Name a obiectului respectiv sau prin numărul de ordine din colecţie. Obiectele DAO sunt indexate plecând cu 0.

Exemple:

Databases("Salariati")Databases(0)

Referirea unui obiect Database în cod se realizează şi prin poziţionarea în ierarhie:

Dim dbs As DatabaseSet dbs = DBEngine.Workspaces(0).Databases(0)

prin care se obţine o referinţă la prima bază de date (indicele 0 din colecţia Databases) din prima zona de lucru (indicele 0 din colecţia Workspaces), zona implicită. De notat că dacă se lucrează într-o aplicaţie diferită de Access, atunci trebuie să se deschidă o bază de date cu metoda OpenDatabase mai înainte de a rula codul precedent.

Pentru aplicaţiile diferite de Access, calificarea obiectelor poate produce mai multă claritate, plus certitudinea referii corecte:

Dim dbs As DAO.Database

Adăugarea de noi obiecte DAO la o colecţie

După cum s-a precizat deja, anumite obiecte DAO reprezintă structura bazei de date, celelalte oferind mijloace de lucru cu datele din bază. Obiectele care reprezintă structura bazei sunt salvate o dată cu baza. În general, obiectele utilizate în lucrul cu datele din bază nu sunt salvate ci sunt create de fiecare dată când este nevoie de ele.

Crearea unui nou obiect DAO care trebuie salvat cu baza de date se va completa cu utilizarea metodei Append a colecţiei asociate de obiecte salvate.

Exemplul următor dă o imagine despre acest proces. Exmplul creează un nou obiect TableDef (care reprezintă o nouă tabelă) cu un nou obiect Field (care reprezintă un câmp din noua tabelă). Obiectul Field creat se adaugă la colecţia Fields a noii tabele iar noul obiect TableDef este adăugat la colecţia TableDefs a obiectului Database care reprezintă baza de date deschisă.

Function AddTable () As Boolean    ' declaraţii    Dim dbs As Database, tdf As TableDef, fld As Field    Const conPath As String = "C:\ …\Northwind.mdb"     On Error GoTo Err_AddTable    ' asignarea bazei curente la variabila database    Set dbs = DAO.DBEngine.Workspaces(0).OpenDatabase(conPath)    ' crearea noii tabele    Set tdf = dbs.CreateTableDef("ArchivedInvoices")    Set fld = tdf.CreateField("OrderId", dbLong) 

Page 181: tutoriale vba

    ' adăugarea la colecţiile adecvate, care se salvează    tdf.Fields.Append fld    dbs.TableDefs.Append tdf    dbs.Close    AddTable = True Exit_AddTable:    Exit Function Err_AddTable:    MsgBox "Error " & Err & ": " & Err.Description    AddTable = False    Resume Exit_AddTableEnd Function

Observaţie. În Access se va utiliza CurrentDb pentru a returna o referinţă la baza de date curentă deschisă.

Lucrul cu date externe

Se poate utiliza DAO pentru lucrul cu diferite formate de baze de date. Există trei mari categorii de formate de baze de date accesibile prin DAO.

Prima categorie este caracterizată de formatul Microsoft Jet. Se poate utiliza DAO cu toate bazele de date create cu Microsoft Jet, incluzând cele create în Microsoft Access, Microsoft Visual Basic, Microsoft Visual C++ şi Microsoft Excel.

A doua categorie este caracterizată de formatul ISAM instalabil. Un driver ISAM care se poate instala este un driver care oferă acces la formate de baze de date externe prin DAO şi Microsoft Jet. La instalarea aplicaţiei se poate cere instalarea oricărui driver pentru formatele:

Microsoft FoxPro dBase

Paradox

Microsoft Excel

Microsoft Exchange/Outlook

Lotus 1-2-3

Date tabelare în fişiere HTML

etc.

A treia categorie de formate de baze de date accesibile prin DAO este sursa de date Open Database Connectivity (ODBC). Sursele de date ODBC, cum ar fi Microsoft SQL Server 4.2 şi mai mari, necesită un driver ODBC. Adesea o sursă de baze ODBC este pe un server de reţea, adică ODBC este util pentru dezvoltarea aplicaţiilor client/server. Următoarea secţiune tratează subiectul mai pe larg.

Utilizare DAO cu surse de date ODBC

Page 182: tutoriale vba

Există două moduri diferite de utilizare DAO cu ODBC: – prin Microsoft Jet, sau – prin noua tehnologie numită ODBCDirect.

Dacă se lucrează cu o baza de date creată cu Microsoft Jet database engine sau într-un format extern suportat de un driver instalabil ISAM, toate operaţiunile DAO sunt procesate prin Microsoft Jet.

Dacă se lucrează cu o sursă de date ODBC, operaţiunile DAO se pot procesa fie prin Microsoft Jet, fie prin ODBCDirect care ocoleşte motorul Microsoft Jet şi lucrează direct cu datele în sursa ODBC. Alegerea este în funcţie de tipul de operaţiuni efectuate.

Se poate utiliza DAO cu Microsoft Jet, pentru surse ODC, atunci când sunt necesare avantajele Jet: abilitatea de a crea sau modifica obiecte, unirea datelor din mai multe formate de baze de date.

Se poate utiliza ODBCDirect atunci când se execută interogări sau proceduri memorate pe un server back_end cum ar fi Microsoft SQL Server, sau când aplicaţia client unde se lucrează necesită capacităţile specifice ODBC cum ar fi actualizări în loturi sau interogări asincrone. ODBC poate efectua anumite operaţiuni client/server mult mai repede.

Deoarece nu toate posibilităţile DAO sunt accesibile cu ODBCDirect, Microsoft DAO mai suportă încă ODBC prin Microsoft Jet. Se poate astfel utiliza ODBC prin Microsoft Jet, prin ODBCDirect, sau prin ambele cu o singură sursă de date ODBC.

Metoda care este utilizată în accesarea unei surse ODBC este determinată de tipul spaţiului de lucru în care se lucrează. Un spaţiu de lucru, reprezentat printr-un obiect Workspace, este o sesiune deschisă pentru un cont utilizator particular. O sesiune marchează o succesiune de operaţii efectuate de motorul de baze de date, începe cu intrarea (log on) utilizatorului şi se termină la ieşirea utilizatorului (log off). Operaţiunile pe care un utilizator le poate executa în timpul unei sesiuni sunt determinate de drepturile conferite acelui utilizator. Dacă nu se specifică tipul spaţiului de lucru, DAO creează un spaţiu în mod implicit.

Cu DAO 3.5 se poate crea oricare dintre cele două spaţii de lucru pentru operaţii ODBC. În spaţiul Microsoft Jet se utilizează accesul prin Jet, în spaţiul ODBCDirect se va utiliza cealaltă posibilitate. Fiecare spaţiu de lucru are propriul model de obiecte şi vor fi prezentate în continuarea capitolului.

Utilizare DAO cu Microsoft JetSpaţiile de lucru Microsoft Jet includ obiecte pentru definirea structurii bazei de date, cum ar fi TableDef, QueryDef, Field, Index, Parameter şi Relation. Alte obiecte, cum ar fi Recordset, sunt utile pentru procesarea datelor din bază. O a treia categorie de obiecte, cum ar fi User, Group, Container şi Document, servesc pentru asigurarea securităţii datelor.

Pentru a vedea întreaga ierarhie de obiecte pentru spaţiul de lucru Microsoft Jet se va selecta Help (Microsoft Access Programming and Language References) – Microsoft Data Access Objects (DAO) – "Data Access Object Model for Microsoft Jet Workspaces".

Page 183: tutoriale vba

In schema următoare este prezentată doar partea superioară a ierarhiei. La prezentarea fiecărui obiect se vor aduce unele explicaţii suplimentare.

Se observă că obiectul de nivel cel mai înalt, DBEngine, nu aparţine unei colecţii, deci poate fi referit direct. Toate celelalte obiecte sunt referite prin colecţia la care aparţin. Săgeţile fără obiect terminal punctează către structuri nereprezentate în figură. 

Obiectul DBEngine

Obiectul DBEngine, de nivel maxim în ierarhia de obiecte DAO, este obiectul implicit al modelului, astfel încât menţionarea lui explicită poate fi omisă în multe situaţii.

Pe nivelul imediat inferior al ierarhiei se găsesc două colecţii: Workspaces – spaţiile de lucru, Errors – erorile apărute în timpul unei operaţiuni DAO. Colecţia Workspaces este implicită şi referinţa la ea poate fi omisă.

O referinţă la primul obiect Workspace din colecţia Workspaces poate fi obţinută prin una din instrucţiunile

Set wrk = DBEngine.Workspaces (0)Set wrk = DBEngine (0)Set wrk = Workspaces (0)

în care se observă prezenţa opţională a obiectelor implicite.

Proprietăţile obiectului DBEngine sunt prezentate în tabelul următor.

Proprietatea Descriere

DefaultType Long, determină tipul spaţiului de lucru:

dbUseJet –Microsoft Jet database engine

dbUseODBC – ODBC data source

DefaultUser,

DefaultPassword

Şiruri, numele utilizatorului şi parola

IniPath Şir, informaţia despre cheia din Windows Registry care conţine valorile pentru Microsoft Jet database engine (numai spaţiile de lucru Microsoft Jet).

LoginTimeout Întreg, timpul cât se aşteaptă intrarea unu utilizator.

SystemDB Şir, calea pentru localizarea curentă a fişierului cu informaţia despre grupurile de lucru, workgroup (doar spaţii Microsoft Jet).

Version Şir, informaţii despre versiunea DAO.

Page 184: tutoriale vba

Dacă nu se creează un obiect Workspace specific, un asemenea obiect este creat în mod automat de DAO atunci când este necesar. Atributele implicite ale acestui spaţiul sunt DefaultUser egal cu Admin iar DefaultPassword egal cu şirul vid "".

În mod implicit, proprietatea DefaultType are valoarea dbUseJet şi spaţiul de lucru este Microsoft Jet. Proprietatea poate fi acoperită pentru un spaţiu particular prin tipul precizat la crearea acestuia.

Metodele obiectului DBEngine sunt

Metoda Descriere

BeginTrans,CommitTrans,Rollback

Metodele care controlează efectuarea tranzacţiilor.

CompactDatabase,RepairDatabase

Compactarea bazei de date, refacerea unei baze deteriorate.

CreateDatabase,CreateWorkspace

Crearea unei baze de date sau a unui spaţiu de lucru.

Idle Suspendă procesarea datelor din bază

OpenConnection,OpenDatabase

Deschide şi returnează o referinţă la un obiect Connection, respectiv Database.

RegisterDatabase Completează în Windows Registry informaţia ODBC.

SetOption Înlocuieşte temporar valorile din Windows Registry pentru spaţiile Microsoft Jet

Unele metode sunt prezentate în continuare. Pentru mai multe informaţii despre funcţiuni şi parametri se vor vedea intrările respective din DAO Help.

Colecţia Workspaces

Obiectul DAO Workspace defineşte o sesiune pentru un utilizator, bazată pe permisiunile (drepturile) utilizatorului. Se utilizează obiectul Workspace pentru a gestiona sesiunea curentă. Workspace conţine bazele de date deschise şi oferă mecanismul necesar tranzacţiilor şi securităţii aplicaţiei. Colecţia Workspaces conţine toate obiectele active Workspace din DBEngine, care au fost adăugate colecţiei.

La începutul lucrului cu obiecte DAO din Visual Basic, DAO creează în mod automat un spaţiu implicit. Referirea la acesta se realizează prin

Dim wrk As WorkspaceSet wrk = Workspaces (0)

adică se referă primul obiect din colecţie.

Page 185: tutoriale vba

Spaţiile de lucru DAO pot fi partajate sau ascunse. Un spaţiu este ascuns până când utilizatorul îl marchează drept partajat prin adăugarea obiectului Workspace la colecţia Workspaces. După adăugare, spaţiul este accesat prin intermediul colecţiei. Un obiect Workspace necesar doar pentru o procedură particulară se poate crea dar fără adăugarea la colecţia Workspaces.

După cum s-a mai spus, există două tipuri de obiecte Workspace: Microsoft Jet şi ODBCDirect. În Microsoft Jet se poate utiliza DAO cu motorul de baze de date Microsoft Jet pentru a accesa date din baze de date Microsoft Jet, surse de date ISAM instalabile şi surse de date ODBC. Într-un spaţiu ODBCDirect, se poate utiliza DAO pentru a accesa date din surse ODBC fără a trece prin motorul Jet. Într-o aceeaşi aplicaţie se poate lucra cu ambele tipuri de spaţii de lucru.

Crearea unui spaţiu Microsoft Jet

Se utilizează metoda CreateWorkspace a obiectului DBEngine. Exemplul următor utilizează constanta de tip dbUseJet. Dacă proprietatea DefaultType este fixată pe dbUseJet, atunci argumentul de tip nu este necesar şi se creează în mod automat un spaţiu Microsoft Jet.

Dim wrk As WorkspaceSet wrk = CreateWorkspace("JetWorkSpace", "Admin", "", dbUseJet)

noul spaţiu fiind pentru utilizatorul Admin şi fără parolă.

Noul spaţiu de lucru nu este adăugat în mod automat la colecţia Workspaces, pentru aceasta se va utiliza metoda Append a colecţiei. Acest lucru este necesar atunci când spaţiul nou definit este utilizat şi în afara procedurii unde a fost creat.

Metoda CreateWorkspace (obiectul DBEngine)

Sintaxa

Set workspace = CreateWorkspace(name, user, password, type)

unde

workspace este o variabilă obiect care reprezintă obiectul Workspace care se creează.

name este şirul care conţine numele unic al obiectului. Începe cu o literă, are lungimea maximă 20.

user identifică proprietarul noului obiect Workspace.

password conţine parola pentru noul obiect Workspace, un şir până la 14 caractere cu excepţia lui null.

type este opţional şi stabileşte tipul spaţiului (dbUseJet, dbUseODBC)

După utilizarea metodei este creat obiectul Workspace, începe o nouă sesiune şi obiectul poate fi referit în cod. Obiectele Workspace nu sunt permanente, nu se pot salva iar

Page 186: tutoriale vba

proprietatea Name nu mai poate fi modificată după trecerea obiectului în colecţia Workspaces.

Dacă tipul este stabilit la dbUseODBC şi nu există deja create spaţii Jet, atunci motorul Jet nu este încărcat în memorie şi toată activitatea se efectuează cu sursa de date ODBC identificată în obiectul Connection.

Pentru a elimina un obiect Workspace din colecţia Workspaces, se închid toate bazele de date şi conexiunile şi apoi se utilizează metoda Close a obiectului Workspace.

Colecţia Errors (obiectul DBEngine)

Un obiect Error conţine informaţia despre o eroare apărută în timpul unei operaţiuni DAO. Apariţia mai multor erori în aceeaşi operaţiune se reflectă în obiecte Error distincte, mulţimea acestora formând colecţie Errors. Atunci când o nouă operaţiune generează o eroare, colecţie Errors este golită şi completată cu noile erori. Operaţiunile DAO care nu generează erori nu au efect asupra colecţiei Errors.

Erorile sunt indexate în colecţie în ordinea crescătoare a nivelelor de eroare. Nivelul cel mai înalt (deci ultimul obiect din colecţie) este eroare raportată de VBA, identică cu eroarea raportată de obiectul VBA Err.

Colecţia Errors are:

proprietatea Count, care dă numărul elementelor din colecţie metoda Refresh, care actualizează colecţia potrivit situaţiei curente.

Obiectul Error nu are decât proprietăţile (nu conţine metode sau colecţii)

Description, şirul care conţine descrierea erorii HelpContext, este un Long cu identificatorul de context din fişierul Help asociat

HelpFile, conţine calea completă către fişierul Help

Number, numărul (Long) al erorii. Pentru o listă completă se va vedea intrarea Trappable Microsoft Jet and DAO Errors din Help.

Source, un şir conţinând numele obiectului sau aplicaţiei care a generat eroarea.

Colecţia Databases

Obiectul Database reprezintă o bază de date deschisă. Această poate fi o bază Jet sau o sursă externă de date. Colecţia Databases conţine toate bazele de date deschise curent.

Situarea în ierarhie este

Obiectul sau colecţia Este conţinut în Conţine

Database (obiect) Colecţia Databases Colecţia Containers

Page 187: tutoriale vba

Colecţia QueryDefs

Colecţia Properties

Colecţia Recordsets

Colecţia Relations

Colecţia TableDefs

Databases (colecţie)

Obiectul Workspace

Obiecte Database

Deschiderea unei baze de date

Metoda OpenDatabase, a obiectului DBEngine sau a obiectului Workspace, deschide o bază de date şi returnează o referinţă la obiectul care o reprezintă. Utilizarea metodei cu obiectul DBEngine deschide baza de date în spaţiul de lucru implicit, ca în exemplul următor 

Function RetrieveRecordset (strDbName As String, strSource As String ) As Boolean    Dim dbs As Database    Dim rst As Recordset     On Error GoTo Err_RetrieveRecordset    Set dbs = OpenDatabase (strDbName)    Set rst = dbs.OpenRecordset(strSource, dbOpenDynaset)    ' se prelucrează înregistrările din recordset    …    RetrieveRecordset = True Exit_RetrieveRecordset:    rst.Close    dbs.Close    Exit Function Err_RetriveRecordset:    MsgBox "Eroare " & Err & ": " & Err.Description    RetrieveRecordset = False    Resume Exit_RetriveRecordsetEnd Function

În Microsoft Access, se utilizează funcţia CurrentDb pentru a returna o referinţă la baza de date curentă. Metoda OpenDatabase se utilizează pentru deschiderea altei baze de date decât cea curent deschisă sau pentru a deschide baze în spaţiul de lucru ODBCDirect.

Dim dbs As DatabaseSet dbs = CurrentDbDebug.Print dbs.Name

Crearea cu DAO a duplicatelor unei baze de date (database replicas)

Page 188: tutoriale vba

Diferite necesităţi de arhivare sau de lucru în reţea impun crearea şi gestionarea unor copii ale unei baze de date. Una dintre copii este desemnată drept Design Master, celelalte copii find denumite duplicate sau replici. Replicile pot fi menţinute pe aceeaşi maşină sau pe maşini diferite.

Adăugarea, modificarea sau ştergerea obiectelor se poate efectua doar în Design Master. Datele pot fi modificate în Design Master şi în orice replică a bazei de date. Atunci când un utilizator modifică date dintr-o bază duplicată, utilizatorii celorlalte replici pot să-şi sincronizeze replicile, astfel încât aceleaşi date să fie în toate copiile.

Se poate utiliza DAO pentru a face o bază replicabilă, pentru a crea replici, le sincroniza şi gestiona mulţimea replicilor. Se pot crea, de asemenea, replici parţiale care conţin doar o submulţime de înregistrări dintr-o replică totală. Utilizarea replicilor parţiale permite sincronizarea unei replici doar cu datele necesare şi nu cu întreaga bază de date.

Pentru ca o bază de date să admită replici trebuie să se fixeze proprietatea Replicable sau proprietatea ReplicableBool a obiectului Database corespunzător. Aceste proprietăţi nu există pentru obiectul Database până când nu sunt create prin metoda CreateProperty şi adăugate la colecţia Properties. După permiterea replicărilor, crearea unei baze duplicat se realizează prin metoda MakeReplica.

Diferenţa dintre proprietăţile Replicable şi ReplicableBool este de valori: prima are o valoare şir, a doua o valoare logică.

Următorul exemplu creează manual o copie a bazei de date, o face replicabilă şi creează o replică a bazei.

Function ReplicateDatabase (strDBName As String) As Boolean    Dim dbs As Database, prp As Property    Dim strBackup As String, strReplica As String    Const conPropNotFound As Integer = 3270    On Error GoTo Err_ReplicateDatabase    If InStr(strDBName, ".mdb") > 0 Then        strBackup = Left(strDBName, Len(strDBName) - 4)    Else        strBackup = strDBName    End If     strReplica =strBackup & "Replica" & ".mdb"    If MsgBox("Make backup copy of file?", vbOKCancel) = vbOK Then        strBackup = strBackup & ".bak"        FileCopy strDBName, strBackup        MsgBox "Copied file to " & "strBackup"    End If     Set dbs = OpenDatabase (strDBName, True)    dbs.Properties("ReplicaBool") = True    dbs.MakeReplica strReplica, "Replica of " & strDBName    MsgBox "Created replica '" & strReplica & "'."    dbs.Close    ReplicateDatabase = True Exit_ReplicateDatabase:    Exit Function 

Page 189: tutoriale vba

Err_ ReplicateDatabase:    If Err = conPropNotFound Then        Set prp = dbs.CreateProperty("ReplicableBool", dbBoolean, True)        dbs.Properties.Append prp        Resume Next    Else        MsgBox "Error " & ": " & Err.Description    End If    ReplicateDatabase = False    Resume Exit_ReplicateDatabaseEnd Function

Colecţia TableDefs

Un obiect TableDef reprezintă definiţia memorată a unei tabele din bază sau a unei tabele legate din spaţiul de lucru Microsoft Jet. Toate obiectele TableDef memorate într-o bază de date formează colecţia TableDefs. Relaţiile din ierarhie sunt

Obiectul sau colecţia Este conţinut în Conţine

TableDef (obiect) Colecţia TableDefs Colecţia Fields

Colecţia Indexes

Colecţia Properties

TableDefs (colecţie)

Obiectul Database Obiecte TableDef

 Crearea prin cod a unei tabele

Metoda de creare este CreateTableDef a obiectului Database. După crearea unui nou obiect TableDef, dar înainte de adăugarea la bază, trebuie să se definească unul sau mai multe câmpuri pentru tabela definită. Sintaxa metodei CreateTableDef este

Set tabledef = database.CreateTableDef (name, attributes, source, connect)

unde

tabledef     este o variabilă obiect reprezentând obiectul TableDef care se creează.

database este o variabilă obiect reprezentând obiectul Database unde se doreşte crearea noului obiect.

name este un şir opţional, care conţine denumirea tabelei.

attributes este o constantă sau o combinaţie de constante indicând caracteristici ale tabelei. Lista este în Help - TableDef object - Attributes Property.

source este un Variant (subtip String), opţional. Conţine numele tabelei în baza de date externă care este sursa datelor. Şirul devine proprietatea SourceTableName a noului obiect.

Page 190: tutoriale vba

connect, un Variant (subtip String), opţional. Conţine informaţia despre sursa unei baze deschise, o bază de date utilizată într-o interogare pass-through, sau o tabelă legată. La proprietatea Connect se pot găsi mai multe informaţii.

Argumentele care se omit la crearea tabelei se vor asigna prin proprietăţi înainte de adăugarea obiectului la colecţie. După aceea nu mai sunt disponibile toate proprietăţile.

Pentru eliminarea unui obiect TableDef se utilizează metoda Delete a colecţiei TableDefs.

Următorul exemplu realizează crearea unei tabele pentru baza de test Northwind. 

Function CreateErrorsTable () As Boolean    Dim dbs As Database, tdf As TableDef, fld As Field, idx As Index    Dim rst As Recordset, intCode As Integer, strErr As String    Const conAppObjErr = "Application-defined or object-defined error"     ' creează tabela Errors cu câmpurile ErrorCode şi ErrorString    Set dbs = CurrentDb     On Error Resume Next    ' ştergerea unei tabele Errors existente    dbs.TableDefs.Delete "Errors"     On Error GoTo Error_CreateErrorsTable    ' crearea tabelei    Set tdf = dbs.CreateTableDef("Errors")    ' creare câmpuri    Set fld = tdf.CreateField("ErrorCode", dbInteger)    tdf.Fields.Append fld    Set fld = tdf.CreateField("ErrorString", dbMemo)    tdf.Fields.Append fld     ' creare index    Set idx = tdf.CreateIndex("ErrorCodeIndex")    Set fld = idx.CreateField("ErrorCode")    With idx        .Primary = True        .Unique = True        .Required = True    End With    idx.Fields.Append fld    tdf.Indexes.Append idx     ' deschidere recordset în tabela Errors    Set rst = dbs.OpenRecordset("Errors")    ' stabilirea indexului pentru recordset    rst.Index = "ErrorCodeIndex")     ' arătarea pointerului clepsidră    DoCmd.Hourglass True     ' ciclarea în codurile de eroare    For intCode = 1 To 32767    On Error Resume Next    strErr = ""    ' tentativa de apariţie a une erori    Err.Raise intCode    ' verificarea dacă eroarea este VBA, DAO sau Access

Page 191: tutoriale vba

    ' dacă eroarea nu este VBA, atunci proprietatea Description a obiectului    'Err conţine textul "Application-defined or object-defined error"    If Err.Description <> conAppObjErr Then        strErr = Err.Description        ' se utilizează metoda AccessError pentru returnarea şirului descriptiv        ' pentru erorile DAO şi Access.    ElseIf AccessError(intCode)<>conAppObjErr Then        strErr = AccessError(intCode)    End If     ' dacă numărul de eroare are un şir descriptiv, se adaugă la tabela definită    If Len(strErr) > 0 Then        'Adăugarea noii înregistrări la recordset        rst.AddNew        ' adăugarea numărului erorii la tabelă        rst!ErrorCode = intCode        ' adăugarea şirului descriptiv        rst!ErrorString.AppendChunk strErr        ' actualizare înregistrare        rst.Update    End If    Next intCode     DoCmd.Hourglass False    ' închidere recordset    rst.Close    MsgBox "Errors table created"    ' arătarea noii tabele în fereastra Database (din Access)    RefreshDatabaseWindow     CreateErrorsTable = True Exit_CreateErrorsTable:    Exit Function Error_CreateErrorsTable:    MsgBox Err & ": " & Err.Description    CreateErrorsTable = False    Resume Exit_CreateErrorsTableEnd Function

Legarea unei tabele la o bază de date

Pentru a utiliza într-o bază de date tabele dintr-o sursă de date externă, aceasta trebuie legată la baza de date. Se pot lega tabele care sunt în altă bază de date Microsoft Jet, sau tabele din alte programe şi formate de fişiere, cum ar fi Microsoft Excel, dBase, Microsoft FoxPro etc. Acest mod este mai eficient decât să se deschidă baza de date externă direct, mai ales dacă tabela vine dintr-o sursă de date ODBC.

Pentru a lega o tabelă la o bază de date, se utilizează metoda CreateTableDef pentru a crea o nouă tabelă. După aceea se specifică valorile pentru proprietăţile Connect şi SourceTableName ale noului obiect creat. Se poate stabili de asemenea proprietatea Attributes. În final se adaugă tabela la colecţia TableDefs.

Page 192: tutoriale vba

Următorul exemplu leagă o foaie de calcul Excel 8.0 ca o tabelă la o bază de date. Înainte de executarea unui astfel de exemplu trebuie să ne convingem că pe sistem este instalat driverul Microsoft Excel ISAM (Msexcl35.dll). Acest driver permite fişierelor Excel 97 să lucreze cu Microsoft Jet database engine. 

Function LinkExcelTable() As Boolean    Dim dbs As DAO.Database, tdf As DAO.TableDef     Const errNoISAM As Integer = 3170    Const conPath As String = _            "C:\Program Files … \Northwind.mdb"        On Error GoTo Err_LinkExcelTable    ' returnează o referinţă la baza de date Northwind    Set dbs = OpenDatabase(conPath)    ' creează un nou obiect TableDef    Set tdf = dbs.CreateTableDef("LinkedTable")    ' specifică domeniul care este tabela sursă    tdf.SourceTableName = "DataRange"    ' specifică şirul de conectare    tdf.Connect = "EXCEL 8.0; DATABASE=C:\My Documents\XLTable.xls"    ' adăugarea noului obiect la colecţie    dbs.TableDefs.Append tdf    LinkExcelTable = True Exit_LinkExcelTable:    Exit Function Err_LinkExcelTable:    If Err = errNoISAM Then        Dim strErr As String        strErr = Err & ": " & Err.Description        strErr = strErr _                & " You may not have the ISAM driver installed properly …"        MsgBox strErr, vbOKOnly, "Error!"    Else        MsgBox "Error " & Err & ": " & Err.Description    End IfEnd Function

Colecţia Fields

În spaţiul de lucru Microsoft Jet, obiectul Field reprezintă un câmp dintr-o tabelă, interogare, index, relaţie sau recordset. Colecţie Fields conţine toate obiectele Field asociate, respectiv, obiectele TableDef, QueryDef, Index, Relation sau Recordset.

Localizarea în ierarhia de obiecte este

Obiectul sau colecţia Este conţinut în Conţine

Field (obiect) Colecţia Fields Colecţia Properties

Fields (colecţie) Obiectul TableDef

Obiectul Index

Obiecte Field

Page 193: tutoriale vba

Obiectul QueryDef

Obiectul Recordset

Obiectul Relation

Colecţia Fields este colecţia implicită a unui obiect TableDef, QueryDef, Index, Relation sau Recordset, ceea ce înseamnă că nu trebuie făcută o referinţă la colecţie în mod explicit. De exemplu, următoarele instrucţiuni returnează o referinţă la câmpul LastName din tabela Employees din baza de date de test Northwind. 

Dim dbs As Database, tdf As TableDef, fld As FieldConst conPath As String = _    "C:\Program Files\ … \Northwind.mdb"Set dbs = OpenDatabase(conPath)Set tdf = dbs.TableDefs("Employees")Set fld = tdf!LastName

În colecţia Fields a unui obiect TableDef, QueryDef, Index sau Relation, obiectul Field este o unitate structurală. El reprezintă o coloană dintr-o tabelă, având un tip particular de date. Dacă se creează o bază de date în Microsoft Access, se pot crea câmpuri pentru toate aceste obiecte şi să se fixeze proprietăţile lor în mediul Access şi nu este necesară utilizarea programării în acest scop.

Într-un obiect Recordset, un obiect Field conţine date şi poate fi utilizat pentru a citi date dintr-o înregistrare sau scrie date într-o înregistrare. În interfaţa utilizator Access nu se poate lucra, totuşi, cu câmpurile obiectului Recordset; trebuie săse facă apel la DAO.

Colecţia Fields a obiectului TableDef conţine toate câmpurile definite. Pentru un obiect QueryDef, colecţia conţine toate câmpurile incluse în interogare din una sau mai multe tabele. Colecţia Fields a obiectului Index include câmpurile pentru care este definit indexul.

Pentru un obiect Relation, colecţia conţine câmpurile implicate în relaţie. Tipic, există două câmpuri în colecţia Fields: unul care este cheia primară, specificat de proprietatea Table a obiectului Relation; al doilea este câmpul extern corespunzător, din tabela specificată de proprietatea ForeignTable a obiectului Relation.

Colecţia Fields a obiectului Recordset conţine câmpurile specificate în argumentul source a metodei OpenRecordset. Argumentul source specifică sursa înregistrărilor pentru noul obiect Recordset şi poate fi un nume de tabelă, nume de interogare sau o instrucţiune SQL care returnează înregistrări.

Proprietatea Value a obiectului Field se aplică doar unui obiect din colecţia Fields a unui obiect Recordset. Proprietatea returnează valoare datei memorate în acel câmp în înregistrarea curentă. Deoarece Value este proprietatea implicită a obiectului Field iar Fields este colecţia implicită a obiectului Recordset, se poate returna valoarea unui câmp fără a specifica explicit fie Fields, fie Value. Exemplul următor este sugestiv în acest sens:

Dim dbs As Database, rst As RecordsetConst conPath As String = _

Page 194: tutoriale vba

    "C:\Program Files\ … \Northwind.mdb"Set dbs = OpenDatabase(conPath)Set rst = dbs.OpenRecordset("Employees")' referinţa explicită la colecţie şi valoareDebug.Print rst.Fields("LastName").Value' referinţă explicită la valoareDebug.Print rst!FirstName.Value' referinţe impliciteDebug.Print rst!Title

Colecţia Indexes

Un obiect Index reprezintă un index dintr-o tabelă a bazei de date, în spaţiul de lucru Microsoft Jet. Colecţia Indexes conţine toate obiectele Index definite pentru o tabelă particulară.

Poziţia în ierarhia de obiecte este următoarea:

Obiectul sau colecţia Este conţinut în Conţine

Index (obiect) Colecţia Indexes Colecţia Fields

Colecţia Properties

Indexes (colecţie) Obiectul TableDef Obiecte Index

Un index măreşte viteza de căutare şi sortare a tabelei. Se poate îmbunătăţi performanţa interogării bazei de date prin indexarea câmpurilor pe ambele părţi ale joncţiunilor, câmpuri care sunt sortate, sau câmpuri care sunt utilizate drept criterii de interogare. Totuşi, indexurile pot să mărească dimensiunea bazei şi să încetinească performanţa când se actualizează câmpuri indexate, când se adaugă sau se elimină date. Performanţa poate fi redusă şi în cazul aplicaţiilor multiuser. Din aceste motive utilizarea indexurilor va fi făcută cu atenţie.

Un index specifică ordinea în care înregistrările sunt accesate din tabelele bazei de date într-un obiect Recordset de tip tabelă.

Pentru a crea un index cu DAO, operaţiune posibilă pentru unul sau mai multe câmpuri, trebuie

o metoda CreateIndex pentru obiectul TableDef.o metoda CreateField pentru obiectul Index cu scopul creerii unui obiect Field

pentru fiecare câmp (coloană) care se include în obiectul Index.

o Stabilirea proprietăţilor obiectului Index.

o Metoda Append pentru fiecare obiect Field care se adaugă la colecţia Fields.

o Metoda Append pentru adăugarea noului obiect Index la colecţia Indexes.

Următorul exemplu este ilustrativ.

Sub SeekRecord ()    Const conPath As String = _            "C:\Program Files\ … \Northwind.mdb"

Page 195: tutoriale vba

    Dim dbs As Database, tdf As TableDef, idx As Index    Dim fld As Field, fldLast As Field, fldFirst As Field    Dim rst As Recordset     ' returnarea unei referinţe la baza de date Northwind    Set dbs = DBEngine().OpenDatabase(conPath)    ' returnarea unei referinţe la tabela Employees    Set tdf = dbs.TableDefs("Employees")    ' crearea unui index nou pe câmpurile LastName şi FirstName    Set idx = tdf.CreateIndex("FirstLastName")    ' crearea câmpurilor din index    Set fldLast = idx.CreateField("LastName", dbText)    Set fldFirst = idx.CreateField("FirstName", dbText)    ' adăugarea obiectelor Field    idx.Fields.Append fldLast    idx.Fields.Append fldFirst    ' fixarea proprietăţii Required    idx.Required = True    ' adăugarea noului obiect index    tdf.Indexes.Append idx    ' deschiderea recordset-ului de tip tabelă    Set rst = dbs.OpenRecordset("Employees")    ' fixarea proprietăţii Index a obiectului Recordset    rst.Index = idx.Name    ' efectuarea operaţiunii de căutare    rst.Seek "=", "King", "Robert"    ' tipărirea valorilor tuturor câmpurilor cu excepţia câmpului Photo    For Each fld In rst.Fields        If fld.Type <> dbLongBinary Then            Debug.Print fld        End If    Next fldEnd Sub

Observaţie. În mediul Microsoft Access se poate lucra cu mulţimea indexurilor în meniul View, comanda Indexes.

Colecţia QueryDefs

Printr-o interogare înţelegem o operaţiune, formalizată, prin care este returnată o mulţime de înregistrări care satisfac cerinţe impuse sau se execută o acţiune specifică asupra unei mulţimi de înregistrări selectate după cerinţele din interogare.

Un obiect QueryDef reprezintă o interogare în DAO. Obiectele QueryDef pot fi salvate cu baza de date în Microsoft Jet sau pot fi temporare în ODBCDirect şi Jet.

Relaţiile în ierarhia de obiecte DAO sunt

Obiectul sau colecţia Este conţinut în Conţine

QueryDef (obiect) Colecţia QueryDefs Colecţia Fields

Colecţia Parameters

Colecţia Properties

Page 196: tutoriale vba

QueryDefs (colecţie) Obiectul Database Obiecte QueryDef

Obiectele QueryDef oferă:

folosirea proprietăţii SQL pentru a fixa sau returna definiţia interogării; folosirea colecţiei Parameters pentru a fixa sau returna parametrii interogării;

utilizarea proprietăţii Type pentru a determina dacă interogarea selectează înregistrările dintr-o tabelă existentă, creează o nouă tabelă etc.;

utilizarea proprietăţii MaxRecords pentru a limita numărul de înregistrări returnate de o înregistrare;

folosirea proprietăţii ODBCTimeout pentru a indica timpul de aşteptare a rezultatului unei interogări.

În spaţiul de lucru Microsoft Jet mai sunt posibile:

utilizarea proprietăţii ReturnRecords pentru a indica, la interogări prin SQL, returnarea de înregistrări;

utilizarea proprietăţii Connect pentru a realiza o interogare a unei baze ODBC prin SQL.

În spaţiul ODBCDirect sunt specifice

utilizarea proprietăţii Prepare pentru a determina dacă se invocă ODBC SQLPrepare API la executarea interogării;

utilizarea proprietăţii CacheSize pentru depozitarea (cache) înregistrărilor returnate de interogare.

Obiectele QueryDef temporare nu sunt salvate pe disc şi nu sunt adăugate la colecţia QueryDefs. În general, interogările temporare sunt utile atunci când frazele SQL sunt create, repetat, în timpul execuţiei.

Un obiect QueryDef permanent din spaţiul Jet poate fi gândit ca o instrucţiune SQL compilată. Astfel, interogarea este mai rapidă decât o instrucţiune SQL executată prin metoda OpenRecordset.

Pentru a crea un obiect QueryDef se utilizează metoda CreateQueryDef.

În spaţiul Jet, dacă se precizează numele noului obiect se creează un obiect QueryDef permanent şi care este adăugat automat la colecţia QueryDefs şi salvată în disc. Dacă se dă implicit sau explicit un nume vid, "", atunci rezultatul este un obiect QueryDef temporar.

În spaţiul ODBCDirect o interogare este întotdeauna temporară.

Colecţia QueryDef conţine toate obiectele QueryDef deschise. Când o interogare este închisă, ea este înlăturată automat din colecţia QueryDef.

Referinţa la un obiect permanent QueryDef este uzuală, prin intermediul colecţiei:

Page 197: tutoriale vba

QueryDefs(0)QueryDefs("name")QueryDefs![name]

Referinţa la obiectele temporare QueryDef se poate obţine doar prin variabilele obiect la care s-au asignat interogările.

Crearea interogărilor permanente

Interogările permanente, salvate împreună cu baza de date, pot fi create în Visual Basic cu DAO sau în interfaţa utilizator din Microsoft Access.

Exemplul următor constituie un model pentru crearea unei interogări.

Const conPath As String = _        "C:\Program Files\ … \Northwind.mdb"Dim dbs As Database, qdf As QueryDef, rst As RecordsetDim strSQL As String strSQL = "SELECT FirstName, LastName, LastName, HireDate FROM Employees " _        & "WHERE Title = 'Sales Representative' ORDER BY HireDate;"Set dbs = OpenDatabase(conPath)Set qdf = dbs.CreateQueryDef("Sales Representatives", strSQL)Set rst = qdf.OpenRecordset

Obiectul QueryDef nou creat nu trebuie adăugat la colecţia QueryDefs, deoarece prin specificarea unei valori nenule a argumentului name se creează o interogare permanentă şi aceasta este adăugată automat la colecţie. Un nume nul ar duce la crearea unei interogări temporare (în spaţiul ODBCDirect toate obiectele QueryDef sunt întotdeauna temporare).

Colecţia Parameters (QueryDef Object)

Un obiect Parameter reprezintă o valoare transmisă unei interogări. Colecţia Parameters conţine toate obiectele Parameter definite de un obiect QueryDef. Localizarea în ierarhia de obiecte DAO este precizată în tabelul alăturat.

Obiectul sau colecţia Este conţinut în Conţine

Parameter (obiect) Colecţia Parameters

Colecţia Properties

Parameters (colecţie)

Obiectul QueryDef Obiecte Parameter

Dacă se doreşte ca utilizatorul sau aplicaţia să ofere o valoare în timpul execuţiei, prin care să se limiteze mulţimea înregistrărilor returnate de o interogare, aceasta se realizează prin definirea parametrilor interogării.

Pentru a crea un parametru se utilizează declaraţia SQL PARAMETERS. Sintaxa declaraţiei este:

PARAMETERS name datatype [, name datatype [, …]]

Page 198: tutoriale vba

Declaraţia PARAMETERS precede restul instrucţiunii SQL şi este separată prin caracterul ";", după exemplul următoarei instrucţiuni SQL:

PARAMETERS [ Beginning OrderDate] DATETIME,[ Ending OrderDate] DATETIME;

SELECT * FROM Orders

WHERE (OrderDate Between [ Beginning OrderDate] And [ Ending OrderDate] );

Fiecare parametru definită în instrucţiunea SQL este reprezentată de un obiect Parameter în colecţia Parameters a obiectului QueryDef bazat pe instrucţiunea SQL. Valoarea unui parametru se poate specifica prin fixarea proprietăţii Value a obiectului Parameter. Exemplul următor realizează o asemenea operaţiune. 

Function NewParameterQuery (dteStart As Date, dteEnd As Date) As Boolean    Dim dbs As Database, qdf As QueryDef, rst As Recordset    Dim strSQL As String     On Error Resume Next    ' returnarea referinţei la baza curentă    Set dbs = CurrentDb    ' construcţia şirului SQL    strSQL = "PARAMETERS [Beginning OrderDate] DATETIME, " _            & "[Ending OrderDate] DATETIME; SELECT * FROM Orders " & _            "WHERE (OrderDate Between [Beginning OrderDate] " _            & "AND [ Ending OrderDate] )';"    ' eliminarea interogării dacă ea există    dbs.QueryDefs.Delete "ParameterQuery"        On Error GoTo Err_NewParameterQuery    ' crearea unui nou obiect QueryDef    Set qdf = dbs.CreateQueryDef("ParameterQuery", strSQL)     ' fixarea valorilor parametrilor    If dteStart > dteEnd Then        MsgBox "Start date is later than end date."        Exit Function    End If    qdf.Parameters("Beginning OrderDate") = dteStart    qdf.Parameters("Ending OrderDate") = dteEnd     ' deschiderea recordset-ului din interogare    Set rst = qdf.OpenRecordset    rst.MoveLast    MsgBox "Query returned " & rst.RecordCount & " records."    NewParameterQuery = True Exit_NewParameterQuery:    rst.Close    Set dbs = Nothing    Exit Function Err_NewParameterQuery:    MsgBox "Error " & Err & ": " & Err.Description    NewParameterQuery = False    Resume Exit_NewparameterQueryEnd Function

Page 199: tutoriale vba

Funcţia poate fi apelată din fereastra Debug prin

? NewParameterQuery(#6-30-95#, #6-30-96#)

Observaţie. În Microsoft Access se pot defini parametrii unei interogări în Query Design View.

Colecţia Relations (obiectul Database)

Un obiect Relation reprezintă o relaţie între câmpuri din tabele sau înterogări. Colecţia Relations conţine toate obiectele Relation ale unei baze de date. Localizarea în ierarhia de obiecte DAO a spaţiului de lucru Microsoft Jet este

Obiectul sau colecţia Este conţinut în Conţine

Relation (obiect) Colecţia Relations Colecţia Fields

Colecţia Properties

Relations (colecţie) Obiectul Database Obiecte Relation

Relaţii între tabele

Separarea informaţiilor între mai multe tabele ale unei baze de date, după criterii care ţin de subiect, categorie, administrare etc., ridică problema reunirii informaţiilor pentru necesităţi de raportare a lor. Pentru rezolvarea acestei probleme o primă operaţiune este aceea de a stabili relaţii între tabele.

Prin relaţie se înţelege, în problematica bazelor de date, o asociere stabilită între două câmpuri (denumite câmpuri cheie, de regulă cu acelaşi nume) din două tabele. În acest mod înregistrările celor două tabele pot fi coordonate încât înregistrările curente să conţină informaţii corelate după câmpurile asociate.

Relaţia lucrează prin potrivirea valorilor câmpurilor cheie. În cele mai multe cazuri, câmpurile cheie sunt cheia primară dintr-o tabelă (s-o numim tabela A), care constituie un identificator unic pentru fiecare înregistrare, şi o cheie externă din altă tabelă (s-o numim tabela B).

Există trei tipuri de relaţii: one-to-one, one-to-many, many-to-many după numărul înregistrărilor din cele două tabele, care îndeplinesc condiţia de matching.

O relaţie one-to-many, cea mai frecventă, o înregistrare din tabela A poate să se potrivească cu mai multe înregistrări din tabela B; invers, o înregistrare din tabela B are doar o înregistrare din A cu care se potriveşte.

Într-o relaţie many-to-many, o înregistrare din tabela A poate să se potrivească cu mai multe înregistrări din tabela B, iar o înregistrare din tabela B poate să se corespundă cu mai multe înregistrări din tabela A. Acest tip de relaţie este posibil prin definirea unei a treia tabele (tabela de joncţiune – junction table) ale cărei câmpuri chei primare sunt în relaţie cu cheile externe din tabelele A şi B. Astfel, o relaţie many-to-many este formată din două relaţii one-to-many care implică o a treia tabelă.

Page 200: tutoriale vba

Relaţia one-to-one presupune că înregistrările din tabelele A şi B sunt în corespondenţă una la una, fiecare înregistrare din A se poate potrivi doar cu o înregistrare din B şi reciproc. Deşi nu este o situaţie uzuală, prin aceea că legătura foarte puternică ar presupune că informaţia trebuia grupată într-o singură tabelă, relaţia one-to-one poate fi utilizată pentru divizarea unei tabele cu prea multe câmpuri sau izolarea unei părţi a tabelei.

Modul de relaţie creat de Microsoft Access depinde de definirea câmpurilor care sunt puse în relaţie (chei primare, indexuri unice etc.).

Obiectul Relation

Obiectul Relation poate fi utilizat pentru a crea noi relaţii sau pentru a examina relaţiile existente în baza curentă. Proprietăţile obiectului servesc la specificarea tipului de relaţie, a tabelelor care participă în relaţie, când să se forţeze integritatea referenţială (integritatea referenţială – Referential integrity – este un sistem de reguli utilizate în Access pentru a asigura că relaţiile dintre înregistrările tabelelor legate sunt valide şi că nu se şterg sau modifică date legate; integritatea referenţială interzice adăugarea de înregistrări la o tabelă legată pentru care nu există cheie primară, modificarea valorilor în tabela primară care conduce la înregistrări orfane în tabela legată etc.) şi când să se execute actualizările şi ştergerile în cascadă (actualizări în cascadă – cascading update – pentru relaţiile care impun integritatea referenţială, o opţiune care, în cazul modificării unei chei primare din înregistrările tabelei primare, conduce la actualizarea automată a cheilor externe în toate înregistrările legate din tabelele externe; ştergeri în cascadă – cascading delete – similar, dar pentru ştergeri de înregistrări: ştergerea unei inregistrări din tabela primară produce ştergerea înregistrărilor legate din tabelele externe). Toate aceste noţiuni sunt prezentate, pe scurt, în continuare.

Adăugarea unui obiect Relation la colecţia Relations, se va crea obiectul prin metoda CreateRelation şi se adaugă la colecţie prin metoda Append. Astfel, obiectul Relation este salvat o dată cu obiectul Database. Eliminarea unui obiect Relation se realizează metoda Delete.

Referirea la un obiect Relation se realizează în mod uzual:

Relations(0)Relations("name")Relations![name]

Acţiunile principale realizate prin utilizarea obiectului Relation sunt enumerate în continuare.

Stabilirea unei relaţii impuse între câmpuri din tabele de bază (o tabelă de bază este o tabelă a unei baze de date Microsoft Jet) dar nu relaţii care implică tabele şi interogări legate (o tabelă legată este o bază externă, legată de o bază de date Jet).

Stabilirea unei relaţii neimpuse între orice tip de tabelă sau interogare – nativă sau legată.

Utilizarea proprietăţii Name pentru a referi relaţia dintre câmpurile din tabela primară (prin tabela primară se înţelege partea "one" dintr-o relaţie one-to-many) referită şi tabela externă (tabela de pe partea "many" a relaţiei one-to-many) care face referirea.

Page 201: tutoriale vba

Utilizarea proprietăţii Attributes pentru a determina dacă relaţia dintre câmpuri este one-to-one şi cum să se impună integritatea referenţială. De asemenea, tot prin Attributes, se poate determina dacă motorul Microsoft Jet poate efectua actualizarea în cascadă şi ştergerea în cascadă în tabelele legate prin relaţii.

Utilizarea proprietăţii Attributes pentru a determina dacă relaţia este asociere stânga (left join, include toate înregistrările din prima tabelă – din stânga – chiar dacă nu există nici o potrivire cu înregistrări din a doua tabelă – din dreapta) sau asociere dreapta (right join, include toate înregistrările din a doua tabelă – din dreapta– chiar dacă nu există potriviri cu înregistrări din prima tabelă – din stânga relaţiei).

Utilizarea proprietăţii Name a obiectelor Field din colecţia Fields a obiectului Relation pentru a stabili sau returna numele câmpurilor din cheia primară a tabelei referite, sau setările proprietăţii ForeignName a obiectelor Field pentru a stabili sau returna denumirile câmpurilor din cheia externă a tabelei care face referinţa.

Un obiect Relation are o colecţie Fields care conţine două câmpuri, câte unul în fiecare tabelă a relaţiei.Câmpurile relaţiei trebuie să aibă acelaşi tip de dată şi trebuie să aibă valori comune. Se vor utiliza proprietăţile Table şi ForeignTable ale obiectului Relation pentru a specifica tabele care iau parte la relaţie şi cum sunt legate. La crearea unei relaţii one-to-many, tabela de pe partea "one" a relaţiei este tabela în care câmpul din legătură este cheia primară. Prin urmare proprietatea Table trebuie să fie numele acestei tabele. Tabela de pe partea "side" a relaţiei este tabela în care câmpul legat este cheie externă iar numele tabelei se va da proprietăţii ForeignTable.

Următorul exemplu creează o relaţie între tabelele Employees şi Orders din baza de date de test Northwind. Cele două tabele sunt unite prin câmpul EmployeeID care este cheie primară în baza Employees – toate valorile acestui câmp sunt unice – şi cheie externă pentru Orders – aceeaşi valoare poate să apară în mai multe înregistrări.

Function NewRelation() As Boolean    Dim dbs As Database    Dim fld As Field, rel As Relation    ' calea către baza de date Northwind    Const conPath As String = _        "C:\Program Files\ … \Northwind.mdb"    On Error GoTo Err_NewRelation    ' returnează o referinţă la baza curentă    Set dbs = OpenDatabase(conPath)    ' găsirea unei relaţii EmployeesOrders deja existente    For Each rel In dbs.Relations        If rel.Table = "Employees" And rel.ForeignTable = "Orders" Then            ' mesaj de ştergere a relaţiei existente            If MsgBox(rel.Name & " already exists. " & vbCrLf _                & "This relation will be deleted and re-created.", vbOK) = vbOK Then                dbs.Relations.Delete rel.Name            Else                ' dacă utilizatorul răspunde cu Cancel                Exit Function            End If        End If    Next rel        ' crearea noii relaţii şi stabilirea proprietăţilor ei    Set rel = dbs.CreateRelation("EmployeesOrders", "Employees", "Orders")

Page 202: tutoriale vba

    ' stabilirea proprietăţilor pentru forţarea integrităţii referenţiale    rel.Attrbutes = dbRelationDeleteCascade + dbRelationUpdateCascade    ' creare câmp în colecţia Fields a obiectului Relation, la creare se fixează Name    Set fld = rel.CreateField("EmployeeID")    ' numele pentru câmpul extern    fld.ForeignName = "EmployeeID"        ' adăugarea obiectelor create    rel.Fields.Append fld    dbs.Relations.Append rel    MsgBox "Relation '" &rel.Name & " ' created."    Set dbs = Nothing    NewRelation = True Exit_NewRelation:    Exit Function Err_NewRelation    MsgBox "Error " & Err & ": " & Err.Description    NewRelation = False    Resume Exit_NewRelationEnd Function

Observaţie. În Microsoft Access se lucrează cu relaţiile prin meniul Tools – Relationships.

VISUAL BASIC - TEST GRILA

VISUAL BASIC - TEST GRILA

1. Mediul de programare Visual Basic este un mediu care permite:

a) Programarea excusiva a aplicatiilor manageriale;

b) Programarea excusiva a aplicatiilor contabile;

c) Programarea excusiva a aplicatiilor ingineresti;

d) Programarea excusiva a aplicatiilor cu baze de date;

e) Este un mediu de programare complex care permite realizarea aplicatiilor Windows.

2. Mediul de programare Visual Basic este un mediu se foloseste doar la:

a) Elaborarea oricaror programe windows orientate pe obiecte;

b) Elaborarea programelor windows pentru lucrul exclusiv cu memoria externa;

c) Crearea bazelor de date;

Page 203: tutoriale vba

d) Programe care se ocupa doar cu gestiunea fisierelor;

e) Realizarea programelor de grafica.

3. Mediul de programare Visual Basic este un limbaj de programare:

a) compilat;

b) interpretat;

c) organizat;

d) de nivel masina;

e) nu este limbaj d eprogramare ci o simpla aplicatie.

4. Obiectele in mediul de programare Visual Basic:

a) se folosesc la elaborarea programelor;

b) se folosesc la executarea programelor;

c) se folosesc la interactiunea cu sistemul de operare;

d) sunt utilizate in vederea portabilitatii programelor;

e) sunt utilizate la imporatarea datelor prin Clipboard.

5. Ce este programarea orientata pe obiecte:

a) Programarea aplicatiilor utilizand mediul Windows;

b) Programarea secventiala;

c) Crearea subrutinelor;

d) Programarea aplicatiilor pe baza obiectelor, a proprietaatii acestora si a evenimentelor asociate;

e) Realizarea programelor de grafica.

6. Un proiect Visual Basic poate contine urmatoarele tipuri de fisiere:

a) Fisiere grafice si audio;

b) Fisiere text si documente;

c) Fisiere cu formulare grafice, cu structuri de date, fisiere de cod;

d) Fisiere cu documente Microsoft Office;

Page 204: tutoriale vba

e) Fisiere de cod si baze de date relationale.

7. Mediul de programare Visual Basic este un mediu:

a) De programare orientata pe obiecte;

b) De programare secventiala;

c) Pentru programarea unor subrutine ce se realizeaza intr-o anumita ordine;

d) Pentru programarea exclusiva a obiectelor grafice;

e) Pentru programarea exclusiva a bazelor de date.

8. Un program realizat in Visual Basic poate rula pe:

a) orice calculator pentium IV;

b) orice calculator pentiumIV dotat cu 1Gb memorie RAM;

c) orice calculator care are visual basic instalat;

d) orice calculator care are mediul Windows XP;

e) orice calculator care are mediul Windows 2000.

9. Un program realizat in Visual Basic poate rula pe:

a) orice calculator cu sistem de operare MS DOS;

b) orice calculator pentiumIV dotat cu 1Gb memorie RAM si sistem de operare Windows;

c) orice calculator care are visual basic instalat si sistem de operare Windows;

d) orice calculator care are sistemul de operare Linux;

e) orice calculator care are mediul Windows 2000, 1Gb memorie RAM si DVD.

10. Un program realizat in Visual Basic poate realiza:

a) orice program care utilizeaza evenimente Windows;

b) orice program care utilizeaza evenimente ale oricarui sistem de operare;

c) orice program care utilizeaza evenimente generate de procesor;

d) orice program care utilizeaza evenimente generate de mecanismul de gestionare a memoriei;

Page 205: tutoriale vba

e) orice program care utilizeaza evenimente in timp real.

11. Datele folosite in Visual Basic pot fi declarate:

a) La inceputul fisierului;

b) La sfarsitul fisierului;

c) In interiorul subrutinelor;

d) La inceputul fisierului si in interiorul subrutinelor;

e) La inceputul fiecarei subrutine.

12. Datele folosite in Visual Basic pot fi de tip:

a) Numeric;

b) Nenumeric;

c) Numeric si nenumeric;

d) Text;

e) Boolean.

13. Care dintre expresiile de mai jos realizeaza declararea unei variabile de tip sir de caractere

de lungime variabila:

a) Dim str As single;

b) Dim str As string;

c) Dim str As string[8];

d) Dim str=8 As string;

e) Dim str As variant.

14. Care dintre expresiile de mai jos poate realiza asignarea unei variabile de tip numeric:

a) value='5';

b) value="5";

c) value="5"+5;

d) value=5+5;

Page 206: tutoriale vba

e) value="5"&"5".

15. Care dintre expresiile de mai jos poate realiza asignarea unei variabile de tip sir de caractere:

a) str="Intrebare corecta"+5;

b) str="Intrebare gresita"+'5';

c) str="Intrebare gresita"&"5";

d) str=(Intrebare)+5;

e) str="Intrebare" + (corecta) & 5.

16. Care sunt operatorii valabili in Visual Basic:

a) +,-,*,/;

b) +,-,*,/,^,Mod,&;

c) ^,Mod,&;

d) +,-,*,/,^,Mod,&, sqrt,radius;

e) +,-,*,/,^,Mod,&, MsgBox.

17. Ce este asignarea unei variabile:

a) declararea ei;

b) initializarea ei;

c) atribuirea unei valori exclusiv numerice;

d) atribuirea unei valori exclusiv nenumerice;

e) atribuirea unei valori din domeniul de reprezentare al acesteia.

18. Cum se face declararea unei variabile:

a) prin folosirea cuvantului cheie DIM;

b) initializarea ei;

c) atribuirea unei valori exclusiv numerice;

d) atribuirea unei valori exclusiv nenumerice;

e) prin folosirea cuvantului cheie DECLARATION.

Page 207: tutoriale vba

19. Declararea unei variabile:

a) este obligatorie la inceputul programului;

b) este obligatorie la sfarsitul programului;

c) este obligatorie in fereastra de cod inainte de utilizarea acesteia;

d) este obligatorie in fereastra de cod dupa utilizarea acesteia;

e) nu este obligatorie.

20. Declararea operatorilor:

a) trebuie realizata la inceputul programului;

b) trebuie realizata la intrarea in functiile matematice;

c) se face in zona ferestrei de cod prin cuvantul OPER;

d) se face prin folosirea exclusiva a operatorilor definiti in Visual Basic;

e) nu este posibila.

21. Instructiunile de control realizeaza:

a) Controlul mersului programului prin subrutine;

b) Luarea deciziilor logice si ciclarea instructiunilor;

c) Controlul bazelor de date relationale;

d) Navigarea in bazele de date;

e) Salvarea fisierelor proiectului Visual Basic.

22. Instructiunea IF.THEN.ELSE serveste la:

a) Alegerea unei alternative din doua in functie de o conditie;

b) Alegerea unei alternative din mai multe in functie de o conditie;

c) Alegerea a doua alternative in functie de o conditie;

d) Alegerea unei alternative sau iesirea din program daca conditia este adevarata;

e) Alegerea unei alternative sau iesirea din program daca conditia este falsa.

23. Instructiunea IF.THEN. serveste la:

Page 208: tutoriale vba

a) Alegerea unei alternative din doua in functie de o conditie;

b) Alegerea unei alternative daca conditia este falsa;

c) Alegerea unei alternative daca conditia este adevarata;

d) Alegerea unei alternative sau iesirea din program daca conditia este adevarata;

e) Alegerea unei alternative sau iesirea din program daca conditia este falsa.

24. O instructiune de decizie serveste la:

a) Alegerea unei alternative din exact patru in functie de o conditie;

b) Alegerea unei alternative daca conditia este falsa;

c) Alegerea unei alternative daca conditia este adevarata;

d) Alegerea unei alternative sau iesirea din program daca conditia este adevarata;

e) Alegerea unei alternative sau iesirea din program daca conditia este falsa.

25. Cu ajutorul instructiunilor de decizie se poate face:

a) Alegerea unei alternative daca conditia este adevarata;

b) Alegerea unei alternative daca conditia este falsa;

c) Alegerea unei alternative din exact 4 in functie de o conditie;

d) Alegerea unei alternative sau iesirea din program daca conditia este adevarata;

e) Alegerea unei alternative sau iesirea din program daca conditia este falsa.

26. Cum se iese fortat dintr-o instructiune de decizie:

a) Nu se iese fortat ci doar printr-o alternativa;

b) Folosind cuvantul cheie EXIT IF;

c) Folosind cuvantul cheie EXIT FOR;

d) Folosind cuvantul cheie EXIT;

e) Folosind cuvantul cheie EXIT ALL.

27. Se pot intercala mai multe blocuri decizionale?

a) Da;

Page 209: tutoriale vba

b) Da, numai daca primul este tot timpul adevarat;

c) Da, numai daca primul este tot timpul fals;

d) Da, numai daca al doilea este tot timpul adevarat;

e) Nu.

28. Care este maximul de blocuri de decizie inlantuite?

a) 1;

b) 2;

c) 15;

d) Oricate;

e) 256.

29. Cum se numeste variabila de decizie?

a) conditie;

b) test terminal;

c) operator;

d) cuvant cheie;

e) cuvant de decizie.

30. Care este cuvantul cheie care termina un bloc decizional?

a) nu este necesar un astfel de cuvant;

b) END TEST;

c) END CONDITIE;

d) END IF;

e) END LF.

31. Instructiunea FOR.NEXT. serveste la:

a) La realizarea unei ciclari cu numar cunoscut de repetitii;

b) La realizarea unei ciclari cu numar necunoscut de repetitii;

Page 210: tutoriale vba

c) La realizarea unei ciclari in functie de valoarea de adevar a unei conditii cu numar cunoscut

de repetitii;

d) La realizarea unei ciclari in functie de valoarea de adevar a unei conditii cu numar

necunoscut de repetitii;

e) La iesirea din program in functie de valoarea de adevar unei conditii.

32. Cuvantul cheie NEXT din cadrul instructiunii FOR.NEXT. serveste la:

a) Testarea conditiei;

b) Incrementarea contorului;

c) Iesirea din ciclu;

d) Iesirea din program;

e) Anularea conditiei.

33. Cuvantul cheie END FOR din cadrul instructiunii FOR.NEXT. serveste la:

a) Testarea conditiei;

b) Incrementarea contorului;

c) Iesirea fortata din ciclu;

d) Iesirea din program;

e) Stabilirea pasului de incrementare.

34. Ciclul Do.Loop serveste la:

a) La realizarea unei ciclari cu numar cunoscut de repetitii indiferent de conditie;

b) La realizarea unei ciclari cu numar necunoscut de repetitii indiferent de conditie;

c) La realizarea unei ciclari in functie de valoarea de adevar a unei conditii cu numar cunoscut

de repetitii;

d) La realizarea unei ciclari in functie de valoarea de adevar a unei conditii cu numar

necunoscut de repetitii;

Page 211: tutoriale vba

e) La iesirea din program in functie de valoarea de adevar unei conditii.

35. In cadrul unei instructiuni de ciclare Do.Loop, cuvantul cheie While:

a) La inceputul ciclului;

b) La sfarsitul ciclului;

c) Poate fi plasat si la inceput si la sfarsit;

d) Nu se plaseaza intr-un astfel de ciclu;

e) Serveste la iesirea fortata din ciclu.

36 In cadrul unei instructiuni de ciclare Do.Loop, cuvantul cheie Until

a) La inceputul ciclului;

b) La sfarsitul ciclului;

c) Poate fi plasat si la inceput si la sfarsit;

d) Nu se plaseaza intr-un astfel de ciclu;

e) Serveste la iesirea fortata din ciclu.

37 In cadrul unei instructiuni de ciclare Do.Loop, cuvantul cheie Exit Do

a) Serveste la stabilirea numarului de ciclari;

b) Serveste la iesirea normala din ciclu;

c) Serveste la iesirea din program;

d) Nu se plaseaza intr-un astfel de ciclu;

e) Serveste la iesirea fortata din ciclu.

38 Select Case este o structura de control care serveste la:

a) Alegerea unei variante din mai multe posibile;

b) Realizarea unui ciclu infinit;

c) Luarea unei decizii de terminare anormala a programului;

d) Repetarea unei secvente de instructiuni de un numar de ori cunoscut;

e) Alegerea unor variante din mai multe posibile in functie de o conditie de decizie.

Page 212: tutoriale vba

39 Cuvantul cheie Case Else intr-o instructiune Select Case:

a) Serveste la alegerea unei alternative care nu este prezentata prin cuvantul cheie Case;

b) Serveste la terminarea fortata a structurii;

c) Serveste la terminarea normala a structurii;

d) Face trecerea la prima structura de decizie IF.THEN.ELSE;

e) Nu este permisa intr-o astfel de structura.

40 Pentru a executa o singura instructiune in functie de valoarea de adevar a unei conditii care este structura cea mai potrivita:

a) IF.THEN;

b) IF.THEN.ELSE;

c) IF.THEN.ELSEIF.ELSE;

d) SELECT CASE.;

e) IF.THEN.ENDIF.

41 Care este structura cea mai potrivita pentru executarea unei ciclari a unui grup de instructiuni de exact 5 ori:

a) FOR.NEXT;

b) DO WHILE.LOOP;

c) IF.THEN.ELSEIF.ELSE;

d) DO.LOOP UNTIL;

e) SELECT CASE..

42 Care este structura cea mai potrivita pentru alegerea unei variante din mai multe posibile, tratand si cazul cand nu exisita nici o valoare corecta:

a) SELECT CASE.CASE ELSE.;

b) DO WHILE.LOOP;

c) IF.THEN.ELSEIF.ELSE;

d) DO.LOOP UNTIL;

Page 213: tutoriale vba

e) SELECT CASE..

43 Care este structura cea mai potrivita pentru executarea unei ciclari a unui grup de

instructiuni de un numar necunoscut de repetari, obligatoriu executandu-se macar odata structura:

a) FOR.NEXT;

b) DO WHILE.LOOP;

c) IF.THEN.ELSEIF.ELSE;

d) DO.LOOP UNTIL;

e) SELECT CASE..

44 Care este structura cea mai potrivita pentru executarea unei ciclari a unui grup de

instructiuni de un numar necunoscut de repetari, avandu-se grija de a nu executa niciodata strcutura

daca acest lucru nu este necesar:

a) FOR.NEXT;

b) DO WHILE.LOOP;

c) IF.THEN.ELSEIF.ELSE;

d) DO.LOOP UNTIL;

e) SELECT CASE..

45 Ce este instantierea multipla?

a) o grupare de mai multe obiecte;

b) un eveniment windows;

c) un mecanism de programare;

d) o proprietate comuna a mai multor obiecte;

e) o grupare de evenimente.

46 Care este modalitatea prin care Visual Basic realizeaza instantierea multipla.

a) declarand repetat acelasi obiect;

Page 214: tutoriale vba

b) prin setarea proprietatii index;

c) prin setarea proprietatii multiple object;

d) prin redimensionarea cu acelasi nume a mai multor obiecte;

e) nu se poate realiza in Visual Basic.

47 Cum recunoastem ca un obiect este instantiat multiplu?

a) este declarat repetat;

b) proprietatea index este setata;

c) proprietatea multiple object este setata;

d) are obligatoriu proprietatea index setata pe 0;

e) are obligatoriu proprietatea index setata pe infinit.

48 Care este avantajul instantierii multiple?

a) nu este niciun avantaj;

b) eleganta programarii;

c) programul ocupa mai putina memorie;

d) se foloseste un acelasi nume;

e) nu se mai declara variabile.

49 Cum se face referirea la obiectele instantiate multiplu?

a) nu se poate face de catre programator;

b) nu se poate face de catre program;

c) prin nume si index;

d) prin nume si object;

e) prin nume.

50 Cate instante ale unui obiect pot fi definite?

a) 1;

b) 10;

Page 215: tutoriale vba

c) 100;

d) 256;

e) o infinitate.

51 Cate obiecte pot fi instantiate multiplu intr-un proiect?

a) 1;

b) 10;

c) 100;

d) 256;

e) oricate.

52 In ce proiecte putem folosi instantierea multipla?

a) In proiecte grafice;

b) In proiecte de decizie manageriala;

c) In programe contabile;

d) In proiecte simple;

e) In orice proiecte visual basic.

53 Functia interna MsgBox() serveste la:

a) Producerea unui eveniment in formularul principal;

b) Afisarea unei ferestre cu un anumit mesaj, intr-o forma stabilita de utilizator;

c) Afisarea unei ferestre cu ora curenta;

d) Afisarea unei ferestre cu timpul curent;

e) Introducerea unei variabile.

54 Functia interna InputBox() serveste la:

a) Producerea unui eveniment in formularul principal;

b) Introducerea unei variabile, intr-un format stabilit de utilizator;

c) Afisarea unei ferestre cu ora curenta;

Page 216: tutoriale vba

d) Afisarea unei ferestre cu timpul curent;

e) Afisarea unui mesaj.

55 O functie definita de utilizator:

a) Serveste la rezolvarea unei sarcini specifice;

b) Trebuie apelata obligatoriu la inceputul unui program;

c) Nu poate contine nici un parametru intre paranteze;

d) Obligatoriu trebuie sa termine si programul curent;

e) Nu poate contine o variabila proprie.

56 Functia interna Val() serveste la:

a) Conversia unui string in valoare numerica;

b) Conversia unei valori numerice in string;

c) Afisarea unei ferestre cu ora curenta;

d) Afisarea unei ferestre cu timpul curent;

e) Afisarea unui mesaj.

57 Functia interna Str() serveste la:

a) Conversia unui string in valoare numerica;

b) Conversia unei valori numerice in string;

c) Afisarea unei ferestre cu ora curenta;

d) Afisarea unei ferestre cu timpul curent;

e) Afisarea unui mesaj.

58 Ce functie putem utiliza pentru afisarea unor informatii intr-o fereastra?

a) InputBox();

b) MsgBox();

c) Afis();

d) Windows();

Page 217: tutoriale vba

e) nu exista o astfel de functie.

59 Ce functie putem utiliza pentru preluarea unor informatii intr-o fereastra?

a) InputBox();

b) MsgBox();

c) Afis();

d) Windows();

e) nu exista o astfel de functie.

60 Ce functie putem utiliza pentru conversia unui sir de caractere in numar?

a) InputBox();

b) MsgBox();

c) Str();

d) Val();

e) nu exista o astfel de functie.

61 Ce functie putem utiliza pentru conversia unui numar in sir de caractere?

a) InputBox();

b) MsgBox();

c) Str();

d) Val();

e) nu exista o astfel de functie.

62 Ce tipuri de fisiere contine un proiect visual basic?

a) *.vbp, *.frm, *.bas;

b) *.vis, *.prj;

c) *.prj;

d) *.exe;

e) *.com.

Page 218: tutoriale vba

63 Ce contine un proiect visual basic?

a) toate fisierele aplicatiei;

b) toate datele din baza de date;

c) fisierele aplicatiei si datele din baza de date;

d) instructiunile programului;

e) formularele grafice.

64 Ce contine un formular visual basic?

a) toate fisierele aplicatiei;

b) toate datele din baza de date;

c) fisierele aplicatiei si datele din baza de date;

d) instructiunile programului;

e) formularul grafic cu toate obiectele visuale.

65 Unde sunt salvate liniile de cod?

a) in afara formularului;

b) intr-un fisier separat;

c) in baza de date;

d) in zona instructiunilor programului;

e) in zona de cod a formularului.

66 Ce contine un fisier *.vbp?

a) toate fisierele aplicatiei;

b) toate datele din baza de date;

c) fisierele aplicatiei si datele din baza de date;

d) instructiunile programului;

e) formularul grafic cu toate obiectele visuale.

67 Ce contine un fisier *.frm?

Page 219: tutoriale vba

a) toate fisierele aplicatiei;

b) toate datele din baza de date;

c) fisierele aplicatiei si datele din baza de date;

d) instructiunile programului;

e) formularul grafic cu toate obiectele visuale.

68 Ce contine un fisier *.bas?

a) toate fisierele aplicatiei;

b) toate datele din baza de date;

c) fisierele aplicatiei si datele din baza de date;

d) diverse functii sub forma unor module;

e) formularul grafic cu toate obiectele visuale.

69 Unde este salvat formularul grafic?

a) intr-un fisier separat cu extensia *.bas;

b) intr-un fisier separat cu extensia *.frm;

c) in baza de date;

d) in zona instructiunilor programului;

e) intr-un fisier separat cu extensia *.vbp.

70 Unde sunt salvate modulele cu diverse functii?

a) intr-un fisier separat cu extensia *.bas;

b) intr-un fisier separat cu extensia *.frm;

c) in baza de date;

d) in zona instructiunilor programului;

e) intr-un fisier separat cu extensia *.vbp.

71 Ce este proprietatea unui obiect?

a) numele obiectului;

Page 220: tutoriale vba

b) fisierul de care apartine;

c) proiectul din care face parte;

d) un atribut care poate lua diverse valori;

e) nu exista o astfel de denumire.

72 Cand pot fi setate proprietatile obiectului?

a) in timpul rularii programului;

b) in timpul realizarii programului;

c) atat in timpul rularii cat si in timpul proiectarii programului;

d) nu se pot seta;

e) dupa executia programului.

73 Unde pot fi setate proprietatile obiectului?

a) in program sau in Properties Windows;

b) numai in program;

c) numai in Properties Windows;

d) nu se pot seta;

e) in fisierul de configurare al proiectului.

74 Ce proprietati pot fi setate in timpul rularii?

a) toate proprietatile obiectului;

b) numai proprietatile care nu se pot seta in Properties Windows;

c) toate proprietatile obiectului care sunt permise de catre visual basic;

d) nu se pot seta;

e) numai proprietatile care nu se pot seta in fisierul de configurare al proiectului.

75 Ce proprietati pot fi setate in timpul proiectarii?

a) toate proprietatile obiectului;

b) numai proprietatile care nu se pot seta in Properties Windows;

Page 221: tutoriale vba

c) toate proprietatile obiectului care sunt permise de catre visual basic;

d) nu se pot seta;

e) numai proprietatile care nu se pot seta in fisierul de configurare al proiectului.

76 Cum se asociaza unui eveniment o actiune?

a) nu se poate asocia asa ceva;

b) se realizeaza automat de catre visual basic;

c) se realizeaza automat de catre sistemul de operare;

d) prin scrierea unui cod in dreptul evenimentului respectiv in program;

e) prin scrierea evenimentelor in fisierul de configurare al proiectului.

77 Asocierea evenimentelor se poate face in timpul proiectarii sau al rularii?

a) nu se poate asocia asa ceva;

b) numai in timpul proiectarii;

c) numai in timpul rularii;

d) atat in timpul proiectarii cat si al rularii;

e) depinde de fisierul de configurare al proiectului.

78 Ce este un eveniment?

a) un raspuns la o actiune, generat de catre sistemul de operare;

b) o proprietate a unui obiect;

c) o linie de cod;

d) nu exista asa ceva;

e) o linie din fisierul de configurare al proiectului.

79 Cine gestioneaza evenimentele?

a) Sistemul de ferestre;

b) Sistemul de operare;

c) Procesorul;

Page 222: tutoriale vba

d) Visual Basic;

e) Programul.

80 Evenimentele au proprietati?

a) Nu;

b) Da;

c) Depinde de sistemul de operare;

d) Depinde de program;

e) Depinde de fisierul de configurare al proiectului.

81 Ce sunt controalele in Visual Basic?

a) Obiecte care pot interactiona cu utilizatorul;

b) Obiecte care permit gestiunea evenimentelor;

c) Obiecte care permit setarea proprietatilor altor obiecte;

d) Obiecte de control al fluxului programului;

e) Nu exista asa ceva.

82 Ce este un control de tip buton?

a) Un obiect care simuleaza un buton real si prin apasarea cu mouse-ul se realizeaza o actiune;

b) Un obiect care simuleaza un buton real si prin apasarea unei taste de la tastatura se

realizeaza o actiune;

c) Un obiect care simuleaza un buton real si prin apasare permite setarea proprietatilor altor

obiecte;

d) Un obiect care simuleaza un buton real si prin apasare permite controlul fluxului

programului;

e) Nu exista asa ceva.

83 Ce este un control de tip eticheta?

Page 223: tutoriale vba

a) Un obiect care permite afisarea unei etichete cu un anumit text intr-un formular si prin apasarea cu mouse-ul se realizeaza o actiune;

b) Un obiect care permite afisarea unei etichete cu un anumit text intr-un formular;

c) Un obiect care permite etichetarea unui obiect in vederea recunoasterii sale de catre sistemul de operare;

d) Un obiect care permite etichetarea unui obiect in vederea recunoasterii sale de catre visual basic;

e) Nu exista asa ceva.

84 Ce este un control de tip option buton (radio)?

a) Un obiect care permite alegerea mai multor optiuni din mai multe existente;

b) Un obiect care permite alegerea unei singure optiuni din mai multe existente;

c) Un obiect care permite alegerea unei optiuni din 2 sau 3 existente;

d) Un obiect care permite alegerea unui post de radio din mai multe existente;

e) Nu exista asa ceva.

85 Ce este un control de tip check box?

a) Un obiect care permite alegerea mai multor optiuni din mai multe existente;

b) Un obiect care permite alegerea unei singure optiuni din mai multe existente;

c) Un obiect care permite alegerea unei optiuni din 2 sau 3 existente;

d) Un obiect care permite alegerea a 2 optiuni din mai multe existente;

e) Nu exista asa ceva.

86 Ce proprietati putem seta pentru controalele utilizate?

a) toate proprietatile obiectului;

b) numai proprietatile care nu se pot seta in Properties Windows;

c) toate proprietatile obiectului care sunt permise de catre visual basic;

d) nu se pot seta;

e) numai proprietatile care nu se pot seta in fisierul de configurare al proiectului.

87 Cum asociem evenimente controalelor?

Page 224: tutoriale vba

a) nu se poate asocia asa ceva;

b) se realizeaza automat de catre visual basic;

c) se realizeaza automat de catre sistemul de operare;

d) prin scrierea unui cod in dreptul evenimentului respectiv in program;

e) prin scrierea evenimentelor in fisierul de configurare al proiectului.

88 Cate instantieri multiple putem avea cand utilizam un control?

a) 1;

b) 10;

c) 100;

d) 256;

e) oricate.

89 Putem folosi controale Visual Basic in alte sisteme de operare decat Windows?

a) Da;

b) Nu;

c) Da,doar in Linux;

d) Da, doar in MSDOS;

e) Da, doar daca avem procesor pentium IV.

90 Controalele Visual Basic sunt obiecte sau evenimente?

a) obiecte;

b) evenimente;

c) proprietati ale obiectelor;

d) actiuni asociate evenimentelor;

e) nici obiecte nici evenimente.

91 Ce este un meniu in Visual Basic?

a) o lista de optiuni;

Page 225: tutoriale vba

b) un meniu windows prin care rulam un program Visual Basic;

c) un meniu prin care setam proprietati ale obiectelor;

d) un meniu windows atasat unui program Visual Basic;

e) nu exista asa ceva.

92 Care este diferenta intre un meniu Windows si unul Visual Basic?

a) meniul windows este mai complex;

b) meniul Visual Basic este mai complex;

c) diferentele sunt de actiune din partea utilizatorului;

d) diferentele sunt de forma grafica;

e) nu exsita diferente, sunt la fel.

93 Cum se folosesc meniurile?

a) nu se pot folosi;

b) se scrie codul pentru ele in limbaj Visual Basic;

c) din Menu editor;

d) se deseneaza in Paint;

e) se deseneaza in Paint si apoi se scrie codul in Visual Basic.

94 Putem construi meniuri contextuale in Visual Basic?

a) Da;

b) Nu;

c) Da,doar in Linux;

d) Da, doar in MSDOS;

e) Da, doar daca avem procesor pentium IV.

95 Putem folosi simultan intr-un formular un meniu si un meniu contextual?

a) Da;

b) Nu;

Page 226: tutoriale vba

c) Da,doar in Linux;

d) Da, doar in MSDOS;

e) Da, doar daca avem procesor pentium IV.

96 Cate meniuri putem avea pe un formular?

a) 1;

b) 10;

c) 100;

d) 256;

e) oricate.

97 Cate meniuri contextuale putem avea pe un formular?

a) 1;

b) 10;

c) 100;

d) 256;

e) oricate.

98 Putem folosi submeniuri in Visual Basic?

a) Da;

b) Nu;

c) Da,doar in Linux;

d) Da, doar in MSDOS;

e) Da, doar daca avem procesor pentium IV.

99 Cate submeniuri putem avea intr-un meniu?

a) 1;

b) 10;

c) 100;

Page 227: tutoriale vba

d) 256;

e) oricate.

100 Ce sunt submeniurile?

a) nu exista asa ceva;

b) meniuri incluse in meniu;

c) un meniu care apare la click dreapta pe formular;

d) un meniu care apare la click stanga pe formular;

e) un meniu care apare la dublu click dreapta pe formular.

 Crearea unei baze de date in VB.NET

1 comment -

Baza de date este un termen ce desemneaza un fisier structurat, creat in vederea stocarii si administrarii datelor. Administrarea datelor in baze de date vizeaza operatii precum: regasirea, sortarea, gruparea si relationarea datelor.Stocarea si administrarea datelor se realizeaza prin intermediul sistemelor de gestiune a bazelor de date SGBD. Un exemplu de astfel de SGBD este SQL Server. Mai mult, acesta este un SGBD Relational.

Teoria bazelor de date relationale specifica organizarea datelor in tabele care pot fi relationate: se stabilesc legaturi intre tabele pentru datele care fac parte din aceeasi categorie. Astfel, se reduce redundanta si creste integritatea datelor.Reducerea redundantei si cresterea integritatii datelor se realizeaza printr-un proces de normalizare a datelor.In categoria obiectelor incluse intr-o baza de date relationala face parte si tabelul. Obiectul de tip tabel contine coloane, linii, campuri (valoarea aflata la intersectia unei linii cu o coloana), tipuri de date asociate coloanelor, dimensiunea maxima a campurilor si posibilitatea de stocare a valorilor nule. De asemenea, un camp/o combinatie de campuri din structura tabelului trebuie sa aiba rol de cheie primara.Cheia primara reprezinta campul/campurilor care asigura unicitatea unei inregistrari intr-o tabela. Inregistrarea este multimea valorilor asociate campurilor definite in structura tabelului.Relationarea datelor stocate in tabele se realizeaza prin cheile primare si cheile externe. Cheia externa este campul dintr-un tabel care se leaga de cheia primara definita in alt tabel, identic din punct de vedere al tipului asociat definirii campului. Cheia externa trebuie asigure constrangerea de Referential Integrity pentru a asigura consistenta bazei de date din punctul de vedere al relatiile construire intre tabele. Astfel, intr-o tabela cheia externa trebuie sa contina doar valori ale cheii primare din tabelul cu care se stabileste o relatie.Crearea unei baze de date in Visual Studio 2008 se realizeaza astfel:

Page 228: tutoriale vba

crearea unei aplicatii pe baza sablonului Windows Forms Application; din meniul Project, se selecteaza comanda Add New Item…;

Caseta de dialog Add New Item

din caseta de dialog Add New Item, se selecteaza Local Database; se denumeste baza de date creata ca fiind Angajati;

afisarea in Visual Studio a ferestrei Server Explorer prin aplicarea unui dublu-click pe denumirea bazei de date Angajati.sdf ce a fost introdusa in structura aplicatiei si vizualizata in fereastra Solution Explorer;

din fereastra Server Explorer, se acceseaza lista de tabele incluse in baza de date prin Data Connections/Angajati.sdf/Tables;

din meniul contextual al listei de tabele, se selecteaza Create Table, afisandu-se pe ecran caseta de dialog New Table;

Caseta de dialog New Table

se introduce denumirea tabelei in campul Name si se specifica structura tabelei prin definirea campurilor si a tipurilor de date asociate acestora.

Page 229: tutoriale vba

Caseta de dialog Edit Table

Popularea cu date a unui tabel se realizeaza astfel:

din fereastra Server Explorer, se selecteaza tabelul din lista de tabele Tables; din meniu contextual asociat tabelului, se selecteaza comanda Show Table Data; se

afiseaza zona de editare a datelor in care se introduc valorile campurilor; inserarea datelor in tabel are loc automat la parasirea cursorului de mouse a inregistrarii curente.

Editarea datelor unei table in vizualizarea Show Table Data

 

Tehnologie Afaceri Referate Didactica Legislatie

Page 230: tutoriale vba

» informaticaATESTAT LA INFORMATICA - Baza de date relationala aplicata intr-o biblioteca scolara

ATESTAT LA INFORMATICA - Baza de date relationala aplicata intr-o biblioteca scolara

TEORETIC”PETRU CERCEL” TARGOVISTE

ATESTAT LA INFORMATICA

Baza de date relationala aplicata intr-o biblioteca scolara.

1.JUSTIFICAREA TEMEI

Microsoft Access 2000 este un instrument puternic pentru dezvoltarea aplicatiilor si bazelor de date. Cu ajutorul acestuia se pot crea nu numai baze de date ci si aplicatii complexe.

BiblioSoft este, asa cum sugereaza si numele, o aplicatie proiectata pentru gestionarea cartilor imprumutate dintr-o

Dezvoltarea continua a performantelor infrastructurii informatice ofera utilizatorilor posibilitati de utilizare rapida si creativa a resurselor documentare.

intermediul retelei  INTERNET, BiblioSoft se va integra in dinamica  circuitului  mondial al informatiei. Conectarea la baze de date nationale si internationale de nivel academic va asigura  astfel sincronizarea

contemporane ale cunoasterii, oferind utilizatorilor un potential remarcabil pentru studiu si cercetare. infrastructurii in tot mai multe biblioteci din cadrul sistemului de invatamant configureaza  treptat un

sistem complex de utilizare a resurselor documentare in intregul  ansamblu.

2.INTRODUCERE

Problema proiectarii unei structuri eficiente pentru datele necesare uneiprobleme este cheia intregii aplicatii.in

Proiecte

vezi toate proiectele

 PROIECT DE LECTIE MATEMATICA CLASA I Compararea numarului de elemente a doua multimi

 PROIECT DE ACTIVITATE GRUPA: mijlocie Cand/cum si de ce se intampla? - Flori de mai multe culori

 Strategia in proiectare

 PROIECTAREA SISTEMELOR INFORMATICE

Lucrari de diploma

vezi toate lucrarile de diploma

 PROIECT DE DIPLOMA BALNEOFIZIOTERAPIE - METODE DE RECUPERARE MEDICALA BALNEOFIZIPTERAPICE IN GERIATRIE

 LUCRARE DE DIPLOMA MANAGEMENT - MANAGEMENTUL CALITATII APLICAT IN DOMENIUL FABRICARII BERII. STUDIU DE CAZ - FABRICA DE BERE SEBES

 LUCRARE DE DIPLOMA AGRICULTURA - IAURTUL

 PROIECT DE DIPLOMA CHIMIE INDUSTRIALA SI INGINERIA MEDIULUI - TEHNOLOGIA ACIDULUI GLUTAMIC

Lucrari licenta

vezi toate lucrarile de licenta

 CONTABILITATEA FINANCIARA TESTE GRILA LICENTA

 PROIECT LICENTA TURISM - MONOGRAFIA COMUNEI GRADISTEA DIN JUDETUL CALARASI

 LUCRARE DE LICENTA MANAGEMENT, INGINERIE ECONOMICA IN AGRICULTURA SI DEZVOLTARE RURALA - CALITATEA SI OBTINEREA VINURILOR LA SC VIZIANU S.R.L

 LUCRARE DE LICENTA ENGLEZA - ITALIANA - La forma passiva in italiano, Diateza pasiva in limba italiana

Lucrari doctorat

Page 231: tutoriale vba

general, in aplicatiile de gestiune problema cea mai mare un o reprezinta implementarea aplicatiei de exploatare a bazei de date cat proiecatarea unei structuri care sa permita acceseul cat mai rapad la date si care sa sufere cat mai

Definirea structurilor de date necesare intr. o aplicatie este o activitate complexa care conditioneaza in mare masura necesarul de memorie, precum si viteza de prelucrare si uneori chiar efortul de proiectare si implementare.Pentru realizare ei trebuie sa se tine seama de o serie de factori cum ar fi: volumul datelor; operatiile de prelucrare, mai ales cele de actualizare; durata de viata, utilizarea eficiente a spatiului de memorare etc.

poate fi definita ca un ansamblu de date interconectate, impregna cu descrierea lor, care raspunde calitatilor de centralizare, coordonare, integrare si difuzie a informatiilor si care asigura satisfacerla tuturor necesitatilor de prelucrare ale tuturor utilizatorilor dintr-un sistem.

Sistemul de gestiune al bazei de date(SGBD) este un pachet de programe ce permite utilizatorilor sa interactioneze cu o baza de date asigurand acesteia urmatoarele caracteristici:

independenta datelor fata de programul care le gestionzaza .

nivel redus de redundatnta. Din considerente de optimizare a timpului de raspuns se acepta un anumit gard de redundante.

securitatea datelor (protectia la accesul neautorizat in vederea exagerarii sau distrugerii unor date cu carácter con fidential).

integritatea date lor (protectia la defectiuni hard sau soft)

transparenta; facilitati de utilizare a datelor fara ca uilizatorii sa cunoasca ba de date in intreaga complexitate.

limbaje de descriere si manipulare a datelor de nivel foarte inalt.

Existenta unor limbaje performante de regasire a datelor care permit exprimarea sub forma unor conversatii a unor criterio cat mai complexe de selctare a informatiei si indicarii unor reguli cat mai generale de editare a informatiilor solicitate.

facilitati multiutilizator; datele pot fi accesate si chiar gestionate din diferite noduri ale retelei de calculatoare de diferiti uilizatori.

accesibilitate; gestiunea datelor organizate in baze de date a fost preocuparea multor sepcialisti de sofá, ajungandu-se la oferirea unor

pachete de gestiune care permit gestiunea unor date foarte cimplexe in

conditia de eficiente maxima.

Un sistem de gestiune a bazelor de date (SGBD) este un mecanism al carui principiu fundamental consta, la modul cel mai general, in asazisa abstractizare a datelor stocate pe suport. Exista trei nivele de abstractizare, corespunzand celor trei modele ale datelor: fizic, conceptual si logic.

vezi toate lucrarile de doctorat

Proiecte de atestat

vezi toate proiectele de atestat

 ATESTAT INFORMATICA - CD-ROM-UL

 GENERATOR DE TESTE GRILA - Proiect atestat Visual FOX PRO

 PROIECT ATESTAT FRIZER-COAFOR-MANICHIURIST-PEDICHIURIST - VOPSITUL PARULUI

 PROIECT ABSOLVIRE ATESTAT ECONOMIE - STUDIUL ACTIVITATII ECONOMICE LA FIRMA S.C.SPORTVIC.S.R.L.

Sistemul de operare Windows XPCONCEPTUL DE DATA SI

INFORMATIESumatoare serialeDate si informatii

SISTEMUL INFORMATIC , INSTRUMENT AL

MANAGEMENTULUI ORGANIZATIILOR ECONOMICO-

SOCIALECautarea de siruri directa

Sistem informatic privind acordarea de credite persoanelor fizice

Trasaturile marketingului la inceput de secol XXI

Termeni si conditii

Contact

Creeaza si tu 

Page 232: tutoriale vba

Modelul fizic (sau intern) priveste datele asa cum sunt ele stocate pe suport si reprezinta nivelul zero al abstractizarii;

Modelul conceptual priveste datele prin semnificatia lor reala;

Modelul logic (sau extern) priveste datele prin prisma utilizatorului final.

Proiectarea aplicatiilor de baze de date implica din aceasta perspectiva doua etape initiale extrem de importante: proiectarea logica si respectiv implementarea fizica a modelului de date, iar aceste etape se vor urmari si in acest

este un SGBDR ce pune la dipozitie utilizatorilor aplicatii complexe care sa ajute la crearea si manipularea bazelor de date si la obtinerea rapoartelor pe baza acestor date

este o aplicatie Windows si de aceea interfata sa verifica toate aspectele unei interfete clasice : lucreaza cu ferstre, in mod grafic, multitasking, intr-o maniera condusa de evenimente.

Access contine mai multe categorii de obiecte : tabele, interogari, rapoarte, formulare, macro-uri si module(coduri-program).

Tabele(tables)

O baza de date Access are ca model conceptual modelul reltional.

Putem astfel regasi toate caracteristicile de baza : o tabela este o colectie de date legate intre ele, memorate sub forma de inregistrari cmpuse din unul sau mai multe campuri. Ca regula generala, un utilizator oarecare are acces la tabela de date prin intermediul unor formulare ,interogari, si/sau rapoarte. Desigur, pentru proiectantul bazei de date Access ofera posibilitati de acces direct la structura si continut

Interogarile(queries)

Sub numele de interogari sunt definite acele cereri de informatii al

utilizatorilor care necesita anumite prelucrari ale datelor memorate in tabelele bazei de date : sortari, totalizari, filtrari etc. prin intermediul lor putem combina mai multe tabele in vederea obtinerii rapoartelor sau chiar putem actualiza datele din acestea, in mod simultan, prin formulare atasate interogarilor.

Formulare(forms)

Formularul este numit si video-format sau macheta de vizualizare, introducere, etc. apare ca o fereastra Windows cu obiecte diferite (textbox, label, combo etc) legate sau nu de datele continute in tabelele bazei de date. Un formular poate fi folosit chiar ca panou de prezentare a aplicatiei sau ca panou de comanda care ii conduce pe utilizatori la formularul sau raportul dorit.

Rapoarte(reports)

Rapoartele sunt modalitati de prezentare a infomatiilor sintetice sau detaliate despre o anumita activitate. Apar sub forma de tabele, etichete saudiagrame

Page 233: tutoriale vba

Pagini Web(pages)

Paginile web sunt fisiere HTML stocate independent de containerul bazei- fisierul.mdb- dar care permit afisarea si introducerea de date prin internet. De precizat ca obiectele pages sunt introduse in Access 2000 si utilizatorii trebuie sa foloseas Internet Explorer 5(Data Access Pages nu functioneaza in cu versiuni mai

Macro-uri(macros)

Macro-instructiunile sunt extensii ale limbajului Visual Basic si permit automatizarea actiunilor asupra unor obiecte ale bazei de date. De ex un macro poate deschide/inchide un formular poate trimite date pe internet sau doar afisa mesaje adecvate.

Module program(modules)

Module program contin codul sursa al unor functii si proceduri scrise in limbajul VBA

3.DETALII DE PROGRAMARE

O aplicatie Access este o colectie de obiecte care coopereaza pentru indeplinirea unei sarcini comune.

Punctul de plecare pentru realizarea unei aplicatii o reprezinte intelegerea clara a ceea ce asteapta utilizatorii de la

Primul pas in faza de conceptie este aceea de analiza a cerintelor. Programul trebuie sa stocheze date despre:

cartile aflate in inventarul bibliotecii,

lista cartilor imprumutate catre elevi,

evidenta cititorilor pe sali de lectura,

evidenta abonatilor care nu restituit la timp cartile.

Componenta cheie a sistemului o reprezinta stabilirea entitatilor de date: Denumirea cartii / Nr inventar, Numele si prenumele abonatului etc., precum si a caracteristicilor (atrbutelor) acestora: Autorul, Editura, Numele si prenumele abonatului etc.

Dupa ce au fost determinate entitatile de date si atributele acestora, se organizeaza entitatile de date in tabele si se creaza cammpuri corespunzatoare atributelo. Fiecare tabel va contine un camp de identificare (ID) folosit drept

Primul tabel – CARTI - cuprinde cartile aflate in inventarul bibliotecii, Astfel, acesta contine urmatoarele campuri:

DENUMIREA CARTII / NR INVENTAR, camp de tip text, indexat, fara valori duplicat;

AUTORUL, camp de tip text;

EDITURA, camp de tip text;

Page 234: tutoriale vba

EDITIA, camp de tip text;

DATA ACHIZITIEI, camp de tip date/time, pentru acest camp se foloseste masca « 99/99/99.

Al III - lea tabel – DATE PRIMARE - cuprinde fisele abonatilor. Astfel, acesta contine urmatoarele campuri:

NR CRT, camp de tip autonumber, neindexat;

DATA, camp de tip date/time, pentru acest camp se foloseste masca « 99/99/99;

NUMELE, camp de tip text;

PRENUMELE, camp de tip text;

CODUL NUMERIC PERSONAL, camp de tip number, numar de zecimale = 0, atributul “Validation rule” fiind “<=9999999999999”, acesta insemnand ca acest camp nu poate avea mai mult de 13 caractere;

ADRESA, camp de tip text;

DENUMIREA CARTII / NR INVENTAR, camp de tip text, indexat, fara valori duplicat, pentru acest camp folosindu-se optiunea «Lookup» de tipi Combo Box,

DATA RETURNARII, camp de tip date/time, pentru acest camp se foloseste masca « 99/99/99;

INTARZIERE, camp de tip :”Yes/No”, in care se marcheaza daca abonatul inregistreaza o intarziere peste

 PERMISE” asociaza fiecarui abonat cate un

numar de permis, folosit ulterior la printarea a doua tipuri de rapoarte: permis pentru unul sau mai multi cititori.

Al IV – lea tabel “SALI DE LECTURA” isi gaseste utilitatea in emiterea de rapoarte avand drept criterii de selectie “Sala de lectura » cu valori posibile « 1 » si « 2 », selectate dintr-un combo box cu valori predefinite si perioada de lecturare.

Urmatoarea etapa in realizarea aplicatiei BiblioSoft este aceea de creare a relatiilor intre tabele. Astfel, intre acestea se creaza o legatura pentru ca utilizatorii sa poata vedea atributele cartiloe aflate in inventarul bibliotecii. Relatia dintre tabele este una de tipul ”unul la mai multi”. Aceaste se realizeaza folosind optiunea « Relationship » din

», prin tragerea campului din tabelul primar in campul corespondent din tabelul asociat, in cazul nostru campul “DENUMIREA CARTII / NR INVENTAR”.

Alte relatii intre tabele se stabilesc intre:« PERMISE » SI « DATE PRIMARE », relatia stabilita fiind una de tip la mai multi »;

SALI DE LECTURA » SI « DATE PRIMARE », relatia stabilita fiind una de tip « unul la mai multi »;

Scopul pentru care se creaza si foloseste o baza de date consta in extragerea rapida a datelor . Interogarea (query) este o definitie a datelor pe care vreti sa le regasiti: ce campuri, din care tabele, corespunzator caror criterii, in ce

Page 235: tutoriale vba

Interogarile pot afisa simultan date din mai multe tabele.In cazul in care doua tabele sunt implicate intr-o relatie de unul la mai multi, interogare are in mod normal cate un rand pentru fiecare inregistrare din patrea « mai multi », iar valorile din partea « unul » a relatiei sunt repetate pentru fiecare rand.

Fereastra Query are trei moduri de afisare: modul Design, in care se creeaza definitia interogarii, modul Datasheet, in care se pot pot vedea rezultatele interogarii si modul SQL pentru un nivel mai profund.

Pentru creearea unei interogari noi se selecteaza eticheta Queries in fereastra Database si se execua click pe New.

Optiunea Query deschide o fereastra Query Design precum si fereastra Sshow Tables. Se executa dublu-clic pe tabelele CARTI si DATE PRIMARE.

In continuare campurile implicate in interogare sunt adaugate grilei de iesire printr-un dublu-clic pe campurile vizate din oricare dintre cele doua tabele. Tinand cont de faptul ca in tabelul DATE PRIMARE EXISTA doua campuri distincte NUMELE si PRENUMELE si avand in vedere ca dorim emiterea unui raport sortata dupa acest criteriu la realizarea interogarii, am introdus un camp nou format din campurile de mai sus, folosind functia « & », expresia fiind urmatoarea:

[DATE PRIMARE]![NUMELE] & ' ' & [DATE PRIMARE]![PRENUMELE]

O alta interogare folosita este Query2, care are criteriul « [Forms]![PERMISE]![NR PERMIS] », aplicat campului » din tabelul « PERMISE », din formularul « PERMISE ».

Interogarea QUERY3 este creata in scopul emiterii raportului de premise eliberate pentru toti abonatii.

Interogarea QUERY4 foloseste urmatoarele criterii de selectie:

>=[Forms]![SALI DE LECTURA]![Combo19] And <=[Forms]![SALI DE LECTURA]![Combo21], valori introduse in cadrul formularului « SALI DE LECTURA »;

Between [Forms]![SALI DE LECTURA]![Text45] And [Forms]![SALI DE LECTURA]![Text47], valori introduse in cadrul formularului « SALI DE LECTURA ».

Interogarea QUERY5 realizeaza selectia inregistrarilor din cadrul

coloanei “ZILE IMPRUMUT” care au valoarea > 30, respective afiseaza abonatii care au depasit termenul de 30 zile de la data imprumutului.

Pentru realizarea rapoartelor metode pentru tipuri de sectiuni si controale: Toolbox, Field List si Properties.

Un tip de raport utilizat in aceasta lucrare, obtinut prin metoda Wizard, prezinta istoricul cartilor imprumutate catre abonati, primul criteriu de sortare fiind campul NR CRT, iar cel de al doilea data eliberarii cartilor, pe baza ascestui ultim criteriu facandu-se si gruparea..

Raportul RAPORT este proiectat intr-o configuratie tabelar in modul Continuous Form. Pe langa sectiunea Details acest raport contine sectiunile antet si subsol de raport.

Campurile utilizate la emiterea acestui raport sunt exact campurile continute de interogarea QUERY1.

Page 236: tutoriale vba

raportului este realizata de o macrocomanda Macro3. O comanda macro este o secventa de actiuni programata sa desfasoare o comanda.Actiunile se selecteaza dintr-o lista derulanta de unde se seteaza si detaliile asupra obiectelor implicate de operatia respectiva.

Comenzile macro permit realizarea sarcinilor repetitive mai usor si mai repede. Prin asocierea unei comenzi macro cu un buton, unei apasari de tasta sau unui element de meniu se poata imbunatati interfata aplicatiei. O comanda macro poate fi de asemenea asociata unui eveniment, de exemplu emiterea unui raport.

Pentru realizarea comenzii Macro3 s-a selectat sectiunea Macro din fereastra Database si apoi executand clic pe

Actiunie selectate au fost:

Minimeze, minimizarea formularului curent « INTROCUCERE DATE »

OpenReport, cu argumentele de deschidere in modul Print Preview a raportului Raoprt.

Pe langa aceasta comanda macro, in cadrul aplicatiei BiblioSoft au mai fost create si urmatoarele comenzi:

Autoexec, aceasta comanda se executa odata cu deschiderea aplicatiei, cu actiunea de a deschide Formularul INTRODUCERE DATE;

Macro1, se executa la evenimentul « OnClick » executat din formularul « LISTA CARTI », butonul », actiunile executate fiind salvarea datelor din tabelul « CARTI », inchiderea formularului “LISTA

CARTI”, deschiderea formularului « INTRODUCERE DATE »;

Macro2, se executa la evenimentul « OnClick » executat din formularul « INTRODUCERE DATE », butonul INTRODUCERE CARTE NOUA », actiunile executate fiind minimizarea formularului « INTRODUCERE

» si deschiderea formularului « LISTA CARTI »;

Formularele sunt ferestrele primare folosite pentru introducerea si afisarea datelor in ACCESS 2000. Un formular poate fi afisat in trei moduri diferite:

Modul Design care este utilizat pentru a schimba prezentarea si proprietatile unui formular, sau pentru a modifica controalele dintr-un formular.

Modul Datasheet este similar, cel putin in aparenta, cu afisarea directa a tabelului sau a interogarii;

Modul Form reprezinta modul de afisare normal al unui formular in curs de utilizare.

In vederea culegerii datelor referitoare la fisele de abonati (data imprumutarii cartii, numele celui care a imprumutat cartea, adreea, denumirea cartii etc. s-a creat formularul “INTRODUCERE DATE”.Pentru crearea formularului s-a procedat in felul urmator s-a ales eticheta Form din fereastra Database, s-a executat clic pa New, folosindu-se optiunea Form Wizard, formularul folosit avand asezarea in pagina Columnar (asezare in coloana);

Pentru a adauga controale se executa clic pe pictograma ToolBox de pe bara de instrumente. In acest formular am introdus urmatoarele butoane:

Page 237: tutoriale vba

butonul “INTRODUC CARTE NOUA” - la evenimentul « OnClick » actioneaza comanda de tip macro

butonul “RAPORT” « OnClick » - la evenimentul « OnClick » actioneaza comanda de tip macro Macro3;

LISTA CARTI” este un formular cu ajutorul caruia se introduc cartile intrate in gestiunea bibliotecii. Campurile afisate in acest formular sunt cele din tabelul « CARTI ».

Acest formular executa mai multe comenzi prin intermediul urmatoarelor butoane:

butonul “ADAUG CARTE” - la evenimentul « OnClick » pregateste acest formular in vederea adaugarii unei noi inregistrari in tabelul « CARTI »;

butonul “SALVEZ” - la evenimentul « OnClick » salveaza noua inregistrare anterior introdusa;

butonul « CAUT » - la evenimentul « OnClick » incepe procedura de cautare in oricare din campurile din tabelul « CARTI »;

butonul « INCHID » - la evenimentul « OnClick » actioneaza comanda de tip macro Macro1;

butonul « PERMISE » afiseaza pe ecran formularul « PERMISE » care permite afisarea la ecran a doua rapoarte : permise pentru inregistrarea curenta si permise pentru toti abonatii, dupa caz;

butonul « SALI DE LECTURA » afiseaza pe ecran formularul « SALI DE LECTURA » care permite afisarea la ecran a raportului de afisare a utilizarii salilor de lectura in functie de criteriile de selectie afisate in formular;

butonul « ABONATI INTARZIATI » permite afisarea raportului in modul DesignView a raportului ABONATI INTARZIATI ».

Fisierul rezultat are extensia mbd. Acest fisier se poate transforma

intr-un fisier cu extensia mde.

4.LISTAREA PROGRAMULUI

CAPTURI DE ECRAN, MODELE DE RAPOARTE

CARTI »

Page 238: tutoriale vba

B. TABELUL “DATE PRIMARE”

C. INTEROGAREA “QUERY1”, LEGATURA INTRE TABELE DE TIPUL “UNUL LA MAI MULTI”

 RAPORT1 »

Page 239: tutoriale vba

E. COMANDA DE MACRO « MACRO1 »

F. COMANDA DE MACRO « MACRO2 »

Page 240: tutoriale vba

G. COMANDA DE MACRO « MACRO3 »

H. FORMULARUL “INTRODUCERE DATE”, PREZENTAT IN DESIGN VIEW, FEREASTRA DE PROPRIETATI A BUTONULEI CU ETICHETA “RAPORT”;

Page 241: tutoriale vba

I. FORMULARUL “INTRODUCERE DATE”, PREZENTAT IN PREVIEW – MODUL DE CULEGERE A

J. FORMULARUL “INTRODUCERE CARTI”, PREZENTAT IN PREVIEW – MODUL DE CULEGERE A

Page 242: tutoriale vba

K. FORMULARUL “SALI DE LECTURA », PREZENTAT IN PREVIEW – MODUL DE CULEGERE A

L. FORMULARUL « PERMISE », PREZENTAT IN PREVIEW – MODUL DE CULEGERE A DATELOR;

Page 243: tutoriale vba

M. DATA ACCESS PAGE PREZENTAT IN MODUL PREVIEW – MODUL DE VIZUALIZARE A DATELOR

Page 244: tutoriale vba

 ABONATI INTARZIATI »

Acest proiect este foarte util in orice biblioteca scolara.Baza de date creata permite accesarea cu usurinta a tuturor datelor referitoare la cartile din biblioteca.

6.BIBLIOGRAFIE

Access 2000 implementarea bazelor de date, Kovacs Sandor

Lucrarea prezinta elementele de baza ale implementarii bazelor de date cu Microsoft Access 2000, cel mai popular si mai modern program de gestiune a bazelor de date relationale care ruleaza sub sistemul de operare Windows (95, NT, 98, 2000, ME, XP): interfata aplicatiei, crearea si gestiunea bazelor de date, tabele, tipuri de relatii, interogari, formulare, rapoarte, pagini de acces la date, limbajul SQL.

Page 245: tutoriale vba

Baze de date - Microsoft Access 2000, Pavel Nastase Florin Mihai

Volumul se adreseaza atat utilizatorilor si programatorilor incepatori, cat si celor care au deja o baza de cunostinte, dar doresc sa si le imbogateasca sau actualizeze. Abordarea pas cu pas a caracteristicilor Access 2000 insotita de explicarea exhaustiva a conceptelor asociate bazelor de date, prezentarea notiunilor de programare proprii limbajelor VBA si SQL confera lucrarii dubla calitate de curs practic si manual complet.

tehnologii asistate de calculator-varianta Access(manual clasa a XII-a) : Autori :-MARIANA PANTIRU, IONUT PANTIRU, IRINA-IOANA PANTIRU.

Copyright © 2013 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop

educational. Share to PrinteazaAddThis

 

 Structuri si elemente de programarecalculatoare

+ Font mai mare | - Font mai mic

Structuri si elemente de programare

DOCUMENTE SIMILARE

Share on print Share on facebook Share on twitter Share on email More Sharing Services 0

TEHNICI MODERNE DE REALIZARE A PORTRETULUI ROBOT ATESTAT LA INFORMATICǍ TITLUL LUCRARII HTML - TIRGU NEAMT - LUCRARE PENTRU ATESTAREA COMPETENTELOR PROFESIONALE Codificarea informatiei in calculatoarele numerice Ghid pentru calculatoare - Prelucrarea si stocarea informatiilor, sursa, placa de baza etc Copierea entitatilor si realizarea de retele - 3D studiomax Intretinerea fisierelor de control Oracle9I AUDITUL APLICATIILOR Microsoft Project Prezentare generala Meniul principal - B-Plan Definirea virusilor informatici

TERMENI importanti pentru acest document

structuri repetitive decizionale : : se calculeaza si returneaza o lista cu elemente de forma Nume mediegen in java : : structuri in programare :

Page 246: tutoriale vba

Programarea computerelor reprezinta un proces din cadrul ingineriei software1[1] prin care, in baza unei documentatii riguros elaborate, se scrie, intr-un limbaj specific numit limbaj de programare, functionalitatea unui program. Programarea presupune pe de o parte stapanirea unui anumit limbaj de programare iar pe de alta parte intelegerea unui ansamblu de tehnici de programare deoarece majoritatea sarcinilor implementate intr-un program se reduc la algoritmi si tehnici de programare foarte bine cunoscute si studiate. In cadrul acestui capitol vom aborda detalii ale programarii facand referinta directa la structura limbajului de programare Visual Basic. Ne-am decis sa abordam acest limbaj de programare deoarece spre deosebire de alte medii de dezvoltare a aplicatiilor, Visual Basic este foarte usor de invatat chiar si de catre nespecilisti, carora le ofera posibilitatea realizarii unor aplicatii profesionale. In plus, intentia noastra este aceea de a dezvolta aceasta latura a programarii in stiintele sociale prin lucrari viitoare mult mai detaliate in care sa abordam aplicatii specifice dezvoltate prin intermediul acestui limbaj. Totusi, structurile si elementele informationale de baza vor fi tratate folosind standardul ANSII C, standard de referinta in programare.

1.1               Structura generala a unei aplicatii

Un mediu vizual de programare cum este Visual Basic va permite sa scrieti aplicatii la fel de usor cum desenati sau cum scrieti un text. Asemena medii, numite si IDE-uri (Integrated Development Environment) poseda un set de instrumente foarte puternice cum ar fi butoane, casete de text, liste derulante, casete de bifare, casete de optiuni si asa mai departe care pot fi pozitionate pe formular printr-o simpla tragere cu mouse-ul. Un asemenea obiect dispus pe un formular nu face insa nimic. Acestui obiect trebuie sa i se asocieze un bloc de cod care sa descrie comportamentul obiectului respectiv. Ulterior, blocul de cod urmeaza a fi testat in vederea sesizarii si tratarii erorilor care ar putea sa apara. In concluzie, putem identifica trei etape in procesul de elaborare al programelor:

1.      Crearea elementelor vizuale;

2.      Scrierea codului care sa descrie comportamenul elementelor vizuale:

3.      Testarea si depanarea codului

In Visual Basic, codul este stocat in module de cod. Acest limbaj de programare permite existenta a 3 categorii de module de cod: formular, standard si clasa.

Modulele formular reprezinta baza aplicatiilor si contin proceduri care trateaza evenimentele, proceduri generale, declaratii de variabile si constante, tipuri si proceduri externe. Practic orice fereastra vizibila impreuna cu toate elementele vizuale pe care le contine este cuprinsa intr-un modul de tip formular.

Modulele standard se prezinta ca niste containere pentru proceduri si declaratii apelate in comun de alte module. Pot contine declaratii globale, apelabile din orice parte a aplicatiei sau la nivel de modul, pentru variabile, constante, tipuri, proceduri externe etc. Caracteristica acestor module este aceea ca blocurile de cod scrise aici pot fi reutilizate de

1 [1] Inginerie software – disciplina a ingineriei care abordeaza complexitatea si autonomia software-ului, abstractiile introduse in noile tehnologii, managementul oamenilor, al calitatii si al evolutiei programelor, crearea arhitecturii, analiza si proiectarea orientata pe obiecte, procesul de dezvoltare etc.

Page 247: tutoriale vba

orice parte a aplicatiei dumneavoastra. Spre exemplu, putem scrie rutina care calculeaza varsta unui subiect intr-un modul standard daca aceasta va fi folosita in comun de mai multe formulare.

Modulele clasa reprezinta fundamentul programarii orientate pe obiecte. Aici puteti scrie cod pentru crearea obiectelor noi in care veti include propriile proprietati si metode.

1.2               Variabile, constante si tipuri de date

Pentru a memora temporar anumite valori atunci cand programul executa calcule, sunt folosite variabilele. O variabila este o locatie cunoscuta de memorie utilizata pentru a stoca o valoare care poate fi modificata de catre program. Variabilele trebuie sa aiba un nume si trebuie declarate inainte de a fi utilizate2[2]. Declararea variabilelor se face prin stabilirea unui nume si a unui tip de date ce poate fi stocat in acea variabila. Numele unei variabile poate fi orice combinatie de litere si/sau cifre care respecta urmatoarele reguli: incepe cu o litera, nu contine caractere speciale, nu depaseste 255 de caractere, este unic in cadrul aceluiasi domeniu. Spre exemplu, putem defini o variabila care stocheaza varsta unui subiect folosind sintaxa Dim intVarsta as Integer. Prin aceasta declaratie am definit o variabila care va stoca numere intregi reprezentand varsta subiectilor. Majoritatea programatorilor definesc variabilele folosind notatia ungara. Aceasta stipuleaza ca o variabila incepe cu caractere mici si cuprinde la inceput identificatorul tipului de date dupa care numele variabilei respective.

Desi numarul maxim de caractere este de 255, sunt extrem de rare situatiile in care avem nevoie de atatea caractere. Nu ar avea nici un sens sa definim o variabila de incrementare cu numele intAceastaEsteOVariabilaDeIncrementare cand am putea spune intIncrement sau mai simplu intI. Totusi, utilzarea unei singure litere pentru definirea variabilei poate crea confuzii. Spre exemplu daca intalniti in cod o variabila numita strS, ce va spune? Mai nimic. Este mult mai util sa o denumiti strSex. Acum veti sti ca este vorba despre un sir de caractere ce stocheaza sexul subiectilor.

Domeniul unei variabile sau durata de viata a unei variabile defineste portiunea de cod care stie de existenta sa. O variabila poate avea domeniul fixat la nivelul procedurii sau la nivelul modului. In primul caz aceasta va fi recunoscuta doar in cadrul procedurii care o apeleaza (variabila locala) iar in cel de-al doilea caz, poate fi apelata in intregul modul.

Spre exemplu, in procedura urmatoare variabila intI este declarata local:

Private sub cmdButon_Click()

Dim intI as Integer

End Sub

In aceasta situatie, variabila poate fi recunoscuta doar in blocul de cod cuprins intre Private Sub si End Sub. Cu totul altfel se comporta structura urmatoare:

2 [2] Desi unele limbaje de programare printre care si Visual Basic accepta declararea automata a variabilelor in momentul crearii si utilizarii lor, se recomanda totusi declararea explicita a acestora pentru a se evita problemele ce pot sa apara.

Page 248: tutoriale vba

Public intX as Integer

Private sub cmdButon_Click()

Dim intI as Integer

End Sub

In acest caz observam ca variabila intX nu mai este declarata in interiorul procedurii si mai mult, are atributul Public ce o face disponibila intregului modul.

In unele cazuri avem nevoie de variabile globale, accesibile intregii aplicatii (tuturor modulelor din cadrul programului nostru). Definirea unor asemenea variabile se poate face in cadrul modulelor generale, folosind atributul Global.

Uneori constatam ca avem nevoie de prezenta unor valori constante care se repeta frecvent. Si ca lucrurile sa fie mai dificile, in majoritatea cazurilor aceste valori constante sunt numere greu de retinut. Este preferabil sa asociem aceste valori unor nume mai usor de retinut si care pot spori lizibilitarea codului. O astfel de asociere se poate face prin intermediul constantelor. Definirea constantelor se supune acelorasi reguli ca si definirea variabilelor. Se prefera insa denumirea constantelor cu majuscule pentru a le diferentia de variabile. Spre exemplu, daca dorim sa folosim un program distribuit in mai multe limbi, constanta pentru limba romana poate fi 8438. In loc sa folosim acest numar, putem sa-l asociem unei constante astfel:

Const LANG_ROM=8438

Din acest moment nu mai este nevoie sa specificam in cod numarul ci constanta asociata. Astfel blocurile de cod devin mult mai clare.

Am discutat ceva mai devreme despre tipuri de date. In mod general, tipurile de date deriva din cele 5 tipuri principale de date definite de standardul ANSII C si anume: char – care stocheaza caractere, int – care stocheaza numere intregi, float si double – care stocheaza numere in virgula mobila sau numere zecimale si void – care declara o functie ce nu returneaza nici o valoare sau creeaza referinte la memorie numite pointeri.

In Visual Basic tipurile de date difera ca denumire, desi toate deriva din cele 5 tipuri principale. Astfel, folosind acest limbaj de programare, putem defini:

        Tipul de date Byte – care lucreaza cu numere intregi cuprinse intre 0 si 255

        Tipul de date Integer sau Double – ce lucreaza cu numere intregi sau cu numere in virgula mobila

        Tipul de date String – care contine siruri de caractere

        Tipul de date Boolean – care contine doar valorile de adevar true/false

        Tipul de date Date – care contine date calendaristice

Page 249: tutoriale vba

        Tipul de date Object – care contine obiecte diferite si se foloseste in general in programarea orientata obiect

        Tipul de date Variant – care poate memora orice valoare definita de sistem si realizeaza conversia automata intre diferitele tipuri de date.

1.3               Structuri de control

Permit controlul desfasurarii programului si a fluxului de executie. Acestea se impart in structuri de decizie si structuri repetitive sau structuri de tip bucla.

1.3.1      Structuri decizionale

Prin intermediul acestora pot fi testate conditii si in functie de rezultatul acestor teste se pot efectua diferite operatii. Majoritatea limbajelor de programare implementeaza doua categorii de structuri decizionale: structurile de tip if then else si structurile de tip case.

O structura If.ThenElse (daca atunci) se foloseste la executia conditionata a uneia sau mai multor instructiuni. De exemplu, structura de mai jos:

If intVarsta > 100 Then

MsgBox “Subiectul nu poate fi examinat. Este prea batran”

ElseIf intVarsta < 0 Then

MsgBox “Subiectul inca nu s-a nascut. Doriti sa-l examinati?!!”

Else

MsgBox “Varsta permite examinarea psihologica”

End If

Aceasta contine mai multe instructiuni IfThen.Else care testeaza varsta unui subiect. Daca varsta acstuia este mai mare de 100 de ani ori mai mica de 0 ani, programul afiseaza un mesaj catre utilizator prin care il informeaza asupra faptului ca subiectul nu poate fi examinat psihologic. In toate celelalte cazuri (adica varsta cuprinsa intre 0 si 100 de ani) programul informaza utilizatorul ca examinarea psihologica poate fi efectuata.

In structurile de tip ifthenelse pot fi incorporate alte structuri decizionale, la diferite niveluri, vorbind astfel despre structuri decizionale imbricate.

Ca o alternativa la structura de tip IfThenElse uneori este mai comod sa folosim structura de tip Case. Aceasta permite executia selectiva a unui singur bloc de instructiuni ales dintre mai multe blocuri. Expresia este evaluata o singura data si se executa blocul corespunzator. Avem de exemplu structura:

Select Case strRol

Case Is = „Psiholog”

Page 250: tutoriale vba

MsgBox “Subiectul este psiholog”

Case Is = “Psihopedagog”

MsgBox “Subiectul este psihopedagog”

Case Is = „Pedagog”

MsgBox “Subiectul este pedagog”

Case Else

MsgBox “Nu poate fi determinata profesia subietului”

End Select

Observam ca programul evalueaza o singura data variabila strRol care stocheaza profesia unui subiect. In functie de continutul acestei variabile, programul afiseaza un anumit mesaj. Daca variabila contine orice altceva in afara de cuvintele psiholog, psihopedagog sau pedagog, programul informeaza utilizatorul ca profesia subiectului nu a putut fi determinata.

1.3.2      Structuri repetitive

Structurile repetitive permit executia repetata a uneia sau mai multor linii de cod. Cele mai multe limbaje de programare implementeaza trei tipuri de structuri repetitive: structura Do.Loop, structura For..Next si structura For Each..Next

Buclele Do.Loop se folosesc pentru a executa un bloc de instructiuni de un numar necunoscut de ori. Desi exista mai multe variante, toate evalueaza o conditie numerica pentru a sti daca va continua executia buclei sau nu. Doua dintre variantele acestei bucle sunt mai cunoscute si mai folosite: bucla cu test initial si bucla cu test final.

In cazul buclei cu test initial, programul va testa intai conditia. Daca este adevarata el va executa bucla atata timp cat conditia se pastreaza adevarata. In situatia in care conditia initiala este falsa, bucla nu va fi executata niciodata.

Do While recSubiecti.EOF

txtNume.Text = recSubiecti![Numele]

txtPrenume.Text = recSubiecti![Prenumele]

recSubiecti.MoveNext

Loop

In cazul structurii de mai sus, se evalueaza daca tabelul din baza de date care stocheaza datele subiectilor nu este la ultima inregistrare. Daca aceasta conditie este indeplinita, programul executa bucla pana cand se ajunge la sfarsitul tabelului. Astfel, bucla asigura popularea a doua casete de text cu numele si prenumele subiectului, dupa care trece la urmatorul subiect. In momentul in care tabelul ajunge la ultima inregistrare, bucla este parasita. Desigur, daca

Page 251: tutoriale vba

tabelul este gol, bucla nu se realizeaza niciodata. Desi acest fragment de cod este functional, rularea lui va va permite sa vedeti doar datele ultimului subiect. De ce? Raspunsul la aceasta intrebare va invitam sa-l gasiti singur si se constutuie intr-o modalitate de evaluare.

Bucla cu test final asigura cel putin o parcurgere a sa inainte de a putea fi abandonata. Iata aceeasi structura scrisa pentru o bucla cu test final.

Do

txtNume.Text = recSubiecti![Numele]

txtPrenume.Text = recSubiecti![Prenumele]

recSubiecti.MoveNext

Loop While recSubiecti.EOF

Se observa ca cel putin o data se va incerca popularea celor doua casete de text cu datele subiectilor. O asemenea abordare poate genera la un moment dat o eroare. Ca tema de evaluare va invitam sa identificati situatia in care programul va returna o eroare la executia acestui bloc de cod.

Buclele ForNext se utilizeaza in momentul in care se stie precis de cate ori trebuie executate instructiunile cuprinse intre declaratia For si Next. Spre deosebire de buclele DoLoop, aceste structuri repetitive utilizeaza o variabila numita contor a carei valoare creste sau descreste la fiecare trecere prin ciclu. Sa consideram urmatoarea structura repetitiva:

For intI = 1 To recTeste.RecordCount

lstTeste.AddItem recTeste![Nume]

txtNumarTeste.Text = intI

recTeste.MoveNext

Next intI

Sa analizam cum lucreaza aceasta structura. In primul rand, variabila contor intI este initializata cu valoarea 1 dupa care, daca tabelul testelor contine vreo inregistrare, bucla incepe sa fie executata pana cand se ajunge la ultima inregistrare din tabel. Daca tabelul nu contine nici o inregistrare, bucla nu este executata deoarece proprietatea RecordCount a obiectului de tip tabel returneaza 0 si prin urmare determina incheierea executiei buclei inainte ca aceasta sa inceapa. Bucla nu face altceva decat sa populeze un control de tip lista cu testele disponibile intr-un tabel si sa afiseze valoarea contorului intr-o caseta de tip text, dupa care trece la urmatoarea inregistrare. Puteti observa ca in final structura incrementeaza automat contorul.

Buclele For Each Next se aseamana foarte mult cu buclele For Next insa acestea repeta o serie de instructiuni pentru fiecare element dintr-o colectie de obiecte sau din cadrul unei matrici in loc sa repete instructiunile de un anumit numar de ori. Acest lucru este util mai ales

Page 252: tutoriale vba

in situatia in care nu stim exact cate elemente contine o colectie de obiecte. Daca luam spre exemplu structura:

Dim tdfTabele As TableDef

Dim objDb As Database

Set objDb = OpenDatabase(“C:Psihologie.mdb”)

For Each tdfTabele In objDb.TableDefs()

lstTabele.AddItem tdfTabele.Name

Next tdfTabele

Iata un exemplu ceva mai complex care include alaturi de structura repetitiva si definiri de variabile precum si creare de obiecte. Observam ca pentru inceput am definit doua variabile: una de tip tabel si alta de tip baza de date. Acestea sunt tipuri de date obiect caracteristice lucrului cu motoarele de baze de date. In continuare programul a deschis baza de date „Psihologie.mdb” prin atribuirea obiectului de tip baza de date objDb unui fisier de pe disc folosind metoda OpenDatabase. Noi nu stim inca ce tabele contine baza de date mentionata. Pentru aceasta vor stabili o structura repetitiva care sa populeze o lista cu numele tabelelor din baza de date. Asfel, pentru fiecare tabel din colectia de tabele a bazei de date, programul adauga in lista numele acelui tabel dupa care automat trece la urmatorul tabel. Simplu si eficient.

Am putea umple volume intregi cu elementele de programare, functiile si facilitatile pe care le pune la dispozitie acest mediu de dezvoltare. Scopul nostru este insa acela de a familiariza cursantul cu elementele de baza ale elaborarii programelor si nu de forma programatori. Cei interesati de acest domeniu pot consulta pentru aprofundare bibliografia recomandata sau bogata literatura de specialitate existenta pe piata.

1.4               Intrebari recapitulative si teme

1.      Care sunt etapele elaborarii unei aplicatii computerizate?

2.      Ce categorii de module contine mediul de dezvoltare Visual Basic si care sunt particularitatile acestora.

3.      Ce intelegeti prin termenul de variabila si care sunt tipurile de variabile pe care le cunoasteti?

4.      Identificati si descrieti elementele implicate in declararea unei variabile.

5.      Descrieti structura de tip Case si exemplificati printr-un bloc de cod personal.

6.      Prezentati bucla de tip DoLoop si gasiti exemple de blocuri de cod functionale.

TEMA: Se da blocul de cod:

Page 253: tutoriale vba

If strNumeSubiect = “” Then

MsgBox “Numele subiectului nu exista”

Else

Do

lstNB.AddItem recRezultate![NB]

lstNS.AddItem recRezultate![NS]

Loop While recRezultate.EOF

Ignorand definirea variabilelor si crearea obiectelor, precizati daca acest bloc de cod va functiona sau nu. In cazul in care blocul de cod nu va functiona, identificati si corectati erorile.

 

 

PROIECT BAZELE PROGRAMARII PE OBIECTEcalculatoare

+ Font mai mare | - Font mai mic

 

 

DOCUMENTE SIMILARE

Share on print Share on facebook Share on twitter Share on email More Sharing Services 0

Componentele arhitecturii ISA x86 PROIECT INGINERIA SISTEMELOR SOFTWARE Internetul - Comunicarea client - server web Limbajul algoritmic (pseudocodul) Stergerea folderelor si fisierelor CODIFICAREA DATELOR Utilizarea vederilor dinamice in administrarea bazei de date Oracle9I Proceduri. Programe. Utilitarul Norton Commander Functia comerciala

TERMENI importanti pentru acest document

: cod sursa vb6 contabilitate : operatiile care pot fii efectuate cu variabile de tip text visual basic : : comanda de derulare pe verticala in web :

Page 254: tutoriale vba

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Page 255: tutoriale vba

 

 

 

Cuprins

Partea 1. Teorie

I. Programarea pe Obiecte.Notiuni Generale……….……………………………..pag3

I.1. Obiecte.Clase.Caracteristici…………………………………………….pag3

I.2. Modele Utilizate In Dezvoltarea de Produse Software………….…….pag5

II.Limbajul VISUAL BASIC…………………………….……..………………..pag 8

III. VISUAL BASIC PRIN EXEMPLE PRACTICE…………………………………15

IV. Limbajul de Programare Visual Basic………………………………………….21

Partea 2. Aplicatii

Page 256: tutoriale vba

Partea 1. Teorie

I. Programarea pe Obiecte.Notiuni Generale

I.1. Obiecte.Clase.Caracteristici.

I.1.1. Introducere.

Limbajele de programare, tehnicile si metodele de programare au evoluat in mod spectaculos de la aparitia calculatorului si pana astazi, ca urmare a necesitatii de a raspunde la cresterea continua a complexitatii problemelor de rezolvat si deci, implicit a programelor corespunzatoare.

Atunci cand limbajele de asamblare n-au mai facut fata complexitatii crescande a programelor, a fost necesara utilizarea unor limbaje de nivel mai inalt, cunoscute sub numele de limbaje de programare de generatia I-a si a II-a, ca instrumente care sa faciliteze gestionarea acelui nivel de complexitate. Reprezentante de seama ale acestei perioade sunt limbajele FORTRAN, COBOL, ALGOL.

Odata cu cresterea dimensiunii si complexitatii proiectelor software, a devenit tot mai clar ca pentru a le putea controla este absolut necesara abstractizarea datelor si ca in acest scop programarea structurata nu mai este eficienta.

S-a impus gasirea unui nou model de prrogramare capabil sa depaseasca limitarile programarii structurate si care sa fie capabila sa realizeze abstractizarea adecvata a datelor. Asa s-au nascut limbajele bazate pe obiecte si apoi cele orientate pe obiecte. Dintre acestea cele mai raspandite sunt Ada si CLOS si mai de curand JAVA (bazate pe obiecte), respectiv Smalltalk, C++, Eiffel (orientate pe obiecte).

I.1.2. Conceptul de Obiecte.

Prin obiect intelegem o entitate din lumea reala asupra careia se poate intreprinde o actiune, sau care poate intreprinde o actiune.

Obiectul este deci un concept, o abstractiune sau un lucru, o entitate din lumea reala avand limite precise si un sens precis in contextul problemei studiate.

Un obiect este caracterizat prin 3 elemente:

o       identitate;

o       stare;

o       comportament.

Spunem despre un obiect ca are doua componente:

Page 257: tutoriale vba

o       structura infirmationala;

o       comportamentul sau operatiile care actioneaza asupra structurii.

Analizand mai atent obiectele, constatam ca acestea pot fi:

o       obiecte concrete, care exista in mod fizic;

o       obiecte conceptuale (o idee, o lege, etc.).

Comportamentul obiectelor poate fi declansat de stimuli externi sau evenimente (de exemplu: primeste o comanda, elibereaza o chitanta, repara automobilul, etc.).

Singura parte vizibila a unui obiect este constituita din operatiile (functiile) obiectului si este denumita interfata.

Orice obiect are atribute si operatii.

Atributele descriu un obiect si sunt valori ale dtelor, in timp ce operatiile (functiile) deinesc comportamentul obiectelor. Anumite metode orientate obiect propun, pentru acelasi scop, utilizarea a trei tipuri de obiecte, definite in contextul problemei si anume:

         obiecte entitate;

         obiecte de interfata;

         obiecte de control.

Arhitectura sistemelor cu obiecte se bazeaza pe clase, obiecte si interactiunea dintre ele.

Un obiect dispune de proprietati, metode si evenimente.

Proprietatile unui obiect descriu caracteristicile fizice ale acestuia. Proprietatile reprezinta atribute ale obiectelor. Obiectul este caracterizat prin proprietatile (atributele) sale: nume, dimensiune, culoare, eticheta si ale proprietatii care fac unic un obiect.

Din punct de vedere al programatorilor, un obiect reprezinta o multime de date si o serie de operatii, numite metode, care manipuleaza datele.

Obiectul se caracterizeaza prin:

         Identitate - cea care individualizeaza obiectul (spre exemplu numele lui pentru a-l distinge fata de alte obiecte);

Exemple de obiecte particulare pot fi:

         bicicleta lui Radu;

         o fereastra de la o statie de benzina;

Page 258: tutoriale vba

         un triunghi desenat pe hartie.

         Metodele obiectului - reprezinta elementele comportamentale ale obiectului atunci cand acesta este accesat prin mesaje diverse din exteriorul sau.

O operatie este o actiune pe care o efectueaza un obiect. Implementarea specifica a unei operatii de catre o anumita clasa se numeste metoda.

         Starea obiectului - este caracterizata de atributele care descriu obiectul. Fiecare atribut are un nume si o valoare asociata ca variabila de instanta. Variabila de instanta este o anumita compozitie a caracteristicilor obiectului la un moment dat (variabilele de instanta definesc proprietatile obiectului).

         Clsificarea - presupune ca obiectele care au aceeasi structura (aceleasi atribute) si acelasi comportament (aceleasi operatii) sunt regrupate in clase.

         Obiectul cu stari comportamentale asemanatoare formeaza o clasa de obiecte.

I.1.3. Conceptul de Clasa de obiecte.

O clasa de obiecte este o abstractie care descrie toate caracteristicile comune ale unui grup de obiecte si care permite crearea de noi obiecte.

Exemple de clase: Bicicleta, Fereastra, Triunghi,etc.

Clasa reprezinta un ansamblu de obiecte cu stari comportamentale asemanatoare, sau, altfel spus, o anumita categorie de obiecte ale carei proprietati si metode pot fi mostenite intr-o subclasa.

O clasa stocheaza si manipuleaza date si poate returna valori catre codul de program care utilizeaza un obiect al acelei clase.

o clasa are un identificator (un nume) si campuri membre. Se pot crea clase in cadrul unor module specifice fiecarei clase, anumite module de clasa.

Clasa este de fapt o entitate statica, avand interfata si proprietati bine determinate. Ea poate fi definita intr-un limbaj declarativ sau in mod grafic.

      Subclasa defineste comportamentul modului de realizare a obiectului derivat dintr-o clasa de baza;

      Tipul este o descriere abstracta a unui grup de entitati asemanatoare;

      Subtipul este o parte a comportamentului.

In aceasta abordare deosebit de importante sunt conceptele de identitate, polimorfism, mostenire si incapsulare.

Page 259: tutoriale vba

Identitatea semnifica faptul ca obiectele sunt entitati discrete si distincte.Fiecare obiect poseda propria sa identitate.

Polimorfismul reprezinta capacitatea unui obiect de a-si modifica forma. Polimorfismul se manifesta prin reactii diferite ale diverselor obiecte la un acelasi mesaj.

Existenta unor operatii (sau metode) diferite, cu acelasi nume, dar cu comportament diferit, se numeste polimorfism.

Exemple:

        a muta o bicicleta;

        a muta o fereastra;

        a muta un triunghi.

Mostenirea permite partajarea atributelor si operatiilor comune intre clase pastrand, in acelasi timp, diferentele. O clasa poate fi rafinata in subclase din ce in ce mai fine. Fiecare subclasa mosteneste toate proprietatile superclasei sale si aduga propriile sale proprietati.

Mostenirea reprezinta transmiterea de proprietati si metode. Msostenirea este marcata de o definire suplimentara si transmite proprietatile si metodele clasei.

Mostenirea poate fi:

o       simpla, cand o subclasa are o singura clasa parinte;

o       multipla, cand o subclasa mosteneste proprietatile si metode ale mai multor clase parinte.

Incapsularea reprezinta combinarea datelor si metodelor intr-o singura structura de date, definind totodata modul in care obiectul si restul programului pot referi date din obiect. In obiecte/clase de obiecte sunt ascunse atat structura cat si implementarea operatiilor prin procesul de incapsulare.

Incapsularea - reprezinta conceptul care defineste apartenenta unor proprietati si metode fata de un obiect. Incapsularea protejeaza obiectele de manevre eronate din afara.

I.2. Modele Utilizate In Dezvoltarea de Produse Software.

I.2.1. Generalitati privind activitatea de programare.

Programarea este practic activitatea prin care se concepe si se realizeaza programul pentru rezolvarea unei probleme, cu ajutorul calculatorului electronic.

Un program reprezinta o succesiune de instructiuni si comenzi apartinand unui/unor limbaje de programare (Pascal, Basic, C, Visual Basic, Java etc.) care conduc la solutionarea problemei formulate.

Page 260: tutoriale vba

Daca ne referim la activitatea de programare, vom identifica in cadrul acesteia, urmatoarele etape:

o       Formularea problemei - etapa in care se formuleaza efectiv problema de rezolvat, se definesc obiectivele acesteia, datele de iesire si forma lor de prezentare, se determina datele de intrare necesare si cerintele de prelucrare.

o       Eliberarea, identificarea si descrierea algoritmului de rezolvare a problemei date (sub forma de pseudocod sau schema logica). Ea presupune analiza corecta, exacta si completa a problemei formulate, pentru gasirea si apoi descrierea algoritmului ei corect de rezolvare.

o       Scrierea programului - etapa in care are loc scrierea propriu-zisa a programului, intr-un limbaj de programare ales de programator. Se obtine astfel asa numitul program sursa.

o       Testarea programului - activitate prin care se verifica sintactic si logic corectitudinea programului.

o       Realizarea, completarea si definitivarea documentatiei programului, care trebuie sa fie accesibila atat utilizatorilor, cat si specialistilor (programatori sau operatori) care vor dezvolta, completa sau intretine programul in viitor.

o       Exploatarea curenta, utilizarea si intretinerea programului, are ca obiectiv intretinerea si dezvoltarea programului, daca este necesar.

Modele utilizate in dezvoltarea programelor.

Un model este o notiune abstracta si este construit pentru a intelege problema inainte de a implementa solutia.

Cele mai utilizate modele in dezvoltarea programelor sunt:

         Modelul orientat procedural care se bazeaza pe proceduri si algoritmi;

         Modelul orientat pe obiecte, care consta intr-o colectie de obiecte ce apartin unor clase;

         Modelul orientat pe reguli (de tip If-Then);

         Modelul orientat logic in care anumite scopuri se exprima prin calcule cu predicate;

         Modelul orientat pe constrangeri (relaModelul orientat pe constrangeri (relatii de invarianta);

Cea mai mare raspandire o are modelul procedural si cel mai mare interes il reprezinta in ultimul timp modelul orientat pe obiecte.

I.2.2. Scurta prezentare a modelului procedural.

Page 261: tutoriale vba

Modelul procedural reprezinta, prin intermediul algoritmilor de prelucrare, succesiunea operatiilor elementare, in numar finit, care trebuie parcurse pentru rezolvarea unei probleme.

Modelul procedural are la baza abstractia procedurala si principiul substitutiei conform careia, la apelul unei proceduri, fiecare pozite de parametru formal din corpul acesteia, poate fi ocupata de o valoare de parametru identica din punct de vedere al tipului, sau de un nou apel la o procedura, inclusiv a procedurii in cauza (recursivitate), care reintoarce tipul corespunzator parametrului substituit.

Din limbajele de tip procedural amintim: Pascal, Cobol, Basic, C++, FoxPro.

Modulul program reprezinta o parte a unui program, compusa din mai multe instructiuni, care are un nume propriu si care rezolva o anumita functie a programului respectiv. Orice modul se caracterizeaza prin urmatoarele elemente:

         nume, necesar pentru apelare;

         o functie concreta;

         un algoritm de rezolvare;

         o interfata cu programul.

Algoritmii, odata ce au fost identificati, sunt reprezentati prin:

         sceme logice care pot fi de program sau de sistam;

         pseudocod, un limbaj formalizat, care contine enunturi standard si nestandard si care nu are reguli atat de stricte precum limbajele de programare;

         tabelele de decizii;

         diagrame de tip arbore, daca avem de a face cu o proiectare modularizata;

         limbaje de programare.

I.2.3. Modularitatea.

Clasele si obiectele obtinute in urma abstractizarii si incapsularii trebuie grupate si apoi stocate intr-o forma fizica, denumita modul.

Modulele pot fi privite xa si containere fizice in care declaram clasele si obiectele rezultate in urma proiectarii la nivel logic. Modulele formeaza asadar arhitectura fizica a programului.

Modularizarea consta in divizarea programului intr-un numar de module care pot fi compilate separat, dar acre sunt conectate (cuplate) intre ele.

Reguli Generale de Modularizare.

Page 262: tutoriale vba

a)      Structura fiecarui modul trebuie sa fie suficient de simpla pentru a putea fi complet inteleasa.

b)      Implementarea unui modul trebuie sa depinda doar de interfetele altor module, adica trebuie sa fie posibila modificarea implementarii unui modul fara a avea cunostiinte despre implementarea altor module si fara a afecta comportarea celorlalte module.

c)      Detaliile sistemului care se presupune ca se vor modifica independent vor fi plasate in module diferite.

d)      Singurele legaturi intre module vor fi acelea a caror modificare este improbabila.

e)      Orice structura de date este incapsulata intr-un modul; ea poate fi adresata direct din interiorul modulului dar nu poate fi accesata din afara modulului decat prin intermediul obiectelor si claselor continute in acel modul.

Elementul fizic de constructie in limbajele bazate/orientate pe obiecte este modulul care contine o colectie de clase si obiecte.

Un program orientat pe obiecte are putine date globale, intrucat datele si operatiile sunt unite intr-un mod nou care face ca blocurile logice fundamentale ale sistemului sa nu mai fie algoritmii, ci clasele si obiectele

I.2.4. Programarea Orientata pr Obiecte. Concepte de Baza.

Proiectarea orientata pe obiecte este o metoda de implementare in care programele sunt organizate ca si colectii de obiecte ce coopereaza intre ele, fiecare obiect reprezentand instanta unei clase; fiecare clasa apartine unei ierarhii de clase, clasele fiind unite prin relatii de mostenire.

Aceasta definitie cuprinde trei parti importante, si anume:

      obiectele si nu algoritmii sunt blocurile logice fundamentale;

      fiecare obiect este o instanta a unei clase;

      clasele sunt legate intre ele prin relatii de mostenire.

Limbaj de Programare Bazat pe Obiecte. Programare cu Tipuri de Dtae Abstracte.

Un limbaj de programare care ofera suport pentru utilizarea calselor si a obiectelor, dar care nu are implementat mecanismul relatiilor de mostenire intre clase este un limbaj de programare bazat pe obiecte.

Concepte Fundamentale in Programarea pe Obiecte.

Programarea orientata spre obiecte reprezinta un stil de programare nou, care utilizeaza concepte si constructii noi, modalitati noi de structurare a datelor, de tratare a colectiilor de date si chiar de programare. Ea pune in centrul atentiei obictele, care se definesc ca unitati de

Page 263: tutoriale vba

program independente, care cuprind laolalta datele si procedurile ce actioneaza asupra obiectelor.

Principalele concepte care stau la baza programarii orientate pe obiecte sunt:

      Abstractizarea;

      Incapsularea;

      Modularizarea;

      Ierarhizarea.

Abstractizarea este una din caile fundamentale prin care noi, oamenii, ajungem sa intelegem si sa cuprindem complexitatea. In contextul programarii pe obiecte, Booch ne ofera urmatoarea definitie a abstractiunii:

O abstractiune exprima toate caracteristicile esentiale ale unui obiect, care fac ca acesta sa se distinga de alte obiecte; abstractiunea ofera o definire precisa a granitelor conceptuale ale obiectului, din perspectiva unui privitor extern.

In procesul de abstractizare atentia este indreptata exclusiv spre aspectul exterior al obiectului, adica spre comportarea lui, ignorand implementarea acestei comportari.

Se poate spune ca abstractizarea consta in focalizarea pe aspectele esentiale ale unei entitati.

Incapsularea consta in separarea aspectelor externe ale unui obiect, care sunt accesibile altor obiecte, de aspectele interne ale obiectului, care sunt ascunse celorlalte obiecte. Utilizatorul obiectului poate accesa doar anumite atribute si operatii, numite publice, in timp ce alte atribute si operatii ii raman inaccesibile (acestea se numesc private).

Incapsularea este un concept complementar abstractizarii. Daca rezultatul operatiei de abstractizare pentru un anumit obiect este identificarea protocolului sau, atunci incapsularea are de a face cu selectarea unei implementari si tratarea acesteia ca pe un secret al respectivei abstractizari. Prin urmare, incapsularea este procesul in care are loc ascunderea implementarii fata de majoritatea obiectelor-client.

Ierarhizarea reprezinta o ordonare a abstractiunilor.

Cele mai importante ierarhii de clase in paradigma obiectuala sunt:

      Ierarhia de clase (relatie de tip 'is a');

      Ierarhia de obiecte (relatie de tip 'part of');

      Mostenirea (ierarhia de clase).

Page 264: tutoriale vba

Mostenirea defineste o relatie intre clase in care o clasa impartaseste structura si comportarea definita in una sau mai multe clase (dupa caz vorbim de mostenire simpla sau multipla).

Agregarea (ierarhia de obiecte).

Majoritatea metodelor orientate obiect utilizeaza reguli sau operatii semantice cum sunt :

      generalizarea / specializarea;

      agregarea / descompunerea

combinate cu mostenirea si incapsularea.

Agregarea este relatia intre doua obiecte in care unul dintre obiecte apartine celuilalt obiect. Agregarea reda apartenta unui obiect la un alt obiect.

Evenimentul - este actiunea savarsita de sistem atunci cand operatorul solicita executarea unei comenzi. Evenimentele pot fi declansate interactiv sau programat.

1.2.5. Modele ale proiectarii si programarii pe obiecte.

Modelul obiectual - este descrierea structurii statice a obiectelor, claselor de obiecte, a operatiilor si atributelor precum si a legarturilor si a relatiilor dintre ele. O diagrama de obiecte este un graf ale carui noduri sunt obiectele si ale carui arce sunt relatiile dintre obiecte.

Modelul dinamic - descrie interactiunea dintre obiecte si este focalizat pe aspecte ce se schimba in timp, deoarece orice obiect are un ciclu de viata cu un punct de pornire si unul de sfarsit. O diagrama de stare este un graf ale carui noduri sunt starile si ale carui arce sunt tranzactiile intre stari, cauzatre de evenimente externe.

Modelul functional - descrie transformarile valorilor datelor precizand sursa, transformarile si destinatia lor. O diagrama de flux de date este un graf ale carui noduri sunt procesele si ale carui arce sunt fluxurile de date.

Modalitatea de coordonare si interactiune intre obiecte este transmiterea mesajelor. Trimiterea unui mesaj are ca scop activarea unei metode (operatii asociate cu sablonul uni mesaj) a obiectului receptor cu argumentele continute in mesaj.

II. Limbajul VISUAL BASIC

2.1. Prezentare generala.

Visual Basic reprezinta o varianta si totodata o dezvoltare a vechiului limbaj de programare Basic (Begginer's All-Purpose Symbolic Instructions Code-codul instructiunilor simbolice de uz general pentru incepatori) si a fost lansat pe piata de firma MicroSoft in anul 1991. MicroSoft specifica termenul 'Visual' deoarece limbajul permite proiectarea unei interfete grafice intre program si utilizator (Grafic User Interfaces - GUI) cu ajutorul unor formulare (forme). Acestea contin elemente visuale numite obiecte sau controale, cum ar fi

Page 265: tutoriale vba

butoane de comanda, casete de validare, casete de dialog, casete text, etc., care prmit utilizatorilor sa obtina, sa afiseze, sa inscrie date, imagini, etc.

Visual Basic este un mediu integrat de dezvoltare, deoarece integhreaza functii de proiectare, editare de text, compilare si depanare in cadrul unui mediu comun.

Visual Basic este un limbaj interactiv, adica implementeaza fiecare instructiune pe masura ce e introdusa de la tastatura, compiland partial codul si semnaland orice eroare sintactica, daca instructiunea este corecta, executand-o.

Visual Basic stocheaza fisierele sursa ca fisiere ASCII ale caror nume de fisier contin una din urmatoarele patru tipuri de extensie:

      .frm pentru forme - O forma asigura programului mijloacele visuale de prezentare a datelor;

      .bas pentru module cod sursa - Un modul stocheaza secvente de cod care nu necesita o forma;

      .cls pentru module clase - Un modul clasa este un tip special de modul cod care contine o singura clasa si obiectele asociate acesteia;

      .res pentru resurse - Un fisier de resurse contine imaginile si textele necesare programului, precum si alte informatii orientate pe prezentare.

Visual Basic lucreaza cu mai multe tipuri de proiecte (standard.exe, ActiveX.exe, ActiveX.DLL, ActiveX Control etc) fiecare avand particularitatile sale.

Incercand o prezentare succinta a limbajului de programare Visual Basic, acesta se poate caracteriza astfel:

      Cel mai rapid si cel mai simplu limbaj de dezvoltare a unei aplicatii sub Windows;

      Poate realiza tot ce poate fi realizat cu oricare alt limbaj de programare sub Windows;

      Este un mediu integrat de dezvoltare deoarece integreaza functiile de proiectare, editare de text, compilare si depanare in cadrul unui mediu comun;

      Visual Basic abordeaza interactiv dezvoltarea codului nefacand distinctie intre scrierea, compilarea si testarea codului;

      Combina elemente de programare orientata pe obiecte cu elemente de programare orientata pe evenimente;

      Poate crea baze de date pentru cele mai raspandite tipuri de date: Microsof Access, Microsoft FoxPro, dBase, Paradox, Microsoft SQL Server, etc.;

      Permite integrarea functiilor furnizate de catre alte aplicatii (de ex.:Microsoft Word, Excel, etc.);

Page 266: tutoriale vba

      Permite accesul la documente si aplicatii din internet sau intranet sau crearea unor aplicatii de tip Internet Server;

      Detine toate documentele necesare crearii unor aplicatii de uz personal sau pentru grupuri de lucru.

2.2. Mediul integrat de dezvoltare Visual Basic (IDE)

2.2.1. Lansarea in executie.

Lansarea in executie a programului Visual Basic se poate face in mai multe moduri:

         Se activeaza butonul START de pe bara de task-uri;

         Se activeaza optiunea PROGRAMS si, in lista de optiuni se executa click pe Microsoft Visual Studio 6.0 si de acolo Microsoft Visual Basic 6.0

Mediul de programare Visual Basic (IDE - Integrated Development Environment) este un ansamblu de meniuri, bare de instrumente si ferestre cu ajutorul carora programatorul poate proiecta si crea aplicatii in Visual Basic.

2.2.2. Mediul de lucru Visual Basic.

Mediul de lucru Visual Basic poate contine:

Bara de meniuri contine maniurile standard ale uni meniu Windows: File, Edit, View, Windows si Help, precum si meniuri care cuprind comenzi specifice programarii in Visual Basic, precum: Project, Format, Debug.

Toolbar (bara de instrumente) permitre accesul rapid la comenzile cele mai des folosite in mediul Windows: deschidere fisier, salvare, tiparire, copiere, mutare, etc. La acestea se pot adauga (sau elimina) si alte bare cu instrumente cu ajutorul comenzii Toolbar din meniul View.

Toolbox (cutia de instrumente) situatx de regula in partea din stanga a ecranului, contine un set de pictograme corespnzatoare obiectelor care pot fi folosite in timpul proiectarii aplicatiilor cum ar fi: Label, TextBox, CommandButton, ComboBox, etc., si introduse in formular (forma). Unii programatori clasifica aceste controale in trei grupe:

o       Intrinseci (care apar in Toolbox atuci cand se porneste prima data Visual Basic);

o       Externe (controale ActiveX, care pot fi adaugate de la ToolBox);

o       Inserabile (controale facute din aplicatii externe, precum MS Excel).

Meniuri contextuale contin comenzi rapide pentru actiuni efectuate in mod frecvent. Meniurile contextuale se deschid executand click dreapta pe obiectul respectiv. Ele contin comenzi ce pot fi utilizate la locul si in momentul respectiv.

Fereastra Project Properties serveste la stabilirea unor informatii despre proiect.

Page 267: tutoriale vba

In sectiunea General se pot stabili:

         Project Type, deci tipul proiectului (.exe, .dll, .ocx, etc.);

         Startup Object, deci care este 'forma' cu care incepe aplicatia;

         Project Name, defineste numele fisierului help aferent proiectului;

         Project Description pentru o scurta descriere a proiectului.

In sectiunea Make se pot stabili informatii cu privire la versiunea aplicatiei, numarul versiunii, titlul, pictograma asociata acesteia.

Sectiunea Compile stabileste optiunile de compilare ale proiectului: p-Code sau Native Code.

Fereastra 'Project Explorer' faciliteaza lucrul cu diferitele componente ale proiectului, afisate sub forma unei liste arborescente. Fiecare componenta are un nume si un nume de fisier(acestea apar intre paranteze). Exista sapte tipuri de componente ce pot aparea aici:

        Projects (.VBP)

        Forms (.FRM)

        Modules (.BAS)

        Class Modules (.CLS)

        User Controls (.OCX)

        User Documents (.DOB)

        Property Pages (.PAG)

Fereastra Project Browser afiseaza informatii despre prototipurile tuturor functiilor, procedurilor, care se afla in fisierele biblioteca (dll, olb, ocx) legate la proiect. In fereastra Classes se poate vedea ce contine biblioteca: clase, module, enumerari, tipuri definite de utilizator, iar in fereastra din partea dreapta continutul fiecarei dintre acestea.

Fereastra 'Properties Window' (fereastra de proprietati) afiseaza toate proprietatile formei/controlului selectat si valorile acestora. Fiecare proprietate are un nume si o valoare setata fie de Visual Basic, fie de programator. In denumirea obiectelor se foloseste un prefix din trei litere mici, reprezentand tipul obiectului:

Prefix   Tipul obiectului

cbo Combo boxchk Check boxcmd Command buttonfrm Formimg Image

Page 268: tutoriale vba

lbl Labellst List boxmnu Menupic Picture boxtxt   Text box

O serie de proprietati sunt comune mai multor controale Visual Basic, cum sunt:

Proprietatea ExplicatiaAlignment textul de pe control poate fi aliniat la stanga, la centru sau la

dreapta

Backcolor culoarea fundalului

Borderstyle tipul bordurii din jurul controlului

Caption textul afisat de pe control

Enabled Daca are valoarea logica 'true', utilizatorul poate interactiona cu controlul; daca are valoarea 'false', controlul nu raspunde la actiunea utilizatorului

Font determinx fontul, marimea lui si stilul textului afisat pe control

Forecolor Determina culoarea textului de pe un control

Height inaltimea controlului (in twips)

Left distanta de la marginea din stanga a formei (ecranului)

MousePointer determina forma cursorului mouse-ului cand acesta trece peste controlul respectiv

(Name) numele controlului

ToolTipText textul care apare cand utilizatorul tine cursorul mouse-ului peste controlul respectiv

Top distanta de la marginea de sus a formei (ecranului)

Visible determinx daca controlul este vizibil sau nu

Width latimea controlului

Fereastra Form Designer afiseaza un formular pe care programatorul in poate personaliza inserand controale, grafica si imagini, proiectand astfel intefata aplicatiei cu

Page 269: tutoriale vba

utilizatorul. Fiecare formular (forma) din cadrul proiectului are propria fereastra de tip Designer, aceasta fiind practic fereastra de proiectare a fiecarui formular.

Fereastra 'Form-Layout' afiseaza o schita in miniatura a formei, reprezentand locatia de pe un ecran unde aceasta va aparea in timpul executiei programului. Din aceasta fereastra se poate stabili, de asemenea, locatia initiala a formei, prin mutarea schitei.

Fereasra Code Editor este folosita ca un editor de texte pentru a introduce codul procedurilor aplicatiei. Pentru fiecare forma se poate deschide o fereastra de cod (code window). Fereastra ne pune la dispozitie un procesor de texte specializat, cu numeroase facilitati pentru scrierea de cod in Visual Basic.

Fereastra References afiseaza diferitele legaturi ce se pot stabili cu alte componente soft inregistrate in sistem. Pentru a se putea folosi in cadrul aplicatiei proceduri sau obiecte ce se gasesc in diferite fisiere DLL sau OCX trebuie sa se stabileasca o legatura cu acestea.

In fereastra References sunt afisate toate legaturile spre bibliotecile de prototipuri care au fost inregistrate in sistem. Daca dorim sa legam la proiect un fisier care nu este in lista, vom folosi butonul Browse.

Fereastra Components, cu ajutorul ei se pot introduce in proiect legaturi cu diferite controale (fisiere .OCX). Se aseamana cu fereastra References numai ca se pot stabili legaturi doar cu controalele ActivX inregistrate in sistem.

Ferestrele Immediate, Locals si Watch sunt utilizate de regula in faza de testare si corectare a programului de erori. Sunt disponibile numai in timpul executiei programului.

Fereastra Options este importanta pentru a stabili diverse optiuni ale IDE. Cele mai utilizate optiuni sunt:

        Optiunea Auto Syntax Check cere compilatorului V.B. sa verifice corectitudinea sintaxei comenzilor in timp ce se scrie codul si sa atentioneze asupra eventualelor greseli;

        Optiunea Require Variable Declaration stabileste daca trebuie sa se declare explicit variabilele;

        Optiunea Prompt for project din sectiunea Environment permite alegerea unui sablon de proiect care se foloseste pentru un proiect nou;

        Optiunea Create default stabileste un sablon de proiect care se va incarca automat de cate ori se doreste sa se creeze un proiect nou;

        In sectiunea Advanced se poate alege unul din cele doua stiluri ale IDE: SDI-single document interface si MDI-multiple document interface. Alegand SDI toate ferestrele din IDE pot fi mutate oriunde pe ecran; alegand MDI toate ferestrele sunt continute intr-o singura fereastra parinte.

2.3. Concepte de baza in Visual Basic.

Page 270: tutoriale vba

2.3.1. Obiecte. Proprietati.

Obiectul se poate defini astfel, din punct de vedere al proiectantului, ca un ansamblu de date si operatii, numite metode, care manipuleaza datele.

Obiectele stau in centrul programarii in Visual Basic. Fiecare obiect are o identitate a sa, proprie si este caracterizat printr-o serie de proprietati sau atribute.

Proprietatile unui obiect descriu caracteristicile fizice ale acestuia: dimensiunea, culoarea, pozitia acestuia, inaltimea, latimea, numele obiectului, etc.

Avem doua posibilitati de a modifica proprietatile unui obiect:

        in momentul proiectarii, folosind fereastra de proprietati;

        in timpul executiei, prin codul programului.

Modificarea valorilor proprietatilor unui obiect in faza de executie a programului se face prin cod, referirea acestuia realizandu-se printr-o expresie cu sintaxa:

NumeObiect.Proprietate = Valoare

2.3.2. Metode.

O metoda este o actiune pe care programul o poate efectua asupra obiectului. O metoda este o procedura din program care poate fi invocata pentru a asocia o anumita actiune unui obiect. Sintaxa apelului unei metode este urmatoarea:

[NumeObiect].Metoda [lista-parametri]

Metoda Move presupune utilizarea cuvantului cheie Move si patru parametrii: Left, Top, Width si Height.

Pe langa proprietati si metode, majoritatea obiectelor din Visual Basic dispun si de un eveniment, cel putin.

Un eveniment este raspunsul unui obiect la o actiune a utilizatorului sau la o actiune a programului.

Codul din aplicatiile Visual Basic se imparte in blocuri de dimensiuni mai mici numite proceduri. O procedura - eveniment contine cod care este executat atunci cand se produce un anumit eveniment.

2.3.3. Aplicatii Visual Basic. Caracteristici.

Modulele formelor constitue baza pentru majoritatea aplicatiilor create in Visual Basic. Ele contin declaratii de variabile, constante, tipuri definite de utilizator, enumerari, proceduri ce gestioneaza evenimentele, proceduri si functii globale sau locale.

Page 271: tutoriale vba

Modulele standard (fisiere c extensia .bas)contin proceduri si declaratii care pot fi accesate din orice alt modul al aplicatiei. Putem adauga module standard la aplicatiile noastre cu ajutorul comenzii AddModule din meniul Project.

Modulele claselor constitue baza programarii orientate pe obiecte in Visual Basic. Astfel, putem scrie cod in modulele claselor pentru a crea obiecte noi, cu proprietati si module proprii. Putem adauga un modul clasa la aplicatie cu ajutorul comenzii Add Class Module.

Etapele proiectarii unei aplicatii in Visual Basic.

Crearea unei aplicatii in Visual Basic parcurge, in mod normal urmatoarele etape:

1.      Formularea problemei si deci definirea aplicatiei de rezolvat cu calculatorul;

2.      Proiectarea interfetei grafice cu utilizatorul (forme, obiecte, evenimente);

3.      Stabilirea proprietatilor pentru obiectele identificate;

4.      Scrierea codului (asociat diferitelor evenimente);

5.      Rularea (executia) aplicatiei si corectarea erorilor;

6.      Salvarea Proiectului.

2.3.4. Formulare Visual Basic.

Un formular reprezinta o zona rectangulara, asemanatoare unei ferestre. Pe ecran pot aparea la un moment dat unul sau mai multe formulare. Toate proiectele Visual Basic au cel putin cate un formular.

Avem doua tipuri de interfete:

        Interfata de tip SDI - Singular Document Interface, ceea ce inseamna ca se poate deschide un singur document odata;

        Interfata de tip MDI - Multiple Document Interface, ceea ce inseamna ca este permisa afisarea mai multor documente in acelasi timp.

Proprietatile unui formular definesc caracteristicile fizice ale acestuia:

     Caption stabileste textul care va fi afisat in bara de titlu a formularului;

     Icon stabileste pictograma care va fi afisata cand se va minimiza formularul;

     MaxButton si MinButton arata daca formularul poate fi maximizat sau minimizat;

     BorderStyle controleaza comportamentul formularului la redimensionare;

     Height si Width caracterizeaza dimensiunile initiale ale formularului;

Page 272: tutoriale vba

     Left si Top determina dispunerea formularului relativ relativ la coltul din stanga sus a ecranului;

     WindowStyle stabileste starea ferestrei astfel incat la pornire formularul sta sa apara in forma Maximed, Minimized sau Normal;

     Name - atribuie un nume formularului, prin care acesta va fi apelat in cadrul codului Visual Basic.

2.3.5. Controale Visual Basic.

In Visual Basic obiectele se mai numesc si controale si acestea pot fi: butoane de comanda, butoane de optiune, casete de dialog, casete de validare, bare de derulare, etc.

Un control dispune de proprietati, metode si evenimente.

In Visual Basic controalele pot fi grupate in mai multe categorii, astfel:

1. Controale de tip buton

Acestea sunt de doua tipuri:

      Buton de comanda - Command Button;

      Buton imagine - Image Button.

2. Controale care afiseaza imagini si grafica. Acestea sunt:

      Controlul imagine - folosit pentru a afisa imagini de tipul: pictograme, bitmap, JPEG sau GIF;

      Controlul forma grafica (shape) - foloseste la desenarea unor forme grafice predefinite pe suprafata unui formular ca: patrat, oval, cerc, dreptunghi, etc.;

      Controlul linie - este folosit pentru a genera segmente de linie pe un formular;

      Controlul caseta cu imagini - este folosit pentru afisarea graficii, ca un container pentru alte controale.

3. Controale eticheta (Label)

Acest control afiseaza text care poate fi doar citit, nu si modificat in mod direct de utilizator. Controalele etichete pot afisa diferite mesaje, care se pot schimba in functie de context.

4. Controale caseta cu text (text Box)

Page 273: tutoriale vba

Acest control permite introducerea unui text de la tastatura si/sau afiseaza un text introdus de utilizator sau rezultat din evaluarea unei expresii. Acest text este controlat de proprietatea Text si poate fi modificat doar in cazul in care proprietatea Locked nu are valoarea True.

5. Controale cu optiuni pentru utilizator.

Visual Basic pune la dispozitia utilizatorilor sai mai multe controale standard oferindu-le posibilitati de alegere:

      Caseta de validare – Check Box;

      Butoane de optiune – (Butoane radio) – Option Button;

      Caseta cu lista - List Box si Combo Box.

Controlul caseta de validare (Check Box) permite utilizatorului sa aleaga una sau mai multe optiuni si afiseaza un marcaj de validare cand este selectat. Aspectul acestei casete se stabileste cu proprietatile: Style, Picture, DownPicture si Disable Picture.

Controlul butoane de optiune (Option Button) se folosesste pentru a afisa o lista de optiuni dintre care utilizatorul poate alege una singura la un moment dat. Starea controlului este controlata de proprietatea Value, care are valoarea True daca butonul este selectat si Falsein caz contrar.

Controlul de tip Caseta cu lista prezinta doua posibilitati:

      Caseta cu lista – List Box;

      Caseta combinata – Combo Box.

Controlul Casetx cu listx (List Box) afiseaza pe verticala o lista de optiuni din care utilizatorul poate alege una sau mai multe elemente.

Sintaxa controlului este:

NumeCaseta.AddItem element [,index], in care

Nume Caseta – numele casetei cu lista;

Element – sirul de caractere care trebuie adaugat in lista;

index – pozitia in care va fi inserat elementul in lista. Daca acesta are valoarea zero, elementul va fi adaugat la inceputul listei, iar daca liseste elementul va fi adaugat la sfarsitul listei.

Stergerea unui anumit element din lista se face cu metoda RemoveItem, putand specifica pozitia din lista a elementului sters.

Stergerea tuturor elementelor din lista se face cu metoda Clear, cu sintaxa:

Page 274: tutoriale vba

NumeCAseta.Clear

Crearea casetelor cu lista multicoloana si multiselectie se face atribuind valori corespunzatoare proprietatilor Columns si MultiSelect.

Controlul Caseta Combinata (Combo Box) oferx utilizatorului o lista de optiuni reunind caracteristicile unei casete cu text cu cele ale unei casete cu lista.

Caseta combinata are trei stiluri gestionate de proprietatea Style:

o       Derulanta – DropDown Combo este stilul implicit cand proprietatea Style are valoarea zero;

o       Simpla – Simple Combo este o caseta in care lista de optiuni este intotdeauna vizibila, proprietatea Style avand valoarea1;

o       Lista derulanta – DropDown List afiseaza o lista de optiuni cand utilizatorul executa click pe sageata din dreapta a casetei, proprietatea Style avand valoarea 2.

6.Controale de acces la date:

      ADO Data creaza rapid legaturi intre controalele asociate datelor(oricare poseda proprietatea DataSource) si o baza de date;

      Data List si Data Combo asemanatoare cu controalele standard caseta cu lista si caseta combinata;

      Data Grid afiseaza datele asemanator unei foi de calcul tabelar sub forma de randuri si coloane;

      Microsoft Hiperarchical Flex Grid (MSHFlexGrid) si Microsoft FlexGrid (MSFlexGrid) vizualizeaza sub formx de grila datele dintr-un set de inregistrari care provin din una sau mai multe tabele;

      Data si Remote Data (date de la distanta) sunt incluse in Visual Basic pentru compatibilitate cu versiunile mai vechi.

7.Controale pentru sistemul de fisiere.

      DriveListBox - casetx cu listx a unitatilor de disc - ofera o lista derulanta a unitatilor de disc din care utilizatorul poate alege;

      DirListBox - caseta cu lista a directoarelor;

      FileListBox - casetx cu listx a fisierelor- afiseaza o lista cu numele fisierelor din cadrul directorului curent selectat.

8. Alte controale

Page 275: tutoriale vba

1)      Controlul de timp - Timer - masoara trecerea timpului si poate fi folosit pentru a crea un eveniment la intervale de timp regulate;

2)      Controlul Container OLE - permite legarea sau incapsularea intr-o aplicatie Visual Basic a unor obiecte din cadrul unor aplicatii, precum si accesul la facilitatile oricarei aplicatii ce permite OLE;

3)      Controlul dialog uzual - Common Dialog - acesta adauga intr-o aplicatie Visual Basic un set de casete de dialog pentru:

a)      Deschiderea si salvarea fisierelor;

b)      Selectarea culorilor;

c)      Selectarea fonturilor;

d)      Selectarea functiilor de tiparire la imprimanta.

III. VISUAL BASIC PRIN EXEMPLE PRACTICE.

GENERALITATI

Formele si controalele Visual Basic sunt obiecte ce au propriile proprietati, metode si evenimente.

Proprietatile sunt atribute pe care le poseda obiectul si care ii descriu modul de prezentare. Name, top, left, height, width, visible sunt doar cateva din proprietatile ce se intalnesc la marea majoritate a obiectelor.

Metodele stabilesc comportamentul obiectelor, indicand ce pot face ele efectiv. Ele sunt de fapt niste proceduri, adica blocuri de cod, care determina obiectul sa faca un anumit lucru.

Evenimentele definesc interactiunea cu mediul extern proiectului (utilizatorul face parte din mediul extern proiectului).

Pentru fiecare eveniment se poate scrie o procedura, denumita 'numeobiect.eveniment' care se va executa in momentul producerii acelui eveniment.

3.1. Proiectarea unei forme (formular)

Formele (formularele) constitue elementul de la care se incepe construirea unei interfete in Visual Basic, constituind practic ferestrele prin intermediul carora utilizatorul va interactiona cu aplicatia.

Formele poseda propriile proprietati, evenimente si metode cu ajutorul carora putem controla modul de afisare si comportamentul.

Proprietatea Caption stabileste titlul care va fi afisat in bara de titlu a formei; Icon stabileste iconita pentru forma; MaxButton si MinButton stabilesc daca forma poate sa fie maximizata sau minimizata; BorderStyle controlam modul de redimensionare al formei;

Page 276: tutoriale vba

Height si Width stabilesc dimensiunile initiale ale formei; Left si Top stabilesc locatia formei fata de coltul stanga sus al ecranului; WindowState stabileste modul in care se va afisa forma la inceput: minimizata, maximizata sau normala; Name stabileste un identificator cu ajutorul caruia putem referi forma respectiva.

Pentru a afisa o forma pe ecran se va utiliza metoda Show.

Form1.Show(Form1 reprezinta numele formei)

Pentru a inlatura o forma de pe ecran (a o ascunde) vom folosi metoda Hide sau functia Unload:

Form1.Hide sau Unload Form1

3.2. Buton de Comanda (Command Button).

Un buton de comanda este un control care are o anumita forma, afiseaza o eticheta si permite utilizatorului sa comande executia unor actiuni prin activarea lui.

Proprietatea Caption ne permite sa afisam un anumit text pe buton, de exemplu :OK, Cancel, Adauga, etc.

Cel mai frecvent eveniment intalnit la acest control si pentru care vom scrie cel mai mult cod este evenimentul click. De cate ori utilizatorul va face click de mouse pe acest buton evenimentul se va produce si va determina executarea codului scris in procedura numita :

NumeButton_Click().

La click de mouse pe butonul EXIT se doreste terminarea programului. Procedura va arata astfel:

Private Sub EXIT_Click ()

end

End Sub

3.3. Controale care manipuleaza texte.

Principalele controale utilizate pentru manipularea textelor sunt:

        Eticheta (Label) - este un control grafic folosit pentru afisarea de text pe care utilizatorul nu il poate modifica. Textul care va fi afisat se stabileste prin intermediul proprietatii Caption. Acesta poate fi stabilit din faza de proiectare, dar se poate modifica in timpul executiei prin intermediul unei proceduri asociate.

        Caseta de text (TextBox) - este folosit pentru a afisa textul specificat de dumneavoastrx din faza de proiectare (la proprietatea Text), sau introdus de la utilizator la executie sau asociat controlului prin program. Daca textul trebuie afisat pe mai multe linii, proprietatea MultiLine trebuie sa aiba valoarea True.

Page 277: tutoriale vba

3.4. Controale care permit alegerea unor optiuni.

3.4.1. Caseta de validare (CheckBox) - ofera utilizatorilor posibilitatea de a alege sau nu o anumitx optiune.

Proprietatea Value este utilizatx pentru a determina starea controlului: 1=bifat, 0=nebifat, 2=indisponibil.

Cu ajutorul proprietatii Caption putem adauga textul explicativ dorit in dreptul casetei.

3.4.2. Butonul de optiune (Option Button) - pun la dispozitia utilizatorului un set de optiuni, dintre care acesta are posibilitatea sa marcheze una singura la un moment dat. Selectarea unui buotn implicx automat deselectarea celorlalte.

Butonul de optiune care este mercat are proprietatea Value=True, iar celelalte butoane din grup au proprietatea Value=False.

Un buton de optiune poate fi dezactivat atribuind proprietatii Enabled valoarea False. Daca este dezactivat, butonul de optiune apare in timpul executiei estompat.

Aspectul unui buotn de optiune poate fi schimbat prin intermediul proprietatilor Picture, Style, DownPicture si DisablePicture.

3.5. Caseta cu Lista (ListBox).

Caseta cu lista este un control care permite afisarea pe verticala a unei serii de articole din care utilizatorul poate alege unul sau mai multe. Daca numarul de articole depaseste capacitatea de afisare a casetei cu lista proiectata, atunci ei i se vor asocia automat bare de derulare verticala, respectiv orizontala.

In mod implicit articolele sunt afisate pe o singura coloana. Acest lucru poate fi schimbat prin modificare proprietatii Columns care poate avea atribuite urmatoarele semnificatii:

0 - caseta de tip lista are o singura coloana, cu derulare pe verticala;

1 - casetx de tip lista are o singura coloana, cu derulare pe orizontala;

>1 - caseta de tip lista multicoloana cu derulare pe orizontala.

Daca dorim ca utilizatorul sa poata selecta mai multe articole din lista, atunci trebuie stabilita corespunzator valoarea proprietatii MultiSelect:

0 - nu permite nici o selectie;

1 - permite selectie multipla simpla;

2 - permite selectie multipla extinsa.

Proprietatea ListCount a unei liste returneaza numarul de articole din lista.

Page 278: tutoriale vba

Proprietatea ListIndex este utilizata pentru a determina numarul articolului selectat. Numerotarea articolelor incepe de la zero.

Adaugarea unui nou articol in lista se face cu metoda AddIttem, care are sintaxa:

Nume caseta. AddIttem element[,index]

unde:

- nume caseta - este numele obiectului de tip lista;

- element - este sirul de caractere care trebuie adaugat in lista si care poate fi specificat ca atare, intre '' sau continut intr-o variabila al carei nume trebuie specificat;

- index - precizeaza pozitia din lista unde va fi inserat noul articol.

NewIndex permite determinarea indexului ultimului articol din lista.

RemoveItem permite stergerea unui articol din lista, avand sintaxa:

Nume caseta.RemoveItem index

Pentru stergerea tuturor articolelor din lista se utilizeaza metoda Clear :

Nume caseta.Clear

3.6. Caseta Combinata (ComboBox)

CAseta combinata este un control care combina caracteristicile controlului caseta cu lista cu cele ale controlului casetx text.

Existx trei tipuri de casetx combinata, in functie de valoarea proprietatii Style:

        caseta derulanta combinata - contine o listx derulanta si o caseta de text. Utilizatorul are posibilitatea sa selecteze din lista una sau sa scrie in caseta de text;

        caseta combinata simpla - contine o caseta de text si o lista nederulanta. Dimensiunea unui asemenea control este suma dimensiunilor portiunii de editare si a listei;

        caseta cu lista derulanta - permite doar selectarea din lista derulanta, portiunea de text fiin neaccesibila.

Proprietatea Text controleaza selectia articolelor din lista ComboBox. Aceasta inseamna ca aici vom gasi continutul articolelor selectat la un moment dat.

3.7. Controale care afiseaza imagini si grafica.

Visual Basic ofera programatorilor patru controale cu ajutorul carora se pot afisa imagini grafice:

Page 279: tutoriale vba

        Caseta cu poze (PictureBox);

        Imagine (Image);

        Figura (Shape);

        Linie (Line).

3.7.1. Caseta cu poze (PictureBox)

Este un control utilizat pentru a afisa poze si imagini grafice. In timpul executiei programului, pentru a afisa o poza sau pentru a o schimba se foloseste functia LoadPicture pentru a stabili proprietatea Picture:

Picture1.Picture=LoadPicture('Poza.gif')

Daca poza care va fi afisata nu are aceeasi dimensiune cu a controlului, se poate seta proprietatea AutoSize=True si astfel controlul va avea aceeasi dimensiune cu poza.

Pot fi utilizate, de asemenea, metodele Circle, Line sau Pset pentru a afisa imagini grafice in caseta de poze.

3.7.2. Controlul Imagine (Image)

Daca dorim sa afisam o poza este recomandat sa folosim controlul Imagine. Acest contro incarca poza dar nu va permite nici o prelucrare a acesteia. Stretch=True este o proprietate pe care o folosim atunci cand dorim ca poza sa aiba aceeasi dimensiune cu controlul imagine. Se poate stabili poza care se va afisa cu ajutorul proprietatii Picture.

3.7.3. Figura (Shape) si Linie (Line)

Controalele figura si linie sunt folosite pentru a desena imagini grafice pe suprafata formei. Ele nu poseda nici un eveniment. modificand proprietatea Shape a controlului, acesta poate sa ia forma de cerc, oval, patrat, dreptunghi, patrat cu colturi rotunjite sau dreptunghi cu colturi rotunjite.

Controlul linie este asemanator cu cel figura, permitand trasarea unei linii.

3.8. Controale care permit manipularea fisierelor.

3.8.1. Controlul DriveListBox (caseta cu lista unitatilor de disc) - acest control se aseamana cu o caseta combinata care contine toate unitatile de disc pe care le recunoaste sistemul. Selectarea unei unitati de disc din lista nu inseamna insa schimbarea automata a unitatii de disc curente. Pentru a schimba efectiv unitatea de disc se utilizeaza proprietatea Drive ca argument a instructiunii ChDrive cu sintaxa:

ChDrive Drive.Drive

Proprietatea Drive permite aflarea unitatii de disc curente.

Page 280: tutoriale vba

3.8.2. Controlul DirListBox (caseta cu lista a directoarelor) - in aceasta lista directorul (folderul) curent apare evidentiat si identat fata de cele de nivel ierarhic superior, iar subdirectoarele sale apar identate fata de el. Proprietatea Path stabileste sau returneaza calea si directorul curent.

Selectand cu click mouse un director, acesta devine evidentiat, iar daca se selecteaza cu dublu click mouse, atunci el devine director curent, astfel ca apare in proprietatea Path iar ListIndex ia valoarea -1.

O comanda ChDir de forma:

ChDir Dir1.Path

stabileste directorul curent de lucru. Proprietatea ListCount returneaza, in acest caz, numarul de subdirectoare ale directorului curent.

3.8.3. Controlul FileListBox (caseta cu lista a fisierelor) - se aseamana cu o caseta tip lista ce contine fisierele din directorul curent selectat si specificat de proprietatea Path in momentul executiei. Proprietatea FileName stabileste sau returneaza in timpul executiei numele fisierului selectat.

Pentru a afisa toate fisierele directorului curent se poate utiliza instructiunea:

File1.Path=dir1.Path

unde File1 este numele implicit dat controlului utilizat.

Daca se cere in proprietatea Pattern afisarea fisierelor cu extensia .bas, atunci se da comanda:

File1.Pattern='*.bas'

3.9. Casete de dialog predefinite

Un mod simplu de a adauga o caseta de dialog aplicatiei noastre este sa folosim casetele de dialog predefinite. Pentru aceasta Visual Basic ne pune la dispozitie doua functii:

        InputBox care afiseaza o caseta de dialog ca permite prelucrarea datelor de la utilizator;

        MsgBox care permite afisarea diferitelor informatii, mesaje.

Functia InputBox afiseaza o caseta de dialog modala care cere utilizatorului sx introduca date. Sintaxa:

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

unde:

Page 281: tutoriale vba

- prompt - este un sir de caractere afisat ca mesaj in caseta de dialog. Numarul maxim este de caractere este de 1024;

- title - este un sir de caractere care va fi afisat ca titlu in bara de titlu a casetei de dialog;

- default - este un sir de caractere ce va fi afisat in caseta cu text si care va fi returnat de functie in caz ca utilizatorul nu introduce alte date;

- xpos, ypos - expresii numerice care specifica coordonatele coltului stanga sus al casetei de dialog fata de coltul stanga sus al ecranului;

- helpfile - un sir de caractere ce specifica numele fisierului Help ce va fi folosit pentru a oferi asistenta in lucrul cu caseta de dialog.

Functia MsgBox - se poate utiliza pentru a obtine raspunsuri de tipul Da/Nu de la utilizatori sau pentru a afisa diferitemesaje de avertizare, erori, atentionari. Sintaxa functiei este:

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

unde:

- prompt - este un sir de caractere afisat ca mesaj in caseta de dialog. Numarul maxim de caractere este de 1024;

- buttons - este o expresie numerica ce reprezinta suma valorilor care specifica numarul si tipul butoanelor afisate, iconita;

- title - un sir de caractere ce va fi afisat ca titlu in bara de titlu a casetei de dialog;

- helpfile - un sir de caractere ce specifica numele fisierului Help ce va fi folosit pentru a oferi asistenta in lucrul cu caseta de dialog.

3.10. Alte controale

1. Controlul de timp (TIMER)

Este un control care masoara timpul si ca urmare poate fi folosit pentru a crea un anumit eveniment la intervale de timp regulate.

Controlul Timer functioneaza independent de celelalte evenimente.

Proprietatea Enabled controleaza modul de actiune al controlului in sensul de a raspunde sau nu la actiuni ale utilizatorului. Ea poate lua valoarea True, caz in care intra in functiune imediat dupa incarcarea formularului, sau False pentru a suspenda functionarea controlului.

Proprietatea Interval defineste intervalul de timp care se scurge intre doua evenimente, exprimat in milisecunde. El poate lua valori intre 0 si 64767.

Page 282: tutoriale vba

2. Controlul container OLE

Acest control permite legarea sau incapsularea intr-o aplicatie Visual Basic a unor obiecte din cadrul altor aplicatii, precum si accesul la aplicatii care permite OLE, cum sunt: MS Word, MS Excel, etc.

3. Controlul dialog uzual (Common Dialog)

Este un control care pune la dispozitia utilizatorului o metoda usoara pentru lucrul cu fisierele. Astfel, el ofera un set de casete de dialog pentru operatii cum sunt:

        deschiderea fisierelor;

        salvarea fisierelor;

        selectarea culorilor;

        selectarea fonturilor;

        stabilirea functiilor de imprimare.

3.11. Editarea de meniuri

Visual Basic pune la dispozitia programatorilor un editor de meniuri cu ajutorul caruia se pot crea meniuri oricat de complexe intr-un mod relativ simplu.

Activarea editorului se face activand meniul TOOLS si de caolo optiunea Menu Editor (Ctrl/E).

Caption stabileste un sir de caractere care va fi afisat pe ecran, permitand utilizatorului sa selecteze o anumita optiune din meniu.

Caseta Shortcut permite precizarea tastelor de acces rapide

Checked este o optiune care poate lua valoarea logica de adevar sau fals. Daca are valoarea True va afisa un semn de bifare inaintea textului stabilit din proprietatea Caption.

Enabled stabileste daca meniul va fi activ sau nu. Daca nu este activ, textul de la Caption va fi afisat cu gri.

Name stabileste numele obiectului cu ajutorul caruia acesta poate fi identificat atunci cand scriem cod.

Shortcut stabileste o combinatie de taste prin apasarea careia se poate alege o anumita optiune din meniu.

Fiecare meniu poate contine submeniunri care la randul lor pot contine alte submeniuri. Exista cinci nivele de submeniuri.

Page 283: tutoriale vba

Pe langa aceste meniuri prezentate care se gasesc in bara de meniuri a aplicatiei, mai exista si meniurile Defilante (Pop-up). Acestea 'defileaza' pe ecran in momentul cand se apasa butonul dreapta al mouse-ului.

Pentru a realiza un astfel de meniu trebuie sa creem un meniu ivizibil cu ajutorul editorului de meniuri care sa contina cel putin un meniu invizibil. Il putem afisa pe ecran folosind metoda PopupMenu a formei.

3.12. Structuri de control

Structura liniara.

Poate contine o succesiune de instructiuni de tipul:

- instructiune de atribuire;

- instructiune de apel de procedura.

Instructiunea cea mai importanta si cea mai frecventa a limbajului este instructiunea de atribuire, avand forma:

variabila=expresie

sau

Set variabila=obiect

sau

Nume_de_functie=expresie

Instructiunea specifica faptul ca unei variabile sau unei functii (cea din stanga semnului '=') ii este atribuita o noua valoare, care este specificata printr-o expresie sau printr-un obiect. O expresie consta dintr-o secventa formata din operanzi (variabile, constante, etc.) si operatori (simboluri operationale).

Instructiunea de apel de procedura specifica activarea (apelul) procedurii al carui nume apare in instructiune si are forma:

nume_de_procedura lista_parametri_actuali

sau

Call nume_de_procedura(lista_parametrii_actuali)

Structura alternativa

Este descrisa cu ajutorul instructiunilor If Then, If Then Else si Select Case.

Structura repetitiva

Page 284: tutoriale vba

Permite repetarea in anumite conditii a unei instructiuni sau a unei secvente de instructiuni sau a unei secvente de instructiuni. Avem doux tipuri de structuri repetitive:

        Structuri repetitive cu contor - descrise de instructiunile For Next si For Each Next care executa acelasi lucru de un numar stabilit de ori;

        Structuri repetitive cu conditie - descrise de diferitele variante ale instructiunii Do Loop ce indeplinesc aceeasi sarcina atata timp cat o conditie existx sau pana cand nu mai exista o conditie.

Exemplu:

Do While i<=9

MsgBox 'Este repetarea numarului: '+str(i)

Loop

IV. Limbajul de Programare Visual Basic

4.1. Generalitati privind limbajele de programare.

Un limbaj de programare este un ansamblu de simboluri, cuvinte, instructiuni si semnificatii atribuite acestora, utilizat pentru descrierea algoritmilor. Limbajul de programare este un mijloc de comunicare intre calculator si programator.

Orice limbaj de programare presupune definirea urmatoarelor elemente componente:

o       Alfabetul;

o       Vocabularul;

o       Gramatica;

o       Punctuatia;

o       Semantica.

Program sursa - reprezinta programul scris ca text intr-un limbaj de programare, el fiind scris prin intermediul unui editor de texte al limbajului de programare sau acceptat de limbajul de programare respectiv (ex.: Notepad).

Compilatorul - este componenta software care realizeaza traducerea programului sursa in cod intern, rezultand asa numitul program cod obiect.

4.2. Elemente ale limbajului de programare Visual Basic

Setul de caractere

Page 285: tutoriale vba

Pentru a scrie instructiuni pe care calculatorul sa le interpreteze si sa le execute in cadrul programului folosim cuvintele.

In cadrul limbajului de programare Visual Basic se pot folosi urmatoarele caractere:

- Litere mari si mici ala alfabetului limbii romane :A-Z, a-z;

- Cifrele sistemului de numerotatie zecimal: 0-9;

- Caractere speciale: + - / ^ () [] . , ; : _ ! # $ % etc.;

- Caractere speciale perechi, care definesc operatori de comparare: <=, >=, =, <>;

- Separatori: spatiu, tab si caracterul Enter.

Identificatori

Un identificator este numele dat de programator unui element dintr-un program, care poate fi o variabila, o constanta, un tip definit de utilizator, o enumerare, o procedura, o functie, un obiect, o metoda, o proprietate, un control, o forma sau chiar proiectul insusi. Un proiect Visual Basic poate sa contina maxim 32000 identificatori.

Comentarii, separatori, impartirea liniei

Comentariile sunt siruri de caractere care au in fata caracterul apostrof ( ' ) si servesc pentru a face textul programului mai lizibil, pentru a documenta programul.

Daca se doreste se pot scrie mai multe instructiuni pe o singura linie despxrtindu-le cu ajutorul separatorului de instructiuni si declaratii care este caracterul doua puncte ( : ).

Daca o declaratie sau o instructiune este prea mare, atunci ea se poate scrie pe mai multe linii folosind caracterul continuatorul de linie, un spatiu urmat de o linie jos ( _).

4.3. Tipuri de date

Tipul unei date defineste multimea de valori pe care le poate lua o variabila si multimea de operatii care pot fi efectuate cu elementele multimii respective

Fiecare tip de data permite o serie de operatii.

4.3.1. Constante

In Visual Basic exista doua tipuri de constante:

o       Intrinseci sau definite de sistem;

o       Simbolice sau definite de utilizator (se declarx prin instructiunea Const).

Formatul general al declaratiei de constante este:

Page 286: tutoriale vba

[Public|Private] Const Nume constanta[As type] = expresie

4.3.2. Variabile Visual Basic

Tipul variabilelor din Visual BAsic sunt: Variable, Byte, Boolean, String, Integer, Long, Single, Double, Currency, Date si Object.

Tipul Variant (nedefinit) este un tip special de date care poate contine date numerice, siruri de caractere si date calendaristice, precum si valorile Null (indica faptul ca o variabila nu contine nici o data vlida in mod deliberat) si Empty (indica faptul ca o variabila nu a fost initializata si este egala cu zero).

Declararea unei variabile inseamna practic a defini de la inceput informatiile necesare programului de variabila respectiva, astfel incat programul sa stie cum se numeste, ce tip de date poate stoca, ce zona de memorie trebuie sa-i aloce si unde.

Declararea unei variabile se face astfel:

[Public|Private|Dim] NumeVariabila As TipVariabila

In Visual Basic principalele tipuri de date sunt:

        Tipul Byte poate lua valori de la 0 la 255;

        Tipul Integer are sufixul procent %, ocupa doi octeti si poate lua valori intregi cuprinse in intervalul de la -32768 la 32767;

        Tipul Long are sugixul &, ocupa 4 octeti si poate lua valori intregi cuprinse in intervalul-2.147.483.648 si 2.147.483.647;

        Tipul Single poate memora valori reale in simpla precizie;

        Tipul Double poate memora valori reale in dubla precizie;

        Tipul Curency are ca sufix semnul @, ocupa 8 octeti si poate lua valori reale cuprinse intre -9.22*E la puterea 14 si 9.22*E la puterea 14;

        Tipul Date nu are suffix, ocupa 8 octeti si poate lua valori cuprinse intre 1 ianuarie 1000 si 31 decembrie 9999;

        Tipul String are sufixul $ si ocupa numarul de octeti precizat prin declaratia de tip;

        Tipul Boolean memoreaza valori logice de tip adevarat sau fals, da, nu, pornit sau oprit si ocupa doi octeti;

        Tipul de date Obiect reprezinta o variabila care poate stoca o valoare sau poate apela obiecte din cadrul aplicatiei sau din alte aplicatii;

Page 287: tutoriale vba

        Tipul Variant este tipul implicit pentru orice variabila Visual Basic care nu a fost declarata in mod explicit.

4.3.3. Tipuri de date definite de utilizator.

Aceste tipuri de date sunt compuse dintr-un numar de componente numite campuri. Spre deosebire de tablouri, campurile pot contine tipuri de date diferite. Sintaxa unui tip definit de utilizatori este urmatoarea:

Private|Public Type NumeTip

Nume_camp1 As TipData

Nume_camp2 As TipData

..

Nume_camp3 As TipData

End Type

4.3.4. Date de tipul Enumerare.

Tipul de date enumerare defineste o multime ordonata de valori: se enumera un sir de identificatori care desemneaza valorile posibile.

Sintaxa instructiunilor de declarare a unui tip enumerare este:

Private|Public Enum NumeEnumerare

Element1[=valoare]

Element2[=valoare]

..

Elementn[=valoare]

End Enum

4.4. Operatori

Operatorii reprezinta comenzi speciale pentru operatiile ce pot fi executate cu datele din program. Visual Basic pune la dispozitie 4 tipuri de operatori:

a) Operatori Aritmetici: +(adunare), -(scadere), *(inmultire), /(impartire), (impartire intreaga) si MOD (modulo);

Page 288: tutoriale vba

b) Operatori Logici - manipuleaza valorile True si False - : AND(conjunctia logica), OR(disjunctia logica), XOR(disjunctia exclusiva), NOT(negatia logica), EQV(echivalenta logica), IMP(implicatia logica);

c) Operatori de comparare: <(mai mic), <=(mai mic sau egal), >(mai mare), >=(mai mare sau egal), =(egal), <>(diferit, neegal);

d) Operatori de concatenare: +, & realizeaza concatenarea (alipirea) a doua siruri de caractere.

4.5. Operatiuni de Intrare-Iesire

4.5.1. Dialogul standard cu utilizatorul

Functia InputBox - afiseaza o caseta de dialog care contine un mesaj, doua butoane (OK si Cancel) si o zona de text in care se poata tasta un raspuns.

Sintaxa functiei este:

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])

Functia MsgBox - afiseaza un mesaj intr-o caseta de dialog si se asteapta ca utilizatorul sa actioneze unul dintre butoanele existente. Functia returneaza o valoare intreaga, indicand astfel care buton a fost actionat. Sintaxa este:

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

4.5.2. Comanda Print

Puteti afisa text in interiorul formelor sau al casetelor cu poza cu ajutorul metodei Print. Sintaxa:

[obiect.] Print [lista iesiri] [ ]

4.6. Functii incorporate in Visual Basic.

Acestea pot fi grupate in mai multe categorii, astfel:

a). Functii matematice si statice: ABS( ),EXP( ), INT( ), LOG( ), RND( ), SQR( ), ATN( ), SIN( ), COS( ) si TAN( );

b). Functii pentru siruri de caractere: LCASE(sir), UCASE(sir), LTRIM(sir), RTRIM(sir), TRIM(sir), CHR(sir), ASC(sir), LEN(sir), VAL(sir), StrREVERSE(sir), LEFT(sir,Nrc), RIGHT(sir,Nrc), MID(sir,Start [,Nrc]), INSTR([intStart, ] Sir, strCauta [, intCompara]);

c). Functii de editare: Format, Format_String;

d). Functii financiare: DDB, FV, IPMT, IRR, MIRR, NPER, NPV, PMT, PPMT, PV, RATE, SLN;

Page 289: tutoriale vba

e). Functii pentru conversia intregilor: Int(), CInt();

f). Functii pentru conversia tipului de data: CDbl(arg), CLng(arg), CSng(arg), Cstr(arg), CVar(arg), CCur(arg);

g). Functii de verificare a tipului de data: IsNumeric(), IsDate(), IsEmpty(), IsNull(), VarType();

h). Functii pentru lucrul cu date calendaristice: DateDiff(), IsDate(expresie), Time(), Date(), Now(), CStr (Time), CStr (Date), CStr (Now);

i). Functii pentru lucrul cu fisiere: Seek(NumarFisier), LOF(NumarFisier), EOF(NumarFisier).

4.7. Functii si proceduri utilizator in Visual Basic.

O functie este un modul program care efectueaza o anumita sarcina si returneaza o valoare identificata prin numele functiei.

O procedura eveniment devine activx atunci cand e apelata de utilizator sau de program in mod automat.

O procedura functie este o procedura care realizeaza o anumita valoare identificata prin numele functiei.

Procedurile tip proprietate pot returna si atribui valori si pot stabili referinte la obiecte.

Procedurile sunt blocuri de cod constituite din instructiuni, date locale si alte subprograme.

Procedurile generale sunt blocuri de cod prin care se transmite aplicatiei cum trebuie sa indeplineasca o anumita sarcina.

Procedurile eveniment sunt blocuri de cod asociate diferitelor evenimente recunoscute de un obiect si care se executa in momentul in care se produce evenimentul respectiv.

Apelarea unei proceduri se face in doua moduri, cu sintaxa:

NumeProcedura lista_parametri_actuali

sau

Call NumeProcedura(lista_parametri_actuali)

4.8. Instructiuni de atribuire.

Atribuirea unei valori la o variabila de memorie se poate efectua prin instructiunile: Let, Set, Lset si Rset.

Page 290: tutoriale vba

4.9. instructiuni de terminare sau oprire a programului.

Terminarea executiei unui program sau oprirea temporara a acestuia se pot realiza prin instructiunile: DoEvents, End, Exit, Stop.

4.10. Comenzi pentru lucrul cu fisiere.

4.10.1. Deschiderea fisierului - este o operatie care trebuie executata inainte de orice prelucrare a acestuia. Pentru intrare sau iesire, orice fisier trebuie deschis cu comanda OPEN, cu sintaxa:

OPEN ( numefisier) FOR ( mod de deschidere ) [Access acces] [blocare] AS # numarFisier [Len=lungInreg]

4.10.2. Comenzi pentru fisiere aleatorii.

Descrieirea campurilo - ce formeaza inregistrarile unui fisier aleator se face utilizand o declaratie de tip utilizator:

TYPE numetip

NumeVariabila1 as

NumeVariabilak as

EDN TYPE

Scrierea unei inregistrari intr-un fisier se face cu instructiunea PUT care are urmatoarea sintaxa:

PUT #NumeFisier, [NumarInreg] , NumeVariabila

Pozitionarea pentru citire pe o inregistrare dintr-un fisiert aleator se face cu instructiunea GET, cu sintaxa:

GET [#]numarfisier [, numar]

4.10.3. Inchiderea fisierelor - se realizeaza cu comanda CLOSE, a carei sintaxa este:

CLOSE [lista fisiere]

sau

CLOSE [ # numarFisier1] [, # numarFisier2] [, # numarFisier3]

4.10.4. Comenzi pentru fisiere secventiale.

a). Scrierea datelor intr-un fisier secvential se poate face cu comenzile:

Print #NumarFisier, lista_expresii

Page 291: tutoriale vba

sau

Write #NumarFisier, lista_expresii

b). Citirea informatiilor din fisiere cu acces secvential - se poate face cu ajutorul instructiunilor:

Input #NumarFisier, lista_expresii

Line Input# NumarFisier, SirCaractere

Input$ (NumarOcteti, [#] NumarFisier)

4.11. Grafica si Multimedia in Visual Basic.

Stergerea zonei de desenare.

Pentru a curata zona de desenare folositi metoda Cls care sterge si redeseneaza forma sau controlul pastrand aceeasi culoare de fundal.

Stabilirea culorilor.

BackColor - culoarea fundalului unui control sau a unei forme;

ForeColor - culoarea folositx la desenarea figurilor si textelor;

BorderColor - culoarea chenarului;

FillColor - culoarea de completare a spatiului liber al unei figuri.

Afisarea textului - in interiorul formelor sau al casetelor cu poza se face cu ajutorul metodei Print, cu sintaxa:

[obiect.] Print [lista iesiri] [ ]

Desenarea unui dreptunghi se face folosind metoda Line a formei sau a casetei cu imagini, care are urmatoarea sintaxa:

obiect.Line [Step] (x1,y1) [Step] (x2,y2), [color], [B], [F]

Desenarea cercurilor, a arcelor de cerc si a elipselor - se realizeaza utilizand metoda Circles a formei sau a casetei cu poza, cu sintaxa:

Obiect.Circle [Step] (x,y), radius, [color,[start, end, [aspect]]]

Desenarea punctelor intr-o forma sau Intr-o casetx cu poza se realizeaza cu ajutorul metodei Pset, cu sintaxa:

obiect.Pset [Step] (x,y), [color]

Page 292: tutoriale vba

PARTEA a 2-a

Aplicatii.

1) Ceas cu alarma

Private Declare Function mciExecute Lib 'winmm.dll' (ByVal lpstrCommand As String) As Long

Dim x

Private Sub Command1_Click()

On Error Resume Next

Form2.Show

End Sub

Private Sub Command2_Click()

End

End Sub

Private Sub Form_Load()

Timer1.Enabled = True

Page 293: tutoriale vba

Timer1.Interval = 1000

End Sub

Private Sub Timer1_Timer()

Label1.Caption = Format(Time, 'short time')

End Sub

Private Sub Timer2_Timer()

If Label1.Caption = Text1.Text Then

x = mciExecute('play alarm.wav')

MsgBox ' Alarma !!! ', vbInformation, 'Alarma'

End If

End Sub

Private Sub Command1_Click()

On Error Resume Next

Form1.Text1.Text = Form2.Text1.Text + ':' + Form2.Text2.Text

Form1.Timer2.Enabled = True

Form1.Timer2.Interval = 1000

If Text1.Text > 24 Or Text1.Text < 0 Then

MsgBox 'Introduceti o valoarea intre 0 si 24', vbExclamation, 'Ora setata incorect !'

Text1.Text = ''

ElseIf Text2.Text > 59 Or Text2.Text < 0 Then

MsgBox 'Introduceti o valoarea intre 0 si 59', vbExclamation, 'Minute setate incorect !'

Text2.Text = ''

Page 294: tutoriale vba

End If

Unload Me

End Sub

Private Sub Form_Load()

On Error Resume Next

End Sub

2) Calculator

Dim n As Double

Private Sub Command1_Click()

On Error Resume Next

If Option1.Value = True Then

Text3.Text = Val(Text1.Text) + Val(Text2.Text)

ElseIf Option2.Value = True Then

Page 295: tutoriale vba

Text3.Text = Val(Text1.Text) - Val(Text2.Text)

ElseIf Option3.Value = True Then

Text3.Text = Val(Text1.Text) * Val(Text2.Text)

ElseIf Option4.Value = True Then

If Text2.Text = '0' Then

MsgBox 'Nu se poate imparti la 0', vbCritical, 'Eroare'

Text2.Text = ''

Else

Text3.Text = Val(Text1.Text) / Val(Text2.Text)

End If

ElseIf Option5.Value = True Then

Text2.Text = '0'

Text2.Enabled = False

If Val(Text1.Text) < 0 Then

MsgBox 'Nu se poate extrage radical de oridin 2 din numere negative', vbCritical, 'Eroare'

Else

n = Val(Text1.Text)

Text3.Text = Sqr(n)

End If

End If

Text2.Enabled = True

End Sub

Private Sub Command2_Click()

Page 296: tutoriale vba

End

End Sub

Private Sub Command3_Click()

Text1.Text = Empty

Text2.Text = Empty

Text3.Text = Empty

Option1.Value = False

Option2.Value = False

Option3.Value = False

Option4.Value = False

Option5.Value = False

End Sub

Private Sub Option5_Click()

Text2.Enabled = False

End Sub

3) Conversie valuatara

Page 297: tutoriale vba
Page 298: tutoriale vba

Private Sub Command1_Click()

Unload Me

End Sub

Private Sub Command2_Click()

OpDolar.Value = False

OpEuro.Value = False

OpFranc.Value = False

OpYen.Value = False

suma = Empty

txtDolar = Empty

txtEuro = Empty

txtFranc = Empty

txtYen = Empty

End Sub

Private Sub Form_Load()

End Sub

Private Sub OpDolar_Click()

curs = InputBox('Introduceti cursul valutar pentru USD:')

txtDolar = CStr(Format(Val(suma.Text) / curs, 'FIXED')) + ' USD'

End Sub

Private Sub OpEuro_Click()

curs = InputBox('Introduceti cursul valutar pentru Euro:')

txtEuro = CStr(Format(Val(suma.Text) / curs, 'FIXED')) + ' Euro'

Page 299: tutoriale vba

End Sub

Private Sub OpFranc_Click()

If OpFranc.Enabled = True Then

curs = InputBox('Introduceti cursul valutar pentru Francul Francez:')

txtFranc = CStr(Format(Val(suma.Text) / curs, 'FIXED')) + ' Franci'

End If

End Sub

Private Sub OpYen_Click()

If OpYen.Enabled = True Then

curs = InputBox('Introduceti cursul valutar pentru Yenul Japonez:')

txtYen = CStr(Format(Val(suma.Text) / curs, 'FIXED')) + ' Yeni'

End If

End Sub

4) Calcul dobanda

Option Explicit

Dim i As Integer, j As Integer

Dim DobandaA As Long, SumaActual As Long

Private Sub

cmdCalcul_Click()

Page 300: tutoriale vba

Select Case cmbCont.Text

Case cmbCont.Text

If cmbCont.Text = '<ALL>' Then

Me.Cls ''curata' forma de text

For j = LBound(Record) To UBound(Record) 'incepe de la LBound - limita inferioara a vectorului 'RECORD' - pana la UBound - limita superioara a vectorului

If Record(j).TermenDepozit = '1' Then DobandaA = (Val(Record(j).SumaDepusa) * 0.1) * Val(Record(j).TermenDepozit) / 12

If Record(j).TermenDepozit = '3' Then DobandaA = (Val(Record(j).SumaDepusa) * 0.11) * Val(Record(j).TermenDepozit) / 12

If Record(j).TermenDepozit = '6' Then DobandaA = (Val(Record(j).SumaDepusa) * 0.12) * Val(Record(j).TermenDepozit) / 12

If Record(j).TermenDepozit = '12' Then DobandaA = (Val(Record(j).SumaDepusa) * 0.14) * Val(Record(j).TermenDepozit) / 12

SumaActual = Val(Record(j).SumaDepusa) + DobandaA

Me.Print '(NR.CONT ' & Record(j).NrCont & ') ' & Record(j).Nume & ' ' & Record(j).Prenume & vbCrLf & _

'VALOARE DOBANDA = ' & DobandaA & vbCrLf & _

'SUMA ACTUALIZATA = ' & SumaActual & vbCrLf

Next j

Page 301: tutoriale vba

Else

If cmbCont.Text <> '' Then

Me.Cls

j = Val(cmbCont.Text)

If Record(j).TermenDepozit = '1' Then DobandaA = (Val(Record(j).SumaDepusa) * 0.1 / 100) * Val(Record(j).TermenDepozit) / 12

If Record(j).TermenDepozit = '3' Then DobandaA = (Val(Record(j).SumaDepusa) * 0.11 / 100) * Val(Record(j).TermenDepozit) / 12

If Record(j).TermenDepozit = '6' Then DobandaA = (Val(Record(j).SumaDepusa) * 0.12 / 100) * Val(Record(j).TermenDepozit) / 12

If Record(j).TermenDepozit = '12' Then DobandaA = (Val(Record(j).SumaDepusa) * 0.14 / 100) * Val(Record(j).TermenDepozit) / 12

SumaActual = Val(Record(j).SumaDepusa) + DobandaA

Me.Print '(NR.CONT ' & Record(j).NrCont & ') ' & Record(j).Nume & ' ' & Record(j).Prenume & vbCrLf & _

'VALOARE DOBANDA = ' & DobandaA & vbCrLf & _

'SUMA ACTUALIZATA = ' & SumaActual

ElseIf i < 0 Then MsgBox 'Nu exista inregistrari', vbInformation

Page 302: tutoriale vba

ElseIf i >= 0 Then MsgBox 'Alege NUMAR CONT', vbInformation

End If

End If

Case '': Exit Sub

End Select

End Sub

Private Sub cmdRaport_Click()

If i < 0 Then

MsgBox 'Nu exista inregistrari', vbInformation

ElseIf i >= 0 Then MsgBox 'Exista ' & i + 1 & ' inregistrari.', vbInformation

End If

End Sub

Private Sub Form_Load()

i = -1

Page 303: tutoriale vba

End Sub

Private Sub cmdIntroducere_Click()

i = i + 1 'incrementare numar cont

ReDim Preserve Record(i) 'redimensionare marime vector 'RECORD'

Record(i).NrCont = i 'atribuire numar cont

EnterNume: 'marcaj punct de inceput inregistrare Nume

Record(i).Nume = InputBox('NUME pentru REC.' & i, 'Inregistrare NR. ' & i) 'atribuire nume

'start verificari pentru Nume

If Len(Record(i).Nume) = 0 Then 'verificare daca exista nume introdus

If MsgBox('NUME nu poate avea valoare nula.' & vbCrLf & _

'Va rog introduceti NUME.' & vbCrLf & vbCrLf & _

'Pentru a anula inregistrarea curenta clic 'Cancel'', _

vbExclamation + vbOKCancel, 'Date invalide') = vbOK Then 'Numele nu este introdus sau se doreste anularea inregistrarii (utilizatorul a executat clic pe Cancel)

GoTo EnterNume 'executia se intoarce la marcajul de inceput inregistrare Nume (utilizatorul a dat clic pe OK, deci doreste introducerea numelui, implicit executia continua

Else

Page 304: tutoriale vba

'utilizatorul a executat clic pe Cancel, el nu mai doreste sa continue inregistrarea

i = i - 1 'contorul de contruri se intoarce la starea precedenta

MsgBox 'Inregistrare anulata.' & vbCrLf & _

'Incrementarea NumarCont nemodificata (REC.' & i + 1 & ')', , 'Inregistrare Anulata' 'notificare

Exit Sub 'executia intregii subrutine se opreste

End If

End If

EnterPrenume:

Record(i).Prenume = InputBox('PRENUME pentru REC.' & i, 'Inregistrare NR. ' & i)

If Len(Record(i).Prenume) = 0 Then

If MsgBox('PRENUME nu poate avea valoare nula.' & vbCrLf & _

'Va rog introduceti PRENUME.' & vbCrLf & vbCrLf & _

'Pentru a anula inregistrarea curenta clic 'Cancel'', _

vbExclamation + vbOKCancel, 'Date invalide') = vbOK Then

GoTo EnterPrenume

Else

Page 305: tutoriale vba

i = i - 1

MsgBox 'Inregistrare anulata.' & vbCrLf & _

'Incrementarea NumarCont nemodificata (REC.' & i + 1 & ')', , 'Inregistrare Anulata'

Exit Sub

End If

End If

EnterSumaDepusa:

Record(i).SumaDepusa = InputBox('SUMA DEPUSA pentru REC.' & i & vbCrLf & vbCrLf & _

Record(i).Prenume & ', ' & UCase(Record(i).Nume), 'Inregistrare NR. ' & i)

If IsNumeric(Record(i).SumaDepusa) = False Then 'se verifica daca SumaDepusa este valoare numerica

If MsgBox('SUMA DEPUSA nu poate avea valoare nula si/sau sa fie un sir de caractere.' & vbCrLf & _

'Va rog introduceti SUMA DEPUSA (valoare numerica).' & vbCrLf & vbCrLf & _

'Pentru a anula inregistrarea curenta clic 'Cancel'', vbExclamation + vbOKCancel, 'Date invalide') = vbOK Then

GoTo EnterSumaDepusa

Page 306: tutoriale vba

Else

i = i - 1

MsgBox 'Inregistrare anulata.' & vbCrLf & _

'Incrementarea NumarCont nemodificata (REC.' & i + 1 & ')', , 'Inregistrare Anulata'

Exit Sub

End If

End If

EnterTermenDepozit:

Record(i).TermenDepozit = InputBox('TERMEN DEPOZIT pentru REC.' & i & vbCrLf & _

Record(i).Prenume & ', ' & UCase(Record(i).Nume) & vbCrLf & vbCrLf & _

'TERMENE: (introduceti cifra corespunzatoare)' & vbCrLf & _

'(1) O luna' & vbCrLf & _

'(3) Trei luni' & vbCrLf & _

'(6) Sase luni' & vbCrLf & _

'(12) Doisprezece luni', _

'Inregistrare NR. ' & i)

If IsNumeric(Record(i).TermenDepozit) = False Or _

Page 307: tutoriale vba

Record(i).TermenDepozit <> '1' And _

Record(i).TermenDepozit <> '3' And _

Record(i).TermenDepozit <> '6' And _

Record(i).TermenDepozit <> '12' Then 'se verifica daca TermenDepozit este valoare numerica si daca aceasa este 1, 3, 6 sau 12

If MsgBox('TERMEN DEPOZIT nu poate avea valoare nula si/sau sa fie un sir de caractere.' & vbCrLf & _

'Va rog introduceti TERMEN DEPOZIT (valoare numerica: 1, 3, 6, 12).' & vbCrLf & vbCrLf & _

'Pentru a anula inregistrarea curenta clic 'Cancel'', vbExclamation + vbOKCancel, 'Date invalide') = vbOK Then

GoTo EnterTermenDepozit

Else

i = i - 1

MsgBox 'Inregistrare anulata.' & vbCrLf & 'Incrementarea NumarCont nemodificata (REC.' & i + 1 & ')', , 'Inregistrare Anulata'

Exit Sub

End If

End If

cmbCont.Clear

For j = LBound(Record) To UBound(Record)

cmbCont.AddItem j

Next j

cmbCont.AddItem '<ALL>'

Page 308: tutoriale vba

End Sub

5) Lista de produse

Page 309: tutoriale vba

Dim a As String

Private Sub cmdadauga_Click()

a = InputBox('Introduceti ce doriti sa adaugati in lista')

If a = '' Then

MsgBox ('introduceti un produs')

Else

lst1.AddItem (a)

End If

End Sub

Private Sub cmdsterge_Click()

lst1.RemoveItem (ListIndex)

End Sub

Private Sub lst1_Click()

lbl3.Caption = lst1.ListIndex + 1

End Sub

Page 310: tutoriale vba

6) Analiza unui text preluat dintr-un fisier sau introdus de la tastatura

Option Explicit

Dim retry As Integer, maxRetry As Integer

Dim strPassword As String

Private Sub cmdExit_Click()

Unload Me

End Sub

Private Sub cmdOK_Click()

If Text1 <> strPassword Then

retry = retry + 1

If retry >= maxRetry Then

MsgBox 'Parola incorecta.' & vbCrLf & 'S-a depasit numarul de incercari.' & vbCrLf & 'Executie terminata.', vbCritical, 'Parola'

Page 311: tutoriale vba

Unload Me

Else

Select Case maxRetry - retry

Case 1: MsgBox 'Parola incorecta.' & vbCrLf & 'Mai aveti o incercare.', vbCritical, 'Parola'

Case Else

MsgBox 'Parola incorecta.' & vbCrLf & 'Mai aveti ' & maxRetry - retry & ' incercari.', vbCritical, 'Parola'

End Select

End If

Else

Me.Hide

Load Form2

Form2.Show

Unload Me

End If

End Sub

Private Sub Form_Load()

retry = 0

maxRetry = 5

strPassword = 'parola'

Label1 = 'Facultatea Informatica Manageriala' & vbCrLf & _

'Universitatea Romano-Americana' & vbCrLf & vbCrLf & _

'Descriere proiect: Analiza Text'

Page 312: tutoriale vba

End Sub

Private Sub Command1_Click()

Unload Me

End

End Sub

Private Sub Command2_Click()

On Error Resume Next

Dim cuv() As String

Dim tot() As Long

Dim i As Long, j As Long

If Len(Text1) <> 0 Then

cuv = Split(Trim(Text1), ' ', , vbTextCompare)

Form3.Text1.Text = 'Cuvinte gasite: ' & UBound(cuv) + 1 & vbCrLf

ReDim tot(UBound(cuv))

'nr aparitii

For i = 0 To UBound(cuv)

For j = 0 To UBound(cuv)

If Trim(cuv(i)) = Trim(cuv(j)) Then tot(i) = tot(i) + 1

Next

Next

For i = 0 To UBound(cuv)

For j = i + 1 To UBound(cuv)

Page 313: tutoriale vba

If Trim(cuv(i)) = Trim(cuv(j)) Then cuv(i) = ''

Next

Next

' afisare

For i = 0 To UBound(cuv)

If cuv(i) <> '' Then Form3.Text1.Text = Form3.Text1.Text & 'Cuvant: ' & Chr(34) & cuv(i) & Chr(34) & ' nr aparitii: ' & tot(i) & vbCrLf

Next

Form3.Text1.Text = Form3.Text1.Text + '----------------------'

'afisare propozitii (succesiune de cuvinte urmate de .)

Dim prop() As String

prop = Split(Text1, '.', , vbTextCompare)

Form3.Text1.Text = Form3.Text1.Text & 'Propozitii gasite: ' & UBound(prop) & vbCrLf

ReDim tot(UBound(prop))

' total aparitii

For i = 0 To UBound(prop)

For j = 0 To UBound(prop)

If Trim(prop(i)) = Trim(prop(j)) Then tot(i) = tot(i) + 1

Next

Next

For i = 0 To UBound(prop)

For j = i + 1 To UBound(prop)

If Trim(prop(i)) = Trim(prop(j)) Then prop(i) = ''

Page 314: tutoriale vba

Next

Next

' afisare

For i = 0 To UBound(prop)

If prop(i) <> '' Then Form3.Text1.Text = Form3.Text1.Text & 'Propozitie: ' & Chr(34) & prop(i) & Chr(34) & ' nr aparitii: ' & tot(i) & vbCrLf

Next

Form3.Text1.Text = Form3.Text1.Text + '-------------------------'

'afisare frazele (succesiune de cuvinte urmate de . si ,)

Dim fraz() As String

fraz = Split(Text1, '.', , vbTextCompare)

fraz = Split(Text1, ',', , vbTextCompare)

Form3.Text1.Text = Form3.Text1.Text & 'frazele gasite: ' & UBound(fraz) + 1 & vbCrLf

ReDim tot(UBound(fraz))

' total aparitii

For i = 0 To UBound(fraz)

For j = 0 To UBound(fraz)

If Trim(fraz(i)) = Trim(fraz(j)) Then tot(i) = tot(i) + 1

Next

Next

For i = 0 To UBound(fraz)

For j = i + 1 To UBound(fraz)

If Trim(fraz(i)) = Trim(fraz(j)) Then fraz(i) = ''

Page 315: tutoriale vba

Next

Next

' afisare

For i = 0 To UBound(fraz)

If fraz(i) <> '' Then Form3.Text1.Text = Form3.Text1.Text & 'frazele: ' & Chr(34) & fraz(i) & Chr(34) & ' nr aparitii: ' & tot(i) & vbCrLf

Next

Form3.Text1.Text = Form3.Text1.Text + '------------------------'

Dim lit() As String

ReDim lit(Len(Text1))

Form3.Text1.Text = Form3.Text1.Text & 'Litere gasite: ' & UBound(lit) & vbCrLf

ReDim tot(UBound(lit))

For i = 0 To UBound(lit)

lit(i) = Mid(Text1, i + 1, 1)

Next

For i = 0 To UBound(lit)

For j = 0 To UBound(lit)

If lit(i) = lit(j) Then tot(i) = tot(i) + 1

Next

Next

For i = 0 To UBound(lit)

For j = i + 1 To UBound(lit)

If lit(i) = lit(j) Then lit(i) = ''

Page 316: tutoriale vba

Next

Next

' afisare

For i = 0 To UBound(lit)

If lit(i) <> '' Then Form3.Text1.Text = Form3.Text1.Text & 'Litera: ' & Chr(34) & lit(i) & Chr(34) & ' nr aparitii: ' & tot(i) & vbCrLf

Next

Else

Form3.Text1 = 'ERROR: TEXT SURSA INEXISTENT'

End If

Form3.Show 1, Me

End Sub

Private Sub Command3_Click()

On Error Resume Next

Dim fileData As String

CommonDialog1.ShowOpen

Open CommonDialog1.FileName For Input As #1

fileData = Input(LOF(1), 1)

Close #1

Text1.Text = fileData

End Sub

Private Sub Form_Load()

CommonDialog1.Filter = 'Text (*.txt)|*.txt|All files (*.*)|*.*'

End Sub

Page 317: tutoriale vba

Private Sub Form_Resize()

On Error Resume Next

If Me.ScaleWidth <= 120 + Command3.Width + 240 + Command2.Width + 120 + Command1.Width + 120 Then

Me.Width = 120 + Command3.Width + 240 + Command2.Width + 120 + Command1.Width + 120

End If

Text1.Move 120, 120, Me.ScaleWidth - 240, Me.ScaleHeight - 240 - Command1.Height - 120

Command3.Move 120, Text1.Height + 240

Command2.Move Command3.Width + 240, Text1.Height + 240

Command1.Move Me.ScaleWidth - Command1.Width - 120, Text1.Height + 240

End Sub

Private Sub Command1_Click()

Unload Me

End Sub

Private Sub Form_Load()

End Sub

Page 318: tutoriale vba

7) Aplicatie pentru un centru de vanzare si inchiriere carti, reviste, ziare.

Option Explicit

Dim k As Integer

Dim strText As String

Private Sub Form_Activate()

strText = String(30, ' ') + 'Va multumim pentru vizita la Centrul nostru de vanzari si inchirieri - carti,reviste,ziare'

Timer1.Enabled = True

Text1.Text = 'Centru de inchirieri si vanzare' & vbCrLf & 'carti, reviste, ziare'

Text2.SetFocus

Page 319: tutoriale vba

k = 1

End Sub

Private Sub Timer1_Timer()

strText = Mid(strText, 2) & Left(strText, 1)

Text2.Text = strText

k = k + 1

If k = 30 Then

Form5.Show

End If

End Sub

Page 320: tutoriale vba

Private Sub bare_instrumente_Click()

BaraInstrumente.Show

End Sub

Private Sub Clienti_Click()

Clientii.Show

End Sub

Private Sub Clienti_inchi_vanz_Click()

ClientiInchiVanz.Show

End Sub

Private Sub Command1_Click()

End

End Sub

Private Sub culori_Click()

aspect.Show

End Sub

Private Sub exit_Click()

End

End Sub

Private Sub Form_Load()

DBDir = App.Path

DBName = 'data'

Unload Splash

Unload Form5

Page 321: tutoriale vba

If parolacon = 'admin' Then

setari.Visible = True

Else

setari.Visible = False

End If

DB.Close

'Set DB = OpenDatabase(DBDir & DBName)

'Setdata1.recordset= DB.OpenRecordset('table1')

End Sub

Private Sub generare_app_Click()

MsgBox ' Se genereaza Baza de date - numai la incarcarea aplicatiei pentru prima oara'

'Kill ('C:proiectVBdata.mdb')

MsgBox 'Recreati Baza de Date ?', vbYesNo

If vbYes Then

Kill App.Path & 'data.mdb'

'1) Creaza baza de date DATA

'Set DB = CreateDatabase(App.Path & 'data', dbLangGeneral, dbEncrypt)

Set DB = CreateDatabase(App.Path & 'data', dbLangGeneral)

End If

'2) Creaza tabela clienti

MsgBox 'Doriti crearea tbelei CLIENTI ?', vbYesNo

If vbYes Then

Page 322: tutoriale vba

DB.Execute 'CREATE TABLE clienti' & '( nume_pren CHAR (30),legit int, cnp char(13),datan date);'

DB.Execute 'insert into clienti (nume_pren ,legit , cnp , datan) values ('Ionescu Ion',1, '1234567890123', '21/10/1986');'

End If

'3) Creaza tabela PRODUSE

MsgBox 'Doriti crearea tbelei PRODUSE ?', vbYesNo

If vbYes Then

DB.Execute 'CREATE TABLE PRODUSE ' & '(tipprod CHAR (7), numeprod CHAR (20), prez char (50), autedit char(50), evbib char(1), inchiriat char(1), pret INT, cant int, imag char (20));'

DB.Execute 'insert into PRODUSE (tipprod,numeprod,prez,autedit,evbib,inchiriat,pret,cant,imag) values ('ziar', 'ZIARUL', 'cotidian central','tipografia ziarul','0','0',1,1,'ziarul.jpg'); '

End If

'4) Creaza tabela miscari

MsgBox 'Doriti crearea tbelei MISCARI ?', vbYesNo

If vbYes Then

DB.Execute 'CREATE TABLE MISCARI ' & '(legit INT, cnp CHAR(13), numeprod CHAR (20), tipprod char (1), pret int, datai date, dataimp date,datares date, tipop char (1) );'

DB.Execute 'insert into miscari (legit) values ('1'); '

End If

'5) Creaza tabela parole

MsgBox 'Doriti crearea tbelei PAROLE ?', vbYesNo

If vbYes Then

Page 323: tutoriale vba

DB.Execute 'CREATE TABLE parole ' & '(user CHAR (20), parola char (6), drepturi char (13) );'

DB.Execute 'insert into parole (user, parola, drepturi) values ('Admin','admin','administrator'); '

DB.Execute 'insert into parole (user, parola, drepturi) values ('Operator1','op1','operator'); '

DB.Execute 'insert into parole (user, parola, drepturi) values ('Operator2','op2','operator'); '

End If

DB.Close

MsgBox 'Baza de date OK'

End Sub

Private Sub imagini_Click()

ModificareImagini.Show

End Sub

Private Sub imprumuturi_Click()

Imprumutury.Show

End Sub

Private Sub Incasari_Click()

Inkasari.Show

End Sub

Private Sub inregistrare_client_Click()

InregistrareClient.Show

End Sub

Private Sub intrari_prod_Click()

Page 324: tutoriale vba

produseNoi.Show

End Sub

Private Sub parola_Click()

Parole.Show

End Sub

Private Sub Penalizari_Click()

Penalizarile.Show

End Sub

Private Sub prod_neret_Click()

Prodneret.Show

End Sub

Private Sub Produse_Click()

Prods.Show

End Sub

Private Sub produse_existente_Click()

ProduseExistente.Show

End Sub

Private Sub produse_inchiriate_Click()

ProduseInchiriate.Show

End Sub

Private Sub produse_returnate_Click()

Prodreturn.Show

End Sub

Page 325: tutoriale vba

Private Sub restantieri_Click()

Restantierii.Show

End Sub

Private Sub text_Click()

ModificareText.Show

End Sub

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)

If Button.Index = 1 Then

Imprumutury.Show

End If

If Button.Index = 2 Then

Vanzari.Show

End If

If Button.Index = 3 Then

InregistrareClient.Show

End If

If Button.Index = 4 Then

ProduseExistente.Show

End If

If Button.Index = 5 Then

Restantierii.Show

End If

If Button.Index = 6 Then

Page 326: tutoriale vba

produseNoi.Show

End If

End Sub

Private Sub tot_pro_client_Click()

Totprod.Show

End Sub

Private Sub Vanzare_Click()

Vanzari.Show

End Sub

Private Sub Combo1_Click()

DBDir = App.Path

Page 327: tutoriale vba

DBName = 'data.mdb'

Data1.DatabaseName = DBDir & DBName

Data1.RecordSource = 'select numeprod,pret from produse where trim(tipprod) = '' & Trim(Combo1.Text) & '''

Data1.Refresh

Data1.Recordset.MoveLast

'MsgBox Data1.Recordset.RecordCount

If Data1.Recordset.RecordCount > 0 Then

Combo2.Clear

Data1.Recordset.MoveFirst

While Not Data1.Recordset.EOF

Combo2.AddItem Data1.Recordset.Fields(0)

Data1.Recordset.MoveNext

Wend

Combo2.Text = Combo2.List(0)

End If

End Sub

Private Sub Combo2_Click()

Data1.Recordset.MoveFirst

Data1.Recordset.Move Combo2.ListIndex

Text4.Text = Data1.Recordset.Fields(1)

End Sub

Private Sub Command1_Click()

Page 328: tutoriale vba

InregistrareClient.Show

Command2.Visible = True

Text1.Visible = False

Text2.Visible = False

Text3.Visible = False

End Sub

Private Sub Command2_Click()

Text1.Visible = True

Text2.Visible = True

Text3.Visible = True

Text1.Text = legitg

Text2.Text = cnpg

Text3.Text = numeg

Command2.Visible = False

Text5.SetFocus

End Sub

Private Sub Command3_Click()

Data1.Recordset.Close

Data1.Database.Close

DBDir = App.Path

DBName = 'data.mdb'

Set DB = OpenDatabase(DBDir & DBName)

Page 329: tutoriale vba

'DB.Execute 'CREATE TABLE MISCARI ' & '(legit INT,cnp CHAR(13), numeprod CHAR (20), tipprod char (1), pret int, datai date, dataimp date,datares date, tipop char (1) );'

DB.Execute 'insert into miscari (legit,cnp,numeprod,tipprod,pret,datai,dataimp,datares,tipop) values ('' _

& Text1.Text & '', '' _

& Text2.Text & '', '' _

& Combo2.Text & '', '' _

& Combo1.Text & '', '' _

& Text4.Text & '', '' _

& Text6.Text & '', '' _

& Text6.Text & '', '' _

& Text7.Text & '', '1');'

End Sub

Private Sub Command4_Click()

'DB.Close

Unload Me

End Sub

Private Sub Form_Load()

Combo1.Clear

Combo1.AddItem 'carte'

Combo1.AddItem 'revista'

Combo1.AddItem 'ziar'

Combo1.Text = 'carte'

Text1.Visible = False

Page 330: tutoriale vba

Text2.Visible = False

Text3.Visible = False

Command2.Visible = False

Text6.Text = Mid(Now, 1, 10)

End Sub

Private Sub Text5_LostFocus()

Text8.Text = Val(Text5.Text) * Val(Text4.Text)

End Sub

Page 331: tutoriale vba

Private Sub Combo1_Click()

DBDir = App.Path

DBName = 'data.mdb'

Data1.DatabaseName = DBDir & DBName

Data1.RecordSource = 'select numeprod,pret from produse where trim(tipprod) = '' & Trim(Combo1.Text) & '''

Data1.Refresh

Data1.Recordset.MoveLast

'MsgBox Data1.Recordset.RecordCount

If Data1.Recordset.RecordCount > 0 Then

Page 332: tutoriale vba

Combo2.Clear

Data1.Recordset.MoveFirst

While Not Data1.Recordset.EOF

Combo2.AddItem Data1.Recordset.Fields(0)

Data1.Recordset.MoveNext

Wend

Combo2.Text = Combo2.List(0)

End If

End Sub

Private Sub Combo2_Click()

Data1.Recordset.MoveFirst

Data1.Recordset.Move Combo2.ListIndex

Text4.Text = Data1.Recordset.Fields(1)

End Sub

Private Sub Command1_Click()

InregistrareClient.Show

Command2.Visible = True

Text1.Visible = False

Text2.Visible = False

Text3.Visible = False

End Sub

Private Sub Command2_Click()

Text1.Visible = True

Page 333: tutoriale vba

Text2.Visible = True

Text3.Visible = True

Text1.Text = legitg

Text2.Text = cnpg

Text3.Text = numeg

Command2.Visible = False

Text5.SetFocus

End Sub

Private Sub Command3_Click()

Data1.Recordset.Close

Data1.Database.Close

DBDir = App.Path

DBName = 'data.mdb'

Set DB = OpenDatabase(DBDir & DBName)

MsgBox Text2.Text

'DB.Execute 'CREATE TABLE MISCARI ' & '(legit INT,cnp CHAR(13), numeprod CHAR (20), tipprod char (1), pret int, datai date, dataimp date,datares date, tipop char (1) );'

DB.Execute 'insert into miscari (legit,cnp,numeprod,tipprod,pret,datai,dataimp,datares,tipop) values ('' _

& Text1.Text & '', '' _

& Text2.Text & '', '' _

& Combo2.Text & '', '' _

& Combo1.Text & '', '' _

& Text4.Text & '', '' _

Page 334: tutoriale vba

& Text6.Text & '', '' _

& Text6.Text & '', '' _

& Text6.Text & '', '0');'

End Sub

Private Sub Command4_Click()

'DB.Close

Unload Me

End Sub

Private Sub Form_Load()

Combo1.Clear

Combo1.AddItem 'carte'

Combo1.AddItem 'revista'

Combo1.AddItem 'ziar'

Combo1.Text = 'carte'

Text1.Visible = False

Text2.Visible = False

Text3.Visible = False

Command2.Visible = False

Text6.Text = Mid(Now, 1, 10)

End Sub

Private Sub Text5_LostFocus()

Text8.Text = Val(Text5.Text) * Val(Text4.Text)

End Sub

Page 335: tutoriale vba

Public i As Integer

Private Sub Command1_Click()

Data1.Recordset.Close

Data1.Database.Close

Unload Me

End Sub

Private Sub Command2_Click()

Text1.Text = ''

Text2.Text = ''

Text3.Text = ''

Text4.Text = ''

Page 336: tutoriale vba

Command5.Visible = True

Command6.Visible = True

Command2.Visible = False

Command3.Visible = False

Command4.Visible = False

Label6.Caption = 'ADAUGARE CLIENT'

i = 1

Text1.SetFocus

End Sub

Private Sub Command3_Click()

Command5.Visible = True

Command6.Visible = True

Label6.Caption = 'MODIFICARE CLIENT'

i = 2

Text1.SetFocus

End Sub

Private Sub Command4_Click()

Command5.Visible = True

Command6.Visible = True

Label6.Caption = 'STERGE CLIENT'

i = 3

Command5.Caption = 'OK'

Command5.SetFocus

Page 337: tutoriale vba

End Sub

Private Sub Command5_Click()

Select Case i

Case 1

Data1.Recordset.AddNew

Data1.Recordset.Fields(0) = Text1.Text

Data1.Recordset.Fields(1) = Text2.Text

Data1.Recordset.Fields(2) = Text3.Text

Data1.Recordset.Fields(3) = Text4.Text

Data1.Recordset.Update

Data1.Refresh

Case 2

'MsgBox 'edit'

Data1.Recordset.MoveFirst

Data1.Recordset.Move ItemIndex - 1

Data1.Recordset.Edit

Data1.Recordset.Fields(0) = Text1.Text

Data1.Recordset.Fields(1) = Text2.Text

Data1.Recordset.Fields(2) = Text3.Text

Data1.Recordset.Fields(3) = Text4.Text

Data1.Recordset.Update

Data1.Refresh

Case 3

Page 338: tutoriale vba

Data1.Recordset.MoveFirst

With Data1.Recordset

.Move ItemIndex - 1

.Delete

End With

Data1.Refresh

End Select

Command5.Caption = 'Save'

Command5.Visible = False

Command6.Visible = False

Command2.Visible = True

Command3.Visible = True

Command4.Visible = True

Label6.Caption = 'Inregistrare clienti'

Data1.Recordset.MoveFirst

ListView1.ListItems.Clear

Do While Not Data1.Recordset.EOF

Set LI = ListView1.ListItems.Add(, , Data1.Recordset.Fields(0))

LI.SubItems(1) = Data1.Recordset.Fields(1)

LI.SubItems(2) = Data1.Recordset.Fields(2)

LI.SubItems(3) = Data1.Recordset.Fields(3)

Data1.Recordset.MoveNext

Loop

Page 339: tutoriale vba

Text1.Text = ''

Text2.Text = ''

Text3.Text = ''

Text4.Text = ''

Command5.Visible = False

Command6.Visible = False

Command3.Visible = False

Command4.Visible = False

i = 0

End Sub

Private Sub Command6_Click()

Command5.Caption = 'Save'

Command5.Visible = False

Command6.Visible = False

Command2.Visible = True

Command3.Visible = False

Command4.Visible = False

Label6.Caption = 'Inregistrare clienti'

End Sub

Private Sub Form_Load()

DBDir = App.Path

DBName = 'data.mdb'

Page 340: tutoriale vba

Data1.DatabaseName = DBDir & DBName

Data1.RecordSource = 'select * from clienti'

'MsgBox Data1.Recordset.RecordCount

Data1.Refresh

If Data1.Recordset.RecordCount > 0 Then

Data1.Recordset.MoveFirst

End If

Data1.Recordset.MoveFirst

ListView1.ListItems.Clear

Do While Not Data1.Recordset.EOF

Set LI = ListView1.ListItems.Add(, , Data1.Recordset.Fields(0))

LI.SubItems(1) = Data1.Recordset.Fields(1)

LI.SubItems(2) = Data1.Recordset.Fields(2)

LI.SubItems(3) = Data1.Recordset.Fields(3)

Data1.Recordset.MoveNext

Loop

Text1.Text = ''

Text2.Text = ''

Text3.Text = ''

Text4.Text = ''

Command5.Visible = False

Command6.Visible = False

Page 341: tutoriale vba

Command3.Visible = False

Command4.Visible = False

i = 0

End Sub

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)

ItemIndex = ListView1.SelectedItem.Index

Text1.Text = ListView1.ListItems.Item(ItemIndex)

Text2.Text = ListView1.ListItems(ItemIndex).SubItems(1)

Text3.Text = ListView1.ListItems(ItemIndex).SubItems(2)

Text4.Text = ListView1.ListItems(ItemIndex).SubItems(3)

Command3.Visible = True

Command4.Visible = True

legitg = Text2.Text

cnpg = Text3.Text

numeg = Text1.Text

End Sub

Public Sub ColumnSort(ListViewControl As ListView, Column As ColumnHeader)

With ListViewControl

If .SortKey <> Column.Index - 1 Then

.SortKey = Column.Index - 1

.SortOrder = lvwAscending

Else

Page 342: tutoriale vba

If .SortOrder = lvwAscending Then

.SortOrder = lvwDescending

Else

.SortOrder = lvwAscending

End If

End If

.Sorted = -1

End With

End Sub

Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

Call ColumnSort(ListView1, ColumnHeader)

End Sub

Page 343: tutoriale vba

Private Sub Command1_Click()

Unload Me

End Sub

Private Sub Form_Load()

DBDir = App.Path

DBName = 'data.mdb'

Data1.DatabaseName = DBDir & DBName

Data1.RecordSource = 'select numeprod as Denumire_produs,pret,cant from produse order by tipprod'

Data1.Refresh

If Data1.Recordset.RecordCount > 0 Then

MSFlexGrid1.Visible = True

Page 344: tutoriale vba

End If

End Sub

Private Sub Form_Load()

DBDir = App.Path

DBName = 'data.mdb'

Data1.DatabaseName = DBDir & DBName

Data1.RecordSource = 'select a.legit ,a.cnp ,b.nume_pren ,b.datan from miscari a, clienti b where (a.legit = b.legit) and (a.tipop = '1') and (a.datares<date())'

Data1.Refresh

Page 345: tutoriale vba

If Data1.Recordset.RecordCount > 0 Then

MSFlexGrid1.Visible = True

End If

End Sub

Page 346: tutoriale vba

Private Sub Command1_Click()

Dim struser As String

Dim strparola As String

Dim strdrept As String

DBDir = App.Path

DBName = 'data.mdb'

Data1.DatabaseName = DBDir & DBName

Data1.RecordSource = 'produse'

Data1.Refresh

Page 347: tutoriale vba

If Data1.Recordset.RecordCount > 0 Then

Data1.Recordset.MoveFirst

End If

If Option1.Value = True Then

With Data1.Recordset

.AddNew

!tipprod = Trim(Combo1.Text)

!numeprod = Trim(Text2.Text)

!prez = Trim(Text3.Text)

!autedit = Text4.Text

If Combo2.Text = 'Se inchiriaza' Then

!evbib = 1

Else

!evbib = 0

End If

!inchiriat = 0

!pret = Text1.Text

!cant = Text5.Text

Page 348: tutoriale vba

!imag = numeimg

.Update

End With

Dir1.Visible = False

Frame1.Visible = True

Label9.Visible = False

File1.Visible = False

Image1.Visible = False

Call Option4_Click

End If

'==================================================

If Option2.Value = True Then

With Data1.Recordset

.Move ItemIndex - 1

.Edit

!tipprod = Trim(Combo1.Text)

!numeprod = Trim(Text2.Text)

!prez = Trim(Text3.Text)

!autedit = Text4.Text

If Combo2.Text = 'Se inchiriaza' Then

!evbib = 1

Page 349: tutoriale vba

Else

!evbib = 0

End If

!inchiriat = 0

!pret = Text1.Text

!cant = Text5.Text

!imag = numeimg

.Update

End With

Dir1.Visible = False

Frame1.Visible = True

Label9.Visible = False

File1.Visible = False

Image1.Visible = False

Call Option4_Click

End If

'=============================================

If Option3.Value = True Then

struser = Trim(Text1.Text)

strparola = Trim(Text2.Text)

strdrept = Trim(Combo1.Text)

MsgBox 'Chiar doriti sa stergeti ?', vbYesNo

If vbOK Then

Page 350: tutoriale vba

With Data1.Recordset

.Move ItemIndex - 1

.Delete

End With

End If

End If

'===========================================

Data1.Refresh

Data1.Recordset.MoveFirst

ListView1.ListItems.Clear

Do While Not Data1.Recordset.EOF

Set LI = ListView1.ListItems.Add(, , Data1.Recordset.Fields('tipprod'))

LI.SubItems(1) = Data1.Recordset.Fields('numeprod')

LI.SubItems(2) = Data1.Recordset.Fields('prez')

LI.SubItems(3) = Data1.Recordset.Fields('autedit')

LI.SubItems(4) = Data1.Recordset.Fields('evbib')

LI.SubItems(5) = Data1.Recordset.Fields('inchiriat')

LI.SubItems(6) = Data1.Recordset.Fields('pret')

LI.SubItems(7) = Data1.Recordset.Fields('cant')

LI.SubItems(8) = Data1.Recordset.Fields('imag')

numeimg = Data1.Recordset.Fields('imag')

Data1.Recordset.MoveNext

Loop

Page 351: tutoriale vba

Command1.Visible = False

Command3.Visible = False

Option4.Value = True

End Sub

Private Sub Command2_Click()

DB.Close

Unload Me

End Sub

Private Sub Command3_Click()

Command1.Visible = False

Command3.Visible = False

Option4.Value = True

Dir1.Visible = False

File1.Visible = False

Image1.Visible = False

Label9.Visible = False

Frame1.Visible = True

End Sub

Private Sub Dir1_Change()

File1.Path = Dir1.Path

File1.Pattern = '*.jpg'

End Sub

Page 352: tutoriale vba

Private Sub File1_Click()

Command1.Visible = True

Command3.Visible = True

Dim X As Picture

Set X = LoadPicture(File1.Path & '' & File1.FileName)

Set Image1.Picture = X

numeimg = File1.FileName

End Sub

Private Sub Form_Load()

DBDir = App.Path

DBName = 'data.mdb'

Combo1.Clear

Combo1.AddItem 'carte'

Combo1.AddItem 'revista'

Combo1.AddItem 'ziar'

Combo1.Text = 'carte'

Combo2.Clear

Combo2.AddItem 'Se inchiriaza'

Combo2.AddItem 'Se vinde'

Combo2.Text = 'Se vinde'

Command1.Visible = False

Command3.Visible = False

Page 353: tutoriale vba

Label9.Visible = False

Frame1.Visible = True

Option4.Value = True

File1.Pattern = '*.jpg'

Dir1.Path = App.Path & 'imagini'

Dir1.Visible = False

File1.Visible = False

Image1.Visible = True

Data1.DatabaseName = DBDir & DBName

Data1.RecordSource = 'produse'

Data1.Refresh

If Data1.Recordset.RecordCount > 0 Then

Data1.Recordset.MoveFirst

End If

End Sub

Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)

Dim X As Picture

ItemIndex = ListView1.SelectedItem.Index

Combo1.Text = ListView1.ListItems.Item(ItemIndex)

Text2.Text = ListView1.ListItems(ItemIndex).SubItems(1)

Text3.Text = ListView1.ListItems(ItemIndex).SubItems(2)

Text4.Text = ListView1.ListItems(ItemIndex).SubItems(3)

Page 354: tutoriale vba

numeimg = RTrim(ListView1.ListItems(ItemIndex).SubItems(8))

'Path = 'D:ProiecteVBproiectVBimagini'

Path = App.Path + 'imagini'

Set X = LoadPicture(Path & RTrim(ListView1.ListItems(ItemIndex).SubItems(8)))

Set Image1.Picture = X

Image1.Visible = True

Combo2.Text = ListView1.ListItems(ItemIndex).SubItems(4)

Text1.Text = ListView1.ListItems(ItemIndex).SubItems(5)

Text5.Text = ListView1.ListItems(ItemIndex).SubItems(6)

End Sub

Private Sub Option1_Click()

If Option1.Value = True Then

Dir1.Visible = True

File1.Visible = True

Image1.Visible = True

Label9.Visible = True

Frame1.Visible = False

Text2.Text = ''

Text3.Text = ''

Text1.Text = ''

Text5.Text = ''

Page 355: tutoriale vba

'Command1.Visible = True

Command3.Visible = True

DBDir = App.Path

DBName = 'data.mdb'

Data1.Refresh

Data1.Recordset.MoveFirst

ListView1.ListItems.Clear

Do While Not Data1.Recordset.EOF

Set LI = ListView1.ListItems.Add(, , Data1.Recordset.Fields('tipprod'))

LI.SubItems(1) = Data1.Recordset.Fields('numeprod')

LI.SubItems(2) = Data1.Recordset.Fields('prez')

LI.SubItems(3) = Data1.Recordset.Fields('autedit')

LI.SubItems(4) = Data1.Recordset.Fields('evbib')

LI.SubItems(5) = Data1.Recordset.Fields('inchiriat')

LI.SubItems(6) = Data1.Recordset.Fields('pret')

LI.SubItems(7) = Data1.Recordset.Fields('cant')

LI.SubItems(8) = Data1.Recordset.Fields('imag')

Data1.Recordset.MoveNext

Loop

Text1.Text = ''

Text2.Text = ''

End If

End Sub

Page 356: tutoriale vba

Private Sub Option2_Click()

'Data1.Refresh

Dir1.Visible = True

File1.Visible = True

Image1.Visible = True

Label9.Visible = True

Frame1.Visible = False

Command1.Visible = True

Command3.Visible = True

Call ListView1_ItemClick(ListView1.SelectedItem)

ListView1.SetFocus

End Sub

Private Sub Option3_Click()

Data1.Refresh

Command1.Visible = True

Command3.Visible = True

If Option3.Value = True Then

Call ListView1_ItemClick(ListView1.SelectedItem)

ListView1.SetFocus

End If

End Sub

Private Sub Option4_Click()

Set DB = OpenDatabase(DBDir & DBName)

Page 357: tutoriale vba

Data1.DatabaseName = DBDir & DBName

Data1.RecordSource = 'produse'

Data1.Refresh

If Data1.Recordset.RecordCount > 0 Then

Data1.Recordset.MoveFirst

End If

'Data1.Recordset.MoveFirst

ListView1.ListItems.Clear

Do While Not Data1.Recordset.EOF

Set LI = ListView1.ListItems.Add(, , Data1.Recordset.Fields('tipprod'))

LI.SubItems(1) = Data1.Recordset.Fields('numeprod')

LI.SubItems(2) = Data1.Recordset.Fields('prez')

LI.SubItems(3) = Data1.Recordset.Fields('autedit')

LI.SubItems(4) = Data1.Recordset.Fields('evbib')

LI.SubItems(5) = Data1.Recordset.Fields('inchiriat')

LI.SubItems(6) = Data1.Recordset.Fields('pret')

LI.SubItems(7) = Data1.Recordset.Fields('cant')

LI.SubItems(8) = Data1.Recordset.Fields('imag')

Data1.Recordset.MoveNext

Loop

Call ListView1_ItemClick(ListView1.SelectedItem)

End Sub

Page 358: tutoriale vba

8) Aplicatie pentru o casa de schimb valutar.

Private Function calc_stoc(smb As String) As Double

Dim valoare(100) As Integer, stoc_disp(100) As Double

nr_bancnote = 0

fiss2 = FreeFile

Open 'stocuri/stoc_' + smb + '.dat' For Input As fiss2

While Not EOF(fiss2)

nr_bancnote = nr_bancnote + 1

Input #fiss2, valoare(nr_bancnote), stoc_disp(nr_bancnote)

Wend

Close fiss2

total = 0

For i = 1 To nr_bancnote

Page 359: tutoriale vba

total = total + valoare(i) * stoc_disp(i)

Next i

calc_stoc = total

End Function

Private Sub incarca_valute()

Dim q_simbol(100) As String, q_vanzare(100) As Double, q_cumparare(100) As Double

Combo1.Clear

Combo1.AddItem '-'

k = 0

fiss = FreeFile

Open 'valute.dat' For Input As fiss

While Not EOF(fiss)

k = k + 1

Input #fiss, q_simbol(k), q_vanzare(k), q_cumparare(k)

Wend

Close fiss

max_val = 0

For w = 1 To k

stc = calc_stoc(q_simbol(w))

If stc > 0 Then

max_val = max_val + 1

Page 360: tutoriale vba

simbol(max_val) = q_simbol(w)

vanzare(max_val) = q_vanzare(w)

cumparare(max_val) = q_cumparare(w)

stoc(max_val) = stc

Combo1.AddItem UCase(simbol(max_val))

End If

Next w

Combo1.ListIndex = 0

End Sub

Private Sub admin_stocuri_Click()

main.Enabled = False

pass_stocuri.Visible = True

End Sub

Private Sub admin_utilizatori_Click()

main.Enabled = False

pass_users.Visible = True

End Sub

Private Sub Combo1_Click()

If Combo1.ListIndex = 0 Then

lbl_cantitate.Caption = '-'

lbl_cumparare.Caption = '-'

lbl_vanzare.Caption = '-'

Page 361: tutoriale vba

Else

lbl_cantitate.Caption = Str(stoc(Combo1.ListIndex))

lbl_vanzare.Caption = Str(vanzare(Combo1.ListIndex))

lbl_cumparare.Caption = Str(cumparare(Combo1.ListIndex))

End If

End Sub

Private Sub Command1_Click()

permis = True

If Combo1.ListCount = 1 Then

x = MsgBox('Nu exista nici un tip de valuta disponibila pt tranzactii!', vbInformation, 'Info')

Exit Sub

End If

If Combo1.ListIndex = 0 Then

x = MsgBox('Nu ati selectat nici un tip de valuta!', vbExclamation, 'Atentie')

permis = False

Else

If Trim(Text3.Text) = '' Then

x = MsgBox('Nu ati introdus nici o cantitate', vbExclamation, 'Atentie')

permis = False

End If

End If

If permis Then

Page 362: tutoriale vba

If Option1.Value = True Then

opp = 'cumparata'

Else

opp = 'vanduta'

End If

If (opp = 'vanduta') And (Val(Text3.Text) > Val(lbl_cantitate)) Then

x = MsgBox('Cantitatea selectata pt vanzare este mai mare decat stocul!', vbExclamation, 'Atentie')

Else

List1.AddItem Trim(Text3.Text) + ' ' + Trim(Combo1.Text) + ' / ' + opp

End If

End If

End Sub

Private Sub Command2_Click()

If List1.ListCount > 0 Then

idx = List1.ListIndex

If idx < 0 Then

x = MsgBox('Nu ati selectat nici o tranzactie!', vbInformation, 'Info')

Else

x = MsgBox('Confirmati stergerea tranzactiei selectate?', vbYesNo, 'Confirmare')

If x = 6 Then

List1.RemoveItem idx

End If

Page 363: tutoriale vba

End If

Else

x = MsgBox('Cosul de tranzactii este gol!', vbInformation, 'Info')

End If

End Sub

Private Sub Command3_Click()

If List1.ListCount > 0 Then

x = MsgBox('Confirmati golirea cosului?', vbYesNo, 'Confirmare')

If x = 6 Then List1.Clear

Else

x = MsgBox('Cosul de tranzactii este gol!', vbInformation, 'Info')

End If

End Sub

Private Sub Command4_Click()

Unload Me

End Sub

Private Sub Command5_Click()

If List1.ListCount = 0 Then

x = MsgBox('Nu exista nici o tranzactie in cos!', vbInformation, 'Info')

Else

If Trim(Text1.Text) = '' Then

x = MsgBox('Nu ati completat numele cumparatorului!', vbExclamation, 'Atentie')

Else

Page 364: tutoriale vba

If Trim(Text2.Text) = '' Then

x = MsgBox('Nu ati completat CNP-ul cumparatorului!', vbExclamation, 'Atentie')

Else

List1.Clear

Text1.Text = ''

Text2.Text = ''

Text3.Text = ''

x = MsgBox('Tranzactii incheiate cu succes!', vbInformation, 'Info')

End If

End If

End If

End Sub

Private Sub Form_Load()

Call incarca_valute

End Sub

Page 365: tutoriale vba

Dim t_simbol(100) As String, t_vanzare(100) As Double, t_cumparare(100) As Double

Dim valoare(100) As Integer, stoc_disp(100) As Double, vall(1000) As Integer, seria(1000) As String

Dim permis As Boolean, nr_bancnote As Integer, total As Double, tot_hartii As Integer

Private Sub refresh_tip_banc()

Combo2.Clear

total = 0

For i = 1 To nr_bancnote

total = total + valoare(i) * stoc_disp(i)

Combo2.AddItem valoare(i)

Next i

Page 366: tutoriale vba

Combo2.ListIndex = 0

End Sub

Private Sub refresh_bancnote()

List1.Clear

For i = 1 To tot_hartii

If (Trim(Combo2.Text) = vall(i)) Then

List1.AddItem seria(i)

End If

Next i

End Sub

Private Function refresh_tot(smb As String)

nr_bancnote = 0

fiss2 = FreeFile

Open 'stocuri/stoc_' + smb + '.dat' For Input As fiss2

While Not EOF(fiss2)

nr_bancnote = nr_bancnote + 1

Input #fiss2, valoare(nr_bancnote), stoc_disp(nr_bancnote)

Wend

Close fiss2

Call refresh_tip_banc

Label13.Caption = Combo1.Text

Page 367: tutoriale vba

Label9.Caption = Combo1.Text

Label10.Caption = Combo1.Text

Label14.Caption = Str(total)

tot_hartii = 0

fiss3 = FreeFile

Open 'bancnote/banc_' + smb + '.dat' For Input As fiss3

While Not EOF(fiss3)

tot_hartii = tot_hartii + 1

Input #fiss3, vall(tot_hartii), seria(tot_hartii)

Wend

Close fiss3

Call refresh_bancnote

End Function

Private Sub resetcolor(coll As String)

Label1.ForeColor = coll

Label2.ForeColor = coll

Label3.ForeColor = coll

Label5.ForeColor = coll

Label6.ForeColor = coll

End Sub

Page 368: tutoriale vba

Private Sub verifica(q As Integer, coll2 As String)

permis = True

resetcolor (&H0&)

Select Case q

Case 1:

exista = False

For i = 0 To Combo2.ListCount - 1

If Combo2.List(i) = Trim(Text3.Text) Then

exista = True

Exit For

End If

Next i

If (Trim(Text3.Text) = '') Or (exista = True) Then

Label5.ForeColor = coll2

permis = False

End If

If Trim(Text4.Text) = '' Then

Label6.ForeColor = coll2

permis = False

End If

Case 2:

If Trim(Text2.Text) = '' Then

Label4.ForeColor = coll2

Page 369: tutoriale vba

permis = False

End If

If Trim(Text3.Text) = '' Then

Label5.ForeColor = coll2

permis = False

End If

End Select

End Sub

Private Sub incarca()

Combo1.Clear

tot_val = 0

fiss = FreeFile

Open 'valute.dat' For Input As fiss

While Not EOF(fiss)

tot_val = tot_val + 1

Input #fiss, t_simbol(tot_val), t_vanzare(tot_val), t_cumparare(tot_val)

Combo1.AddItem UCase(t_simbol(tot_val))

Wend

Close fiss

Combo1.ListIndex = 0

Page 370: tutoriale vba

End Sub

Private Sub Combo1_Click()

If modif = True Then

x = MsgBox('Au fost efectuate modificari ce nu au fost salvate! Continuati?', vbYesNo, 'Confirmare')

If x = 6 Then

modif = False

Text1.Text = t_vanzare(Combo1.ListIndex + 1)

Text2.Text = t_cumparare(Combo1.ListIndex + 1)

Call refresh_tot(Combo1.Text)

End If

Else

Text1.Text = t_vanzare(Combo1.ListIndex + 1)

Text2.Text = t_cumparare(Combo1.ListIndex + 1)

Call refresh_tot(Combo1.Text)

End If

End Sub

Private Sub Combo2_Click()

Label11.Caption = stoc_disp(Combo2.ListIndex + 1)

Call refresh_bancnote

End Sub

Private Sub Command1_Click()

Call verifica(1, &HFF&)

Page 371: tutoriale vba

If permis = False Then

x = MsgBox('Exista erori in completarea unor campuri obligatorii!', vbExclamation, 'Atentie')

Else

x = MsgBox('Confirmati adaugarea tipului de moneda?', vbYesNo, 'Confirmare')

If x = 6 Then

If valoare(1) > Val(Trim(Text3.Text)) Then

nr_bancnote = nr_bancnote + 1

For j = nr_bancnote To 2

valoare(j) = valoare(j - 1)

stoc_disp(j) = stoc_disp(j - 1)

Next j

valoare(1) = Val(Trim(Text3.Text))

stoc_disp(1) = Val(Trim(Text4.Text))

Else

If valoare(nr_bancnote) < Val(Trim(Text3.Text)) Then

nr_bancnote = nr_bancnote + 1

valoare(nr_bancnote) = Val(Trim(Text3.Text))

stoc_disp(nr_bancnote) = Val(Trim(Text4.Text))

Else

For i = 1 To nr_bancnote - 1

If valoare(i) < Val(Trim(Text3.Text)) And (valoare(i + 1) > Val(Trim(Text3.Text))) Then

nr_bancnote = nr_bancnote + 1

Page 372: tutoriale vba

For j = nr_bancnote To i + 1

valoare(j) = valoare(j - 1)

stoc_disp(j) = stoc_disp(j - 1)

Next j

valoare(i + 1) = Val(Trim(Text3.Text))

stoc_disp(i + 1) = Val(Trim(Text4.Text))

Exit For

End If

Next i

End If

End If

Text3.Text = ''

modif = True

Call refresh_tip_banc

x = MsgBox('Tipul de bancnota a fost adaugat cu succes!', vbInformation, 'Info')

End If

End If

End Sub

Private Sub Command2_Click()

Text6.Text = ''

For i = 1 To 10

Randomize

Text6.Text = Trim(Text6.Text) + Trim(Str(Int(Rnd * 9)))

Page 373: tutoriale vba

Next i

Randomize

x = Int(Rnd * Combo2.ListCount)

Text5.Text = Combo2.List(x)

Command3.Enabled = True

End Sub

Private Sub Command3_Click()

x = MsgBox('Confirmati adaugarea bancnotei in stoc?', vbYesNo, 'Confirmare')

If x = 6 Then

For i = 0 To Combo2.ListCount - 1

If Combo2.List(i) = Val(Trim(Text5.Text)) Then

stoc_disp(i + 1) = stoc_disp(i + 1) + 1

End If

Next i

tot_hartii = tot_hartii + 1

vall(tot_hartii) = Val(Trim(Text5.Text))

seria(tot_hartii) = Trim(Text6.Text)

Call refresh_bancnote

modif = True

x = MsgBox('Bancnota a fost adaugata cu succes!', vbInformation, 'Info')

End If

End Sub

Page 374: tutoriale vba

Private Sub Command4_Click()

main.Enabled = True

Unload stocuri

End Sub

Private Sub Command5_Click()

x = MsgBox('Confirmati salvarea modificarilor?', vbYesNo, 'Confirmare')

If x = 6 Then

t_vanzare(Combo1.ListIndex + 1) = Trim(Text1.Text)

t_cumparare(Combo1.ListIndex + 1) = Trim(Text2.Text)

fiss = FreeFile

Open 'valute.dat' For Output As fiss

For i = 1 To Combo1.ListCount

Write #fiss, t_simbol(i), t_vanzare(i), t_cumparare(i)

Next i

Close fiss

fiss = FreeFile

Open 'stocuri/stoc_' + LCase(Trim(Combo1.Text)) + '.dat' For Output As fiss

For i = 1 To Combo2.ListCount

Write #fiss, valoare(i), stoc_disp(i)

Next i

Close fiss

Page 375: tutoriale vba

fiss = FreeFile

Open 'bancnote/banc_' + LCase(Trim(Combo1.Text)) + '.dat' For Output As fiss

For i = 1 To tot_hartii

Write #fiss, vall(i), seria(i)

Next i

Close fiss

modif = False

x = MsgBox('Modificarile au fost salvate!', vbInformation, 'Info')

End If

End Sub

Private Sub Command6_Click()

If List1.ListCount > 0 Then

idx = List1.ListIndex

If idx < 0 Then

x = MsgBox('Nu ati selectat nici o bancnota!', vbInformation, 'Info')

Else

x = MsgBox('Confirmati stergerea bancnotei selectate?', vbYesNo, 'Confirmare')

If x = 6 Then

For i = 1 To tot_hartii

If seria(i) = Trim(List1.List(idx)) Then

Page 376: tutoriale vba

For j = 0 To Combo2.ListCount - 1

If Combo2.List(j) = vall(i) Then

stoc_disp(j + 1) = stoc_disp(j + 1) - 1

End If

Next j

For j = i To tot_hartii - 1

seria(j) = seria(j + 1)

vall(j) = vall(j + 1)

Next j

tot_hartii = tot_hartii - 1

End If

Next i

List1.RemoveItem idx

End If

End If

Else

x = MsgBox('Stocul de bancnote cu aceasta valoare este nul!', vbInformation, 'Info')

End If

End Sub

Private Sub Form_Load()

modif = False

Call incarca

Call refresh_tot(Combo1.Text)

Page 377: tutoriale vba

End Sub

Dim user(100), parola(100) As String

Dim nr_usr As Integer, permis As Integer

Private Sub resetcolor(coll As String)

Label3.ForeColor = coll

Label4.ForeColor = coll

Label5.ForeColor = coll

End Sub

Private Sub verifica(q As Integer)

coll2 = &HFF&

permis = True

resetcolor (&H0&)

Select Case q

Case 1:

If Trim(Text1.Text) = '' Then

Label3.ForeColor = coll2

permis = False

Page 378: tutoriale vba

End If

Case 2:

If Trim(Text2.Text) = '' Then

Label4.ForeColor = coll2

permis = False

End If

If Trim(Text3.Text) = '' Then

Label5.ForeColor = coll2

permis = False

End If

End Select

End Sub

Private Sub scriere()

fiss = FreeFile

Open 'users.dat' For Output As fiss

For i = 1 To nr_usr

Write #fiss, user(i), parola(i)

Next i

Close fiss

End Sub

Private Sub refres()

nr_usr = 0

fiss = FreeFile

Page 379: tutoriale vba

Open 'users.dat' For Input As fiss

While Not EOF(fiss)

nr_usr = nr_usr + 1

Input #fiss, user(nr_usr), parola(nr_usr)

Wend

Close fiss

Combo1.Clear

For i = 1 To nr_usr

Combo1.AddItem user(i)

Next i

Combo1.ListIndex = 0

Label2.Caption = parola(1)

End Sub

Private Sub Combo1_Click()

idx = Combo1.ListIndex

Label2.Caption = parola(idx + 1)

End Sub

Private Sub Command1_Click()

Call verifica(1)

If permis = False Then

x = MsgBox('Exista erori in completarea campurilor obligatorii!', vbExclamation, 'Atentie')

Else

a = MsgBox('Sigur schimbati parola?', vbYesNo, 'Confirmnare')

Page 380: tutoriale vba

If a = 6 Then

ix = Combo1.ListIndex + 1

parola(ix) = Trim(Text1.Text)

Call scriere

x = MsgBox('Parola afost schimbata cu succes!', vbInformation, 'Info')

End If

Text1.Text = ''

Call refres

End If

End Sub

Private Sub Command2_Click()

ussr = Trim(Text2.Text)

psss = Trim(Text3.Text)

Call verifica(2)

If permis = False Then

x = MsgBox('Exista erori in completarea campurilor obligatorii!', vbExclamation, 'Atentie')

Else

x = MsgBox('Confirmati adaugarea utilizatorului?', vbYesNo, 'Confirmare')

If x = 6 Then

fiss = FreeFile

Open 'users.dat' For Append As fiss

Write #fiss, ussr, psss

Close fiss

Page 381: tutoriale vba

x = MsgBox('Utilizatorul a fost adaugat!', vbInformation, 'Info')

Text2.Text = ''

Text3.Text = ''

Call refres

End If

End If

End Sub

Private Sub Command3_Click()

main.Enabled = True

Unload users

End Sub

Private Sub Command4_Click()

Maxx = Combo1.ListCount

If Maxx > 1 Then

a = MsgBox('Sigur stergeti utilizatorul?', vbYesNo, 'Confirmnare')

If a = 6 Then

ix = Combo1.ListIndex + 1

For i = ix To nr_usr - 1

user(i) = user(i + 1)

parola(i) = parola(i + 1)

Next i

nr_usr = nr_usr - 1

Call scriere

Page 382: tutoriale vba

x = MsgBox('Utilizatorul a fost sters!', vbInformation, 'Info')

Call refres

End If

Else

x = MsgBox('Trebuie sa existe cel putin un utilizator!', vbInformation, 'Info')

End If

End Sub

Private Sub Form_Load()

Call refres

End Sub

Proiect Visual Basic

1.Programarea pe obiecte.Notiuni generale

1.1.1. Obiecte.Clase.Caracteristici

Limbajele de programare,tehnicile si metodele de programare au evoluat in mod spectaculos de la aparitia calculatorului si pana astazi,ca urmare a necesitatii de a raspunde la cresterea continua a complexitatii problemelor de rezolvat si deci,implicit a programelor corescpunzatoare.Astfel,programarea a evoluat de la stadiul initial al introducerii notiunilor direct in cod binar si a continuat cu aparitia limbajelor de asamblare,care permiteau reprezentarea simbolica a instructiunilor pt calculator.Atunci cand limbajele de asamblare n-au mai facut fata complexitatii crescande a programelor a fost necesara utilizarea unor limbaje de nivel mai inalt, cunoscute sub numele de limbaje de programare de gereratia 1 si 2, care sa faciliteze gestionarea acelui nivel de complexitate.Reprezentate de seama ale acestei perioade sunt limbajele FORTRAN,COBOL,ALGOL.

Deceniul 6 al secolului 20 a adus cu sine aparitia programarii structurate, ceea ce a constituit unul dintre pasii semnificativi in evolutia ingineriei software, aceasca paradigma de programare dominand o buna bucata de timp lumea programarii.Programarea structurata este sustinuta de limbaje de generatia 3 cum sunt C,PASCAL,BASIC principala caracteristica a lor fiind utilizarea subprogramelor ca modalitate de gestionare a complexitatii.Programarea structurata s-a dovedit a fi o modalitate corespunzatoare de abstractizare a operatiilor si a algoritmilor,dovedindu-si eficienta in gestionarea programelor a caror complexitate putea fi controlata de catre un singur programator sau de catre un numar restrans de programatori.

Page 383: tutoriale vba

Odata cu cresterea dimensiunii si complexitatii proiectelor software a devenit tot mai clar ca pentru a le putea controla este absolut necesara abstractizarea datelor si ca in acest scop programarea structurata nu mai este suficienta.In 1984 Shankar afirma ca:”Natura abstractizarilor ce pot fi obtinute prin utilizarea procedurilor este adecvata descrierii operatiilor abstracte, darn u este adecvata descrierii obiectelor abstracte.Aceasta este o carenta majora de vreme ce in multe aplicatii complexitatea obiectelor de date care trebuiesc manipulate contribuie substantial la complexitatea globala a problemei”.

S-a impus gasirea unui nou model de programare capabil sa depaseasca limitarile programarii structurate si care sa fie capabila sa realizeze abstractizarea adecvata a datelor.Asa s-a nascut limbajele bazate pe obiecte si apoi cele orientate pe obiecte.Dintre acestea cele mai raspandite sunt Ada si CLOS si ma ide curand Java(bazate pe obiecte),respective Smalltalk,C++,Eiffel (orientate pe obiecte).

1.1.2.Conceptul de obiecte

In evolutia tehnicilor de proiectare si realizare efectiva a programelor au aparut la un moment dat,concepte si constructii noi,modalitati noi de structurare a datelor, de tratare a colectiilor de date si chiar de programare.

Constructia de baza in abordarea orientata obiect este obiectul care combina structura datelor si comportamentul intr-o singura entitate.

Prin obiect intelegem o entitate din lumea reala asupra careia se poate intreprinde o actiune,sau care poate intreprinde o actiune.

Obiectul este deci un concept,o abstractie sau un lucru,o entitate din lumea reala avand limite precise si un sens precis in contextul problemei studiate

Un obiect este caracterizat prin 3 elemente:

identitate;

stare;

comportament;

Spunem despre un obiect ca are 2 componente:

structura informationala;

comportamentul sau operatiile care actioneaza asupra structurii.

Analizand mai atenti obiectele,constatam ca acestea pot fi:

obiecte concrete,care exista in mod fizica;

obiecte conceptuale(o idee,o lege,etc).

Comportamentul obiectelor poate fi declansat de stimul externi sau evenimente.

Page 384: tutoriale vba

Fiecare obiect contine informatii individuale(date) care trebuie sa fie accesate sau modificate numai prin intermediul multimii de operatii care definesc comportamentul obiectului respectiv.Singura parte vizibila a unui obiect este constituita din operatiile(functiile) obiectului si este denumita interfata.

Atat structura care memoreaza informatiile cat si implementarea operatiilor sunt ascunse in interiorul obiectului.Operatiile arata numai ce face obiectul nu si cum face.

Orice obiect are atribute si operatii.

Atributele descriu un obiect si sunt valori ale datelor,in timp ce operatiile(functiile) definesc comportamentul obiectelor.Anumite metode orientate propun,pentru acelasi scop,utilizarea a trei tipuri de obiecte,definite in contextual problemei si anume:

obiecte entitate

obiecte de interfata

obiecte de control

Modelul in abordarea pe obiecte bazata pe faptul ca fiecare obiect, ca subsistem individual cuprinde o procedura particulara, un comportament propriu si comunica cu alte obiecte.

Arhitectura sistemelor cu obiecte se bazeaza pe clase,obiecte si interactiunea dintre ele.

Un obiect dispune de proprietati,metode si evenimente.

Proprietatile unui obiect descriu caracteristicile fizice ale acestuia.Obiectul este deci caracterizat prin proprietatile(atributele) sale:nume,dimensiune,.culoare,eticheta si alte proprietati care fac unic un obiect.

Intr-un limbaj de programare, fiecare obiect poseda o cheie unica prin care el poate fi referit fara ambiguitate.Referintele asupra obiectelor sunt uniforme si independente de continutul lor, ceea ce permite crearea colectiilor de obiecte.

Din punct de vedere al programatorilor,un obiect reprezinta o multime de date si o serie de operatii, numite metode,care manipuleaza datele.Utilizarea de obiecte in programe este o modalitate de a privi programele din perspective obiectelor care compun un sistem.

Un obiect se caracterizeaza prin:

identitate-cea care individualizeaza obiectul

starea obiectului-este caracterizata de atributele care descriu obiectul

Obiectele cu stari comportamentale asemanatoare formeaza deci o clasa de obiecte.

1.1.3.Conceptul de Clasa de obiecte

Page 385: tutoriale vba

O clasa de obiecte este o abstractie care descrie toate caracteristicile comune ale unui grup de obiecte si care permite crearea de noi obiecte.Ea descrie o multime de obiecte cu atribute similare,operatii similare,aceeasi semantica si aceleasi relatii cu alte obiecte.

Exemple de clase:

bicicleta;

fereastra;

triunghi.

O clasa poate fi rafinata in subclase din ce in ce mai fine.Fiecare subclasa mosteneste toate proprietatile superclasei sale si adauga propriile sale proprietati.

Daca o clasa mosteneste o alta clasa atunci ea mosteneste toate atributele si operatiile clasei de baza,iar din punctual de vedere al codului, acestea sunt aceleasi cu cele ale clasei de baza,si nu copii ale lor.

Incapsularea reprezinta conceptul care defineste apartenenta unor proprietati si metode fata de un obiect.Incapsularea protejeaza obiectele de manevre eronate din afara.

1.2.Modele utilizate in dezvoltarea de produse software

1.2.1Generalitati privind activitatea de programare

Programarea este practice activitatea prin care se concepe si se realizeaza programul pentru rezolvarea unei probleme,cu ajutorul calculatorului electronic.

Un program reprezinta o succesiune de instructiuni si comenzi apartinand unui/unor limbaje de programare(Pascal,Basic,C,Visual Basic,Java,etc) care conduc la solutionarea problemelor formulate.

Daca ne referim la activitatea de programare,vom identifica in cadrul acesteia,urmatoarele etape:

formularea problemei;

elaborarea,identificarea si descrierea algoritmului de rezolvare a problemei date;

scrierea programului;

testarea programului;

realizarea,completarea si definitivarea documentatiei programului;

exploatarea curenta,utilizarea si intretinerea programului.

Modele utilizate in dezvoltarea programelor:

Page 386: tutoriale vba

Un model este o notiune abstracta si este construit pentru a intelege problema inainte de a implementa solutia.

Cele mai utilizate modele in dezvoltarea programelor sunt:

modelul orientat procedural care se bazeaza pe proceduri si algoritmi;

modelul orientat pe obiecte,care consta intr-o colectie de obiecte ce apartin unor clase;

modelul orientat pe reguli(de timpul If-Then);

modelul orientat logic in care anumite scopuri se exprima prin calcule cu predicate;

modelul orientat pe constrangeri(relatii de invarianta).

Cea mai mare raspandire o are modelul procedural si cel mai mare interes il prezinta in ultimul timp modelul orientat pe obiecte.

1.2.2.Scurta prezentare a modelului procedural

Modelul procedural reprezinta,prin intermediu algoritmilor de prelucrare,succesiunea de operatii elementare,in numar infinit,care trebuie parcurse pentru rezolvarea unei probleme.

Modelul procedural are la baza abstractia procedurala si principiul substitutiei conform careia,la apelul unei proceduri,fiecare pozitie de parametru formal din corpul acesteia,poate fi ocupata de o valoare de parametru identical din punct de vedere al tipului,sau de un nou apel la o procedura,inclusive a procedurii in cauza(recursivitate),care reintoarce tipul corespunzator parametrului substituit.

Programele complexe sunt structurate in subprograme si/sau proceduri.Programele cuprind deci proceduri ce se pot apela reciproc.

Dintre limbajele de tim procedural amintim:Pascal,Cobol,Basic,C++,FoxPro.

1.2.3.Modularitatea

Clasele si obiectele obtinute in urma abstractizarii si incapsularii trebuie grupate si apoi stocate intr-o forma fizica,denumita modul.Modulele pot fi privite ca si containere fizice in care declaram clasele si obiectele rezultate in urma proiectarii la nivel logic.Modulele formeaza asadar arhitectura fizica a programului.Modularizarea consta in divizarea programului intr-un numar de module care pot fi compilate separate,dar care sunt conectate intre ele.Limbajele care suporta conceptul de modul fac in acelasi timp distinctia intre interfata modulului si implementarea sa.Putem spune ca incasularea si modularizarea merg mana in mana.Concret,in C++ modulele nu sunt altceva decat fisiere ce pot fi co

 

Proiect Visual Basic

Page 387: tutoriale vba

Marime: 529 kb        Pentru: facultate        Nota: 6,40        Voturi: 5        Afisari: 884        Download: 102

Ti-a fost util acest referat? Te rugam sa-i dai o nota:

6,40 (5 voturi)

Proiect Visual Basic1.Programarea pe obiecte.Notiuni generale1.1.1. Obiecte.Clase.CaracteristiciLimbajele de programare,tehnicile si metodele de programare au evoluat in mod spectaculos de la aparitia calculatorului si pana astazi,ca urmare a necesitatii de a raspunde la cresterea continua a complexitatii problemelor de rezolvat si deci,implicit a programelor corescpunzatoare.Astfel,programarea a evoluat de la stadiul initial al introducerii notiunilor direct in cod binar si a continuat cu aparitia limbajelor de asamblare,care permiteau reprezentarea simbolica a instructiunilor pt calculator.Atunci cand limbajele de asamblare n-au mai facut fata complexitatii crescande a programelor a fost necesara utilizarea unor limbaje de nivel mai inalt, cunoscute sub numele de limbaje de programare de gereratia 1 si 2, care sa faciliteze gestionarea acelui nivel de complexitate.Reprezentate de seama ale acestei perioade sunt limbajele FORTRAN,COBOL,ALGOL.Deceniul 6 al secolului 20 a adus cu sine aparitia programarii structurate, ceea ce a constituit unul dintre pasii semnificativi in evolutia ingineriei software, aceasca paradigma de programare dominand o buna bucata de timp lumea programarii.Programarea structurata este sustinuta de limbaje de generatia 3 cum sunt C,PASCAL,BASIC principala caracteristica a lor fiind utilizarea subprogramelor ca modalitate de gestionare a complexitatii.Programarea structurata s-a dovedit a fi o modalitate corespunzatoare de abstractizare a operatiilor si a algoritmilor,dovedindu-si eficienta in gestionarea programelor a caror complexitate putea fi controlata de catre un singur programator sau de catre un numar restrans de programatori.Odata cu cresterea dimensiunii si complexitatii proiectelor software a devenit tot mai clar ca pentru a le putea controla este absolut necesara abstractizarea datelor si ca in acest scop programarea structurata nu mai este suficienta.In 1984 Shankar afirma ca:â€Natura �abstractizarilor ce pot fi obtinute prin utilizarea procedurilor este adecvata descrierii operatiilor abstracte, darn u este adecvata descrierii obiectelor abstracte.Aceasta este o carenta majora de vreme ce in multe aplicatii complexitatea obiectelor de date care trebuiesc manipulate contribuie substantial la complexitatea globala a problemeiâ€.�S-a impus gasirea unui nou model de programare capabil sa depaseasca limitarile programarii structurate si care sa fie capabila sa realizeze abstractizarea adecvata a datelor.Asa s-a nascut limbajele bazate pe obiecte si apoi cele orientate pe obiecte.Dintre acestea cele mai raspandite sunt Ada si CLOS si ma ide curand Java(bazate pe obiecte),respective Smalltalk,C++,Eiffel (orientate pe obiecte).1.1.2.Conceptul de obiecteIn evolutia tehnicilor de proiectare si realizare efectiva a programelor au aparut la un moment dat,concepte si constructii noi,modalitati noi de structurare a datelor, de tratare a colectiilor de date si chiar de programare.Constructia de baza in abordarea orientata obiect este obiectul care combina structura datelor

Page 388: tutoriale vba

si comportamentul intr-o singura entitate.Prin obiect intelegem o entitate din lumea reala asupra careia se poate intreprinde o actiune,sau care poate intreprinde o actiune.Obiectul este deci un concept,o abstractie sau un lucru,o entitate din lumea reala avand limite precise si un sens precis in contextul problemei studiateUn obiect este caracterizat prin 3 elemente:identitate;stare;comportament;Spunem despre un obiect ca are 2 componente:structura informationala;comportamentul sau operatiile care actioneaza asupra structurii.Analizand mai atenti obiectele,constatam ca acestea pot fi:obiecte concrete,care exista in mod fizica;obiecte conceptuale(o idee,o lege,etc).Comportamentul obiectelor poate fi declansat de stimul externi sau evenimente.Fiecare obiect contine informatii individuale(date) care trebuie sa fie accesate sau modificate numai prin intermediul multimii de operatii care definesc comportamentul obiectului respectiv.Singura parte vizibila a unui obiect este constituita din operatiile(functiile) obiectului si este denumita interfata.Atat structura care memoreaza informatiile cat si implementarea operatiilor sunt ascunse in interiorul obiectului.Operatiile arata numai ce face obiectul nu si cum face.Orice obiect are atribute si operatii.Atributele descriu un obiect si sunt valori ale datelor,in timp ce operatiile(functiile) definesc comportamentul obiectelor.Anumite metode orientate propun,pentru acelasi scop,utilizarea a trei tipuri de obiecte,definite in contextual problemei si anume:obiecte entitateobiecte de interfataobiecte de controlModelul in abordarea pe obiecte bazata pe faptul ca fiecare obiect, ca subsistem individual cuprinde o procedura particulara, un comportament propriu si comunica cu alte obiecte.Arhitectura sistemelor cu obiecte se bazeaza pe clase,obiecte si interactiunea dintre ele.Un obiect dispune de proprietati,metode si evenimente.Proprietatile unui obiect descriu caracteristicile fizice ale acestuia.Obiectul este deci caracterizat prin proprietatile(atributele) sale:nume,dimensiune,.culoare,eticheta si alte proprietati care fac unic un obiect.Intr-un limbaj de programare, fiecare obiect poseda o cheie unica prin care el poate fi referit fara ambiguitate.Referintele asupra obiectelor sunt uniforme si independente de continutul lor, ceea ce permite crearea colectiilor de obiecte.Din punct de vedere al programatorilor,un obiect reprezinta o multime de date si o serie de operatii, numite metode,care manipuleaza datele.Utilizarea de obiecte in programe este o modalitate de a privi programele din perspective obiectelor care compun un sistem.Un obiect se caracterizeaza prin:identitate-cea care individualizeaza obiectulstarea obiectului-este caracterizata de atributele care descriu obiectulObiectele cu stari comportamentale asemanatoare formeaza deci o clasa de obiecte.1.1.3.Conceptul de Clasa de obiecteO clasa de obiecte este o abstractie care descrie toate caracteristicile comune ale unui grup de obiecte si care permite crearea de noi obiecte.Ea descrie o multime de obiecte cu atribute similare,operatii similare,aceeasi semantica si aceleasi relatii cu alte obiecte.

Page 389: tutoriale vba

Exemple de clase:bicicleta;fereastra;triunghi.O clasa poate fi rafinata in subclase din ce in ce mai fine.Fiecare subclasa mosteneste toate proprietatile superclasei sale si adauga propriile sale proprietati.Daca o clasa mosteneste o alta clasa atunci ea mosteneste toate atributele si operatiile clasei de baza,iar din punctual de vedere al codului, acestea sunt aceleasi cu cele ale clasei de baza,si nu copii ale lor.Incapsularea reprezinta conceptul care defineste apartenenta unor proprietati si metode fata de un obiect.Incapsularea protejeaza obiectele de manevre eronate din afara.1.2.Modele utilizate in dezvoltarea de produse software1.2.1Generalitati privind activitatea de programareProgramarea este practice activitatea prin care se concepe si se realizeaza programul pentru rezolvarea unei probleme,cu ajutorul calculatorului electronic.Un program reprezinta o succesiune de instructiuni si comenzi apartinand unui/unor limbaje de programare(Pascal,Basic,C,Visual Basic,Java,etc) care conduc la solutionarea problemelor formulate.Daca ne referim la activitatea de programare,vom identifica in cadrul acesteia,urmatoarele etape:formularea problemei;elaborarea,identificarea si descrierea algoritmului de rezolvare a problemei date;scrierea programului;testarea programului;realizarea,completarea si definitivarea documentatiei programului;exploatarea curenta,utilizarea si intretinerea programului.Modele utilizate in dezvoltarea programelor:Un model este o notiune abstracta si este construit pentru a intelege problema inainte de a implementa solutia.Cele mai utilizate modele in dezvoltarea programelor sunt:modelul orientat procedural care se bazeaza pe proceduri si algoritmi;modelul orientat pe obiecte,care consta intr-o colectie de obiecte ce apartin unor clase;modelul orientat pe reguli(de timpul If-Then);modelul orientat logic in care anumite scopuri se exprima prin calcule cu predicate;modelul orientat pe constrangeri(relatii de invarianta).Cea mai mare raspandire o are modelul procedural si cel mai mare interes il prezinta in ultimul timp modelul orientat pe obiecte.1.2.2.Scurta prezentare a modelului proceduralModelul procedural reprezinta,prin intermediu algoritmilor de prelucrare,succesiunea de operatii elementare,in numar infinit,care trebuie parcurse pentru rezolvarea unei probleme.Modelul procedural are la baza abstractia procedurala si principiul substitutiei conform careia,la apelul unei proceduri,fiecare pozitie de parametru formal din corpul acesteia,poate fi ocupata de o valoare de parametru identical din punct de vedere al tipului,sau de un nou apel la o procedura,inclusive a procedurii in cauza(recursivitate),care reintoarce tipul corespunzator parametrului substituit.Programele complexe sunt structurate in subprograme si/sau proceduri.Programele cuprind deci proceduri ce se pot apela reciproc.Dintre limbajele de tim procedural amintim:Pascal,Cobol,Basic,C++,FoxPro.1.2.3.ModularitateaClasele si obiectele obtinute in urma abstractizarii si incapsularii trebuie grupate si apoi

Page 390: tutoriale vba

stocate intr-o forma fizica,denumita modul.Modulele pot fi privite ca si containere fizice in care declaram clasele si obiectele rezultate in urma proiectarii la nivel logic.Modulele formeaza asadar arhitectura fizica a programului.Modularizarea consta in divizarea programului intr-un numar de module care pot fi compilate separate,dar care sunt conectate intre ele.Limbajele care suporta conceptul de modul fac in acelasi timp distinctia intre interfata modulului si implementarea sa.Putem spune ca incasularea si modularizarea merg mana in mana.Concret,in C++ modulele nu sunt altceva decat fisiere ce pot fi compilate separat.Reguli generale de modularizare1.Structura fiecarui modul trebuie as fie sufficient de simpla pentru a putea fi complet inteleasa.2.Implementarea unui modul trebuie sa depinda doar de interfetele altor module.Cu alte cuvinte trebuie sa fie posibila modificarea implementarii unui modul fara a avea cunostinte despre implementarea altor module si fara a afecta comportarea celorlante module.3.Detaliile sistemului ce se presupune ca se vor modifica independent vor fi plasate in module diferite.4.Singurele legaturi intre module vor fi acelea a caror modificare este improbabila.5.Orice structura de date este incapsulata intr-un modul;ea poate fi accesata direct din interiorul modulului darn u poate fi accesata din afara modulului decat prin intermediul obiectelor si claselor continute in acel modul.1.2.4.Programarea orientata pe obiecte.Concepte de baza.Programarea orientata pe obiecte este o metoda de implementare in care programele sunt organizate ca si colectii de obiecte ce coopereaza intre ele,fiecare obiect reprezentand instanta unei clase;fiecare clasa apartine unei ierarhii de clase,clasele fiind unite prin relatii de mostenire. Limbaj de programare bazat pe obiecte.Programare cu tipuri de date abstracte.Un limbaj de programare care ofera support pentru utilizarea claselor si a obiectelor,dar care nu are implementat mecanismul relatiilor de mostenire intre clase este un limbaj de programare bazat pe obiecte.Programarea bazata pe clase si pe obiecte,care nu face uz de relatia de mostenire se mai numeste programare cu tipuri de date abstracte.APLICATIE PENTRU EVIDENTA CHELTUIELILOR LUNARE ALE ASOCIATIILOR DE PROPRIETARI - Proiect de diploma

Vizite: ? Nota: ?  d1k23kd

APLICATIE PENTRU EVIDENTA CHELTUIELILOR LUNARE ALE ASOCIATIILOR DE PROPRIETARI

1. CONTINUTUL PROIECTULUI: a. Piese scrise: Specificatii de Definitie, Introducere, Memoriu Tehnic, Memoriu Justificativ, Caiet de Sarcini, Manual de Operare, Bibliografie. b. Piese desenate: diagrame c. Anexe: Listing program.2. LOCUL DOCUMENTATIEI:3. CONSULTANTI:4. DATA EMITERII TEMEI:

Page 391: tutoriale vba

5. TERMEN DE PREDARE: Cuprins1. INTRODUCERE 11.1 Aplicabilitate 11.2 Specificatii de definitie 21.3 Reguli de calcul 42. MEMORIU TEHNIC 82.1 Aplicatii cu baze de date 82.2 Metodica de proiectare a aplicatiei 102.3 Etapa analiza. Entitati si Atribute 132.4 Etapa analiza. Evenimente si Functii 172.5 Etapa proiectare. Diagrama Entitate-Relatie 182.6 Etapa proiectare. Diagrama Functionala 222.7 Etapa proiectare. Arhitectura aplicatiei 252.8 Etapa implementare 273. MEMORIU JUSTIFICATIV 293.1 Proiectarea si implementarea bazei de date 293.2 Proiectarea interfetei utilizator 32Meniul aplicatiei 32Formulare 353.3 Implementare 40Functii publice 41Functia de calcul a cheltuielilor 42Raportul cheltuielilor 443.4 Documentare 453.5 Testare 463.6 Pachet de instalare 464. CAIET DE SARCINI 475. MANUAL DE OPERARE 48Instructiuni pentru instalarea aplicatiei 48Instructiuni de utilizare 506. CONCLUZII 51Aprecieri 51Posibilitati de dezvoltare ulterioara 52BIBLIOGRAFIE 53ANEXE 54Anexa 1. Listing Program 541. INTRODUCEREIn partea introductiva a lucrarii vom prezenta scopul aplicatiei, posibilitatile de utilizare practica, precum si notiunile de baza utilizate de catre administratorii de imobile, notiuni utilizate la implementarea aplicatiei sub forma elementelor de proiectare.De asemenea, din partea introductiva va rezulta si necesitatea dezvoltarii unei astfel de aplicatii si implicatiile pe care le are utilizarea acesteia in cadrul activitatii de calcul si evidenta a cheltuielilor asociatiilor de proprietari .1.1 AplicabilitateAplicatia este destinata asociatiilor de proprietari respectiv administratorilor de imobile, prin caracterul sau general acesta putandu-se aplica in orice asociatie de proprietari sau imobil din Romania, respectand prevederile legale de calcul si evidenta aflate in vigoare.Se urmareste automatizarea procesului de calcul si evidenta a cheltuielilor pe care le au de achitat lunar locatarii / proprietarii unui imobil. Calculele pe care administratorul blocului le

Page 392: tutoriale vba

face manual sunt greoaie si predispuse erorilor, in orice moment exista posibilitatea ca acesta sa introduca erori de calcul sau de evidenta, deci o aplicatie care sa-i usureze si sa ii sistematizeze activitatea este un ajutor binevenit.In principiu, aplicatia trebuie sa permita introducerea informatiilor necesare calculului cumulativ, sa execute acest calcul pe baza informatiilor introduse sau deja existente intr-o forma de evidenta si sa genereze o lista pe care administratorul o va afisa pe panou. De asemenea aplicatia trebuie sa permita introducerea si memorarea platilor pe care le efectueaza locatarii / proprietarii lunar.Pentru faza de documentare si testare, s-au folosit informatii puse la dispozitie de catre administratorul imobilului aflat pe strada Prof. Ciortea nr.7.1.2 Specificatii de definitieIn urma discutiilor purtate cu administratorul de imobil precum si in urma studierii unor prevederi legale(legi, ordonante) referitoare la asociatiile de proprietari si la administrarea imobilelor, au rezultat o serie de notiuni specifice acestui domeniu, care vor fi utilizate la faza de implementare sub forma unor elemente de proiectare. Prezentam in continuare aceste notiuni si semnificatia lor.Notiunea de asociatie de proprietari reprezinta asocierea tuturor proprietarilor sau locatarilor care locuiesc respectiv detin unul sau mai multe apartamente intr-un imobil de locuinte intr-o forma cu personalitate juridica, numita Asociatie de Proprietari in vederea gestionarii in comun a resurselor legate de serviciile furnizate de catre regiile autonome si a altor probleme legate de gestionarea in comun a unor resurse, fonduri, spatii.Astfel, cererea pentru dobandirea personalitatii juridice a asociatiei, statutul, acordul de asociere si procesul-verbal al adunarii constitutive se inregistreaza la organul financiar pe a carui raza se afla cladirea. Asociatia dobandeste personalitate juridica in baza incheierii actului de catre judecatorul delegat la organul financiar local de presedintele judecatoriei in a carei circumscriptie teritoriala se afla imobilul.a1iForma de organizare a asociatiei de proprietari nu face subiectul acestei lucrari, deci vom insista doar pe partea de calcul si evidenta a cheltuielilor lunare.In cazul de fata, la proiectarea aplicatiei ne vom referi in special la notiunea de imobil care reprezinta totalitatea apartamentelor aflate intr-o cladire cu locuinte. Acesta este caracterizat prin denumire, adresa, localitatea si judetul unde se este situat imobilul.Prin notiunea de apartament se intelege locuinta separata, indivizibila aflata intr-un imobil. Un imobil contine unul sau mai multe apartamente si un apartament apartine unui singur imobil. In cadrul imobilului, apartamentul este identificat prin numar de apartament. De asemenea apartamentul este caracterizat prin proprietar, numar de camere, suprafata totala si numarul de persoane care locuiesc in apartament. Aceste caracteristici pot fi variabile in sensul modificarii lor de la o luna la alta.Notiunea de furnizor reprezinta o societate comerciala, o regie autonoma, o persoana fizica sau o persoana juridica care furnizeaza servicii asociatiei de proprietari. Furnizorul este caracterizat prin denumire, cod fiscal si adresa. Contravaloarea acestor servicii fac obiectul unei facturi emise de furnizor catre asociatia de proprietari. Astfel introducem notiunea de factura ca si documentul care contine cuantumul de consum al serviciului oferit si contravaloarea acestuia, exprimat in lei. Factura este caracterizata prin numar de document, furnizorul, tipul de serviciu furnizat, consumul, luna pentru care se face facturarea si suma care reprezinta contravaloarea serviciului. Factura se emite de catre furnizor pentru luna precedenta. Prin notiunea de luna intelegem intervalul de timp echivalent cu o luna calendaristica pentru care furnizorul a efectuat facturarea si in consecinta proprietarul apartamentului trebuie sa achite cota parte din aceasta factura care ii revine conform normelor de calcul in vigoare.a2i Luna se caracterizeaza prin indexul sau denumirea acesteia(ianuarie - decembrie) si prin anul din care aceasta face parte.

Page 393: tutoriale vba

Aplicatia va utiliza astfel notiunea de luna ca si termen de referinta pentru efectuarea calculelor. Pentru o luna se pot emite una sau mai multe facturi.Pentru ca un furnizor poate sa emita facturi pentru unul sau mai multe tipuri de consum, vom trata separat notiunea de tip de consum, care reprezinta tipul de consum pentru factura emisa de catre furnizor. Tipul de consum este caracterizat de furnizor, unitate de masura si tip de calcul. Unui tip de consum ii pot reveni astfel una sau mai multe facturi.Notiunea tip de calcul reprezinta modalitatea in care se face calcul cuantumului aferent fiecarui apartament din imobil pentru un anumit tip de consum. Astfel, acesta poate sa fie la nivel de apartament, la nivel de numar de persoane care locuiesc in apartament in luna respectiva sau la nivel de suprafata a apartamentului.a2i Un tip de calcul este determinant pentru unul sau mai multe tipuri de consum.Prin notiunea de incasare se intelege actiunea prin care administratorul imobilului primeste de la proprietarul apartamentului o suma de bani aferenta cuantumului rezultat in urma cheltuielilor lunare. De obicei proprietarul achita suma exacta rezultata dar poate sa achite si o parte din aceasta suma, sau chiar sa nu achite deloc suma datorata, astfel suma devenind restanta. In urma achitarii unei sume, administratorul emite o chitanta, care este dovada ca proprietarul a achitat suma respectiva. Incasarea este caracterizata de numar chitanta, data la care a fost efectuata plata si suma incasata. Astfel, pentru un apartament se pot efectua una sau mai multe incasari.1.3 Reguli de calculCuantumul cheltuielilor aferente fiecarui apartament din imobil se calculeaza pe baza facturilor lunare pe care administratorul imobilului le primeste de la furnizorii de servicii(societatile comerciale care asigura livrarea apei reci si calde menajere, furnizarea agentului termic, curentului electric, gazului metan, serviciile de salubrizare, etc.) precum si din informatiile specifice fiecarui apartament(numar de persoane, suprafata, numar de camere, etc.)Calcul se face pe baza prevederilor legale in vigoare. Prezentam in continuare formulele de calcul defalcate pentru cele 3 tipuri de calcul: a. Calcul la nivel de suprafataAcest tip de calcul se face in special in cazul energiei termice.Cheltuielile pentru incalzirea locuintelor/apartamentelor, indiferent de modul de inregistrare a consumului de energie termica si de sursa de agent termic, se repartizeaza proportional cu suprafata utila inscrisa in actul de proprietate, iar pentru incalzirea spatiilor aflate in folosinta comuna intr-o cladire (casa scarii, culoare, spalatorii, uscatorii, holuri si altele asemenea) se repartizeaza proportional cu cota-parte indiviza care ii revine fiecarui proprietar din proprietatea comuna, astfel cum aceasta este inscrisa in actul de proprietate.a7iConsumul se calculeaza cu urmatoarea formula:unde cas -; consumul la nivel de suprafata, pe apartament sa -; suprafata apartament cis -; consumul la nivel de suprafata, total pe imobil cics-; consumul la nivel de suprafata, contorizat total pe imobil si -; suprafata totala a tuturor apartamentelor din imobil sic -; suprafata totala a tuturor apartamentelor contorizate din imobilApartamentele contorizate sunt cele care au contoare separate pentru tipul de consum in discutie si care platesc separat, in functie de consumul inregistrat de aceste contoare.In cazul energiei termice se va obtine consumul aferent unui apartament necontorizat, exprimat in m3. Cu urmatoarea formula se obtine valoarea aferenta acestui consum, exprimata in Lei, adica suma pe care o are de platit un apartament necontorizat pentru serviciul respectiv.unde vas -; valoarea consumului la nivel de suprafata, pe apartament cas -; consumul la nivel de suprafata, pe apartament vis -; valoarea totala a serviciului facturat, la nivel de suprafata cis -; consumul la nivel de suprafata, total pe imobil

Page 394: tutoriale vba

b. Calcul la nivel de numar de persoaneAcest tip de calcul se face in cazul consumului de apa curenta menajera(apa rece, apa calda, canalizare), consumului de gaze naturale, etc.Consumul se calculeaza cu urmatoarea formula:unde cap -; consumul la nivel de numar persoane, pe apartament pa -; numarul de persoane care locuiesc in apartament cip -; consumul la nivel de numar persoane, total pe imobil cicp -; consumul la nivel de numar persoane, contorizat total pe imobil pi -; numarul total de persoane care locuiesc in imobil pic -; numarul total de persoane care locuiesc in imobil dar la care apartamentele in care locuiesc exista contoare pentru serviciul respectivDe exemplu, in cazul consumului de gaze naturale se va obtine consumul aferent unui apartament necontorizat, exprimat in m3. Pentru obtinerea valorii aferente acestui consum, exprimata in Lei, adica suma pe care o are de platit un apartament necontorizat pentru serviciul respectiv, se foloseste formula:unde vap -; valoarea consumului la nivel de numar persoane, pe apartament cip -; consumul la nivel de numar persoane, total pe imobil cap -; consumul la nivel de numar persoane, pe apartament vip -; valoarea totala a serviciului facturat, la nivel de numar persoanec. Calcul la nivel de apartamentAcest tip de calcul se face in cazul retributiilor sub forma de salarizare ale administratorului, persoanei care face curatenie in imobil, etc.Consumul se calculeaza cu urmatoarea formula:unde caa -; consumul la nivel de apartament, pe apartament cia -; consumul la nivel de apartament, total pe imobil cica -; consumul la nivel de apartament, contorizat total pe imobil ai -; numarul total de apartamente din imobil aic -; numarul total de apartamente din imobil in care locuiesc exista contoare pentru serviciul respectivDe exemplu, in cazul salariului administratorului, avand in vedere ca nu exista apartamente cu regim de contorizare, cic si aic vor fi zero, deci fiecare apartament va plati aceeasi suma, egala cu salariul administratorului impartit la numarul de apartamente din imobil. Pentru obtinerea valorii aferente acestui consum, exprimata in Lei, adica suma pe care o are de platit un apartament necontorizat pentru serviciul respectiv, se foloseste formula:unde vaa -; valoarea consumului la nivel de apartament, pe apartament caa -; consumul la nivel de apartament, pe apartament via -; valoarea totala a serviciului facturat, la nivel de apartament cia -; consumul la nivel de apartament, total pe imobilDupa calcularea valorilor pentru fiecare tip de consum in parte, obtinem totalul de plata pentru fiecare apartament, dupa formula:unde vt -; valoarea totala de plata pentru apartament, pentru luna curenta vas -; valoarea consumului la nivel de suprafata, pe apartament vap -; valoarea consumului la nivel de numar persoane, pe apartament vaa -; valoarea consumului la nivel de apartament, pe apartament ns -; numarul de servicii dependente de suprafata np -; numarul de servicii dependente de numarul de persoane na -; numarul de servicii dependente de apartamentAceste formule de calcul se aplica pentru fiecare apartament din imobil iar valorile obtinute vt, constituie lista de cheltuieli lunare, scopul principal al dezvoltarii acestei aplicatii. Eventual, ca si optiune, se pot afisa si unele dintre consumurile vs, vp sau va, de obicei cele mai importante din punct de vedere valoric, cum ar fi energia termica sau apa curenta menajera.2. MEMORIU TEHNIC2.1 Aplicatii cu baze de dateO aplicatie este in principiu o colectie software consolidata cu scopul de a rezolva un set dat de probleme. Rezolvarea problemelor prin punerea in practica a software-ului se numeste software engineering. Tot asa cum in alte proiecte ingineresti cum ar fi constructia unei cladiri sau a unui aparat de zbor este depus un efort considerabil inaintea punerii primei caramizi in

Page 395: tutoriale vba

constructia cladirii sau inainte de conceperea primei piese a aparatului de zbor. In timpul fazei initiale (numita faza de proiectare) o serie de elemente vor intra in contact unele cu altele pentru a da forma proiectului de aplicatie. Unele din elemente sunt ne-negociabile sau resurse limitate cum ar fi timpul, banii, sau mana de lucru. Altele, cum ar fi tehnologiile disponibile, cunostintele, sau indemanarea sunt resurse dinamice si variaza pe parcursul ciclului de viata al sistemului "business".a9iNotiunea de baza de date este strans legata de notiunea de date, care refera „fapte culese din lumea reala” a11i. Baza de date se refera la un volum mare de date, care sunt stocate pe suport fizic; ea reprezinta, in cazul sistemului computerizat, echivalentul arhivei din viata reala. Mai poate fi inteleasa ca o colectie de fisiere de date intr-un sistem de calcul a12i.Pentru o baza de date cel mai important lucru este manipularea datelor continute in acea baza de date. Aceasta „manipulare” refera operatiile care se pot efectua asupra datelor: operatii de adaugare a unor date noi, operatii de regasire, de modificare, de stergere a datelor existente a12i.Programarea bazelor de date constituie, de fapt, procesul de stocare -; folosind o modalitate standard -; a unei varietati de informatii, astfel incat sa fie posibila o accesare si o intretinere facila a datelor. Informatiile stocate intr-o baza de date, spre deosebire de un document creat cu un procesor de texte, respecta de obicei un format standard.a10i Pentru aplicatia ceruta, utilizarea unei aplicatii cu baze de date in detrimentul altor metode de rezolvare a problemei date, cum ar fi calculul tabelar sau o aplicatie standard, fara baze de date, rezolva o serie de probleme si neajunsuri. Din acest punct de vedere, unele avantaje ale proiectarii aplicatiei cu baze de date au constituit un factor important de decizie atunci cand am ales modalitatea de rezolvare a problemei date, cum ar fi:- posibilitatea stocarii unui volum relativ mare de informatii, precum si accesul ulterior la aceste informatii;- remanenta informatiei, care in cazul unei aplicatii standard, fara baze de date, era incerta. Astfel, utilizatorul aplicatiei va avea posibilitatea sa verifice la un moment dat situatia locatarilor sau a cheltuielilor pentru luna precedenta sau chiar pentru anul trecut, existand posibilitatea intocmirii unor statistici evolutive a situatiei locatarilor, a cheltuielilor, etc.;- simplificarea procesului de calcul, care in cazul calculului tabelar ar fi avut o complexitate ridicata, fara a avea un control real asupra fluxului de informatie gestionat;- transparenta totala a implementarii, utilizatorul aplicatiei nu trebuie sa cunoasca modalitatile efective de implementare, modul de stocare a datelor, verificarile de corectitudine a informatiilor introduse. Utilizatorul nu trebuie sa cunoasca ce se intampla cu o informatie introdusa in sistem, dar in acelasi timp acesta trebuie sa aiba acces la informatia respectiva;- fiind vorba de sume de bani, securitatea metodelor de calcul trebuie sa fie ridicata, trebuie sa fie eliminata pe cat posibil posibilitatea introducerii de erori in rezultatul final, iar o aplicatie care utilizeaza baze de date reuseste sa atinga acest obiectiv. In acest sens sunt necesare o serie de verificari la introducerea de informatii in sistem, care sa evite aceste erori(cum ar fi de exemplu verificarea ca la introducerea unui consum sau a unei sume, sa nu poata fi introduse valori negative).Concluzionand, baza de date va trebui sa contina toate informatiile necesare calculului si a evidentei cheltuielilor lunare ale imobilelor. Aceste informatii vor fi introduse de catre utilizatorul sistemului, adica de catre administratorul imobilului, prin intermediul interfetei puse la dispozitie de aplicatie.Avand in vedere ca in general administratorii de imobil nu sunt persoane cu pregatire informatica sau cunostinte de operare, cei mai multi dintre acestia nefiind familiarizati cu tehnica de calcul, aplicatia trebuie sa fie cat mai intuitiva, cat mai usor de utilizat si sa nu contina elemente care ar putea sa genereze situatii de ambiguitate. Este de asemenea important ca interfata aplicatiei sa fie realizata in intregime cu termeni in limba romana, iar

Page 396: tutoriale vba

termenii utilizati pentru denumirea elementelor constitutive ale interfetei sa reprezinte cat mai bine termenii corespondenti din limbajul specific al acestui domeniu, mai exact termeni gasiti si in legislatia referitoare la asociatiilor de proprietari.Automatizarea procesului de calcul prin intermediul aplicatiei trebuie sa fie de asemenea transparent, fazele in care se obtin valori intermediare nu au importanta practica pentru administrator. 2.2 Metodica de proiectare a aplicatieiDezvoltarea unui sistem este o activitate laborioasa ce cuprinde o multitudine de sub-activitati("tasks") desfasurate intr-o maniera metodica. Aceste sub-activitati pot fi grupate in etape importante. Fiecare etapa are definite clar elementele livrate (adica ce produse finale sunt obtinute la incheierea etapei) etapelor ulterioare.In cadrul fiecarei etape (stadiu) sub-activitatile tind sa fie de scurta durata si pot fi estimate cu usurinta. Fiecare sub-activitate este divizata in mai multe sub-sub-activitati. O anumita sub-sub-activitate se poate repeta de un numar de ori din diferite motive. Vom discuta despre dezvoltarea pe baza modelului CASE(Computer-Aided Szstems Engineering).Prezentam in mare etapele importante de dezvoltare, conform acestui model, fara a insista cu detalii asupra metodelor si sub-activitatilor corespunzatoare fiecarei etape :- etapa de strategie -; obiectivul este de a produce un set de modele de business, un set de recomandari si un plan agreat pentru dezvoltarea sistemelor de informatii ce vor servi nevoilor curente si viitoare ale organizatiei, tinand cont de constrangerile financiare si tehnice ale organizatiei.a9i Este analizata problema care trebuie rezolvata, pe baza specificatiilor de definitie. Aceste specificatii sunt obtinute in urma discutiilor avute cu beneficiarul aplicatiei, studierea unor documentatii legate de domeniul de activitate respectiv, in acest caz este vorba de studierea legislatiei asociatiilor de proprietari si discutiile avute cu administratorul de imobil;- etapa de analiza -; Preia si verifica lucrurile obtinute in etapa strategie si le expandeaza in detaliu suficient pentru a asigura acuratetea de business, fezabilitatea si un fundament sanatos pentru proiectare, in cadrul domeniului organizatiei si avand in minte sisteme existente;a9i- etapa de proiectare -; pe baza etapei de analiza, se realizeaza proiectarea aplicatiei, in urma careia rezulta directive concrete pentru etapa de implementarea9i, de exemplu se realizeaza proiectarea schemei bazei de date, stabilirea functiilor de business necesare in sistem, etc.;- etapa de implementare -; realizarea efectiva a aplicatiei, scrierea codului, realizarea bazei de date, compilarea aplicatiei sub forma unui program executabil;- etapa de testare -; produsul software este testat in conditii normale de utilizare si se rezolva eventualele probleme;- etapa de documentare -; se scrie documentatia aplicatiei(sub forma tiparita si/sau online), se face instruirea viitorilor utilizatori ai aplicatiei.

Figura 1. Ciclul de viata al unui sistem informatica9iRezultatul stadiilor strategie si analiza trebuie sa fie complet independente de orice tehnica de implementare specifica, pentru a da proiectantului oportunitatea maxima de a folosi tehnologia potrivita si pentru a proiecta in coexistenta cu sisteme curente. Metoda CASE trebuie sa fie doar scheletul, ea trebuie completata cu ideile proprii si inovatia contribuie la calitatea produsului final.Business-urile sunt in continua miscare. In linii mari se schimba nu CE este facut ci CINE si CUM face. Modelele folosite pentru a defini cerintele business-ului trebuie sa permita modificari rezonabile in structura organizatiei. Modelele trebuie sa fie de asemenea independente de toate solutiile cunoscute.Sistemul trebuie sa continue sa functioneze eficient cand, de exemplu, sunt adoptate proceduri

Page 397: tutoriale vba

noi de fabricatie, vanzare, administrare.Cerintele ar trebui modelate si definite intr-o maniera generica. Cerintele functionale ar trebui sa defineasca ce este facut, nu cum sau de catre cine. Structura datelor trebuie sa permita modificari: in structura organizatiei, pentru exceptii si pentru limite curente si observabile.a9i2.3 Etapa analiza. Entitati si AtributePentru a ajunge la realizarea structurii bazei de date, am utilizat specificatiile de definitie(prezentate in subcapitolul 1.2). Pe baza acestor specificatii extragem entitatile si atributele care constituie puncte de plecare la proiectarea bazei de date.NOTIUNE CALITATE(entitate sau atribut) imobil Entitate denumire imobil Atribut adresa imobil Atribut localitate Atribut judet Atribut nume administrator Atribut apartament Entitate numar apartament Atribut proprietar Atribut numar de camere Atribut numar de persoane Atribut suprafata Atribut furnizor Entitate denumire furnizor Atribut cod fiscal Atribut adresa furnizor Atribut factura Entitate numar document Atribut consum Atribut suma Atributincasare Entitate numar chitanta Atribut data emiterii Atribut suma Atribut luna Entitate anul Atribut tip calcul Entitate tip consum Entitate denumire consum Atribut unitate de masura Atribut consum Entitate valoare AtributTabel 1. Lista cu entitati si atributeIn tabelul 2 prezentam entitatile cu tipul acestora precum si cu legaturile dintre ele.ENTITATE TIP ENTITATE ENTITATI CU CARE ARE LEGATURA imobil entitate de baza apartament entitate de baza • luna• incasare• consum furnizor entitate de baza • tip consum factura entitate de baza • luna• tip consumincasare entitate de baza • apartament luna entitate de baza • apartament• factura tip calcul entitate de baza • tip consum consum entitate de legatura • apartament• tip consum tip consum entitate de baza • consum• factura• furnizor• tip calculTabel 2. Entitatile si legaturile dintre eleAceste legaturi le-am stabilit pe baza textului care constituie specificatiile de definitie si sunt piesele de baza la proiectarea structurii bazei de date. Pentru inceput, entitatile si atributele acestora sunt elementele de baza pentru alcatuirea diagramei entitate-relatie.Modelarea ER a fost inventata la mijlocul anilor '70 de Peter Chen si ramane in continuare principala abordare pentru modelarea datelor.a9i Prin aceasta reprezentare schematica sub forma unei diagrame se reprezinta entitatile, atributele si relatiile dintre entitati precum si tipul acestor relatii.In tabelul 3 sunt enumerate atributele, pentru fiecare dintre acestea am stabilit tipul de date pe care il vor avea la realizarea bazei de date, in vederea reprezentarii corecte si complete a informatiei. Coloana a 2-a reprezinta numele efectiv utilizat pentru implementare, astfel am dorit sa evit folosirea caracterului spatiu in structura bazei de date.ATRIBUT NUME UTILIZAT IN BD TIP DE DATE LUNGIME ENTITATEA DE CARE APARTINE denumire imobil denumire sir de caractere 50 imobil adresa imobil adresa sir de caractere 50 imobil localitate localitate sir de caractere 50 imobil judet judet sir de caractere 50 imobil nume administrator numeAdministrator sir de caractere 50 imobil numar apartament nrApartament numeric long integer apartament proprietar proprietar sir de caractere 50 apartament numar de camere nrCamere numeric long integer apartament numar de persoane nrPersoane numeric long integer apartament suprafata suprafata numeric long integer apartament denumire furnizor denumireFurnizor sir de caractere 50 furnizor cod fiscal CF sir de caractere 50 furnizor adresa furnizor adresa sir de caractere 50 furnizor numar

Page 398: tutoriale vba

document nrDocument sir de caractere 50 factura consum consum numeric long integer factura suma suma numeric long integer factura numar chitanta nrChitanta sir de caractere 50 incasare data emiterii data data calendaristica incasare suma suma numeric double incasare luna luna numeric long integer luna anul anul numeric long integer luna tip calcul tipCalcul sir de caractere 50 tip calcul denumire consum denumireConsum sir de caractere 50 tip consum unitate de masura UM sir de caractere 50 tip consum valoare valoare sir de caractere 50 consumTabel 3. Atributele cu tipurile de date corespunzatoare si entitatile de care apartinPe langa aceste atribute, vom folosi si unele atribute aditionale, cum ar fi atributul „observatii” la entitatile apartament si furnizor, utile in cazul in care utilizatorul doreste sa isi noteze anumite observatii despre apartamentul sau furnizorul respectiv.Continuand analiza specificatiilor de definitie, extragem relatiile dintre entitati, care pot sa fie dintre urmatoarele tipuri:- 1:N (one to many) - la o instanta a unei entitati ii corespunde una sau mai multe din cea de-a doua entitate- 1:1 (one to one) - la o instanta a unei entitati ii corespunde o instanta a celei de-a doua entitatati- N:N (many to many) - la o instanta a unei entitati ii corespunde una sau mai multe din cea de-a doua entitate si reciproc, acesteia din urma ii corespund una sau mai multe instante ale primei entitati. In acest caz trebuie introdusa o entitate de legatura pentru implementarea relatiei.Astfel, relatiile pentru cazul de fata vor fi:TEXT SPECIFICATIE ENTITATE 1 ENTITATE 2 TIP DE RELATIE un imobil contine unul sau mai multe apartamente imobil apartament 1:N pentru o luna se pot emite una sau mai multe facturi luna factura 1:N unui tip de consum ii pot reveni astfel una sau mai multe facturi tip consum factura 1:N un tip de calcul poate fi determinant pentru unul sau mai multe tipuri de consum tip calcul tip consum 1:N pentru un apartament se pot efectua una sau mai multe incasari apartament incasare 1:N un apartament poate sa aiba unul sau mai multe consumuri apartament consum 1:N un tip de consum este determinant pentru unul sau mai multe consumuri tip consum consum 1:N* un furnizor poate fi determinant pentru unul sau mai multe tipuri de consum furnizor tip consum 1:Nintr-o luna exista unul sau mai multe apartamente luna apartament 1:N*Tabel 4. Relatiile dintre entitatiRelatiile notate cu * sunt obligatorii.2.4 Etapa analiza. Evenimente si FunctiiInstantierea entitatilor se face numai in momentul aparitiei unor evenimente sau functii de business. Principala functie de business pe care trebuie sa o rezolve aceasta aplicatie ar fi calculul cheltuielilor lunare. Prezentam in continuare o lista a acestor functii.EVENIMENT FUNCTIE ATASATA EVENIMENTULUI EXPLICATIE CU DETALIITrecerea la o luna curenta noua Generarea unei luni de prelucrare noi - stabilirea noii luni de prelucrare- actualizarea datelor despre apartamente (in special numarul de persoane, proprietarul) Primirea facturilor lunare de la furnizorii de servicii Introducerea facturilor - stabilirea lunii curente de prelucrare- stabilirea unui furnizor de servicii, cu datele de identificare ale acestuia (denumire, cod fiscal, adresa)- stabilirea unui tip de consum, cu specificarea tipului de calcul aferent, denumirea tipului de consum si unitatea de masura utilizata- introducerea facturii, cu stabilirea tipului de consum, specificarea numarului de document, consumul pentru serviciul respectiv si contravaloarea acestuia

Page 399: tutoriale vba

Citirea contoarelor din apartamente Introducerea consumurilor - stabilirea lunii curente de prelucrare- introducerea consumurilor citite de la contoarele de apartament cu specificarea tipului de consum si a numarului de apartamentAtingerea datei de afisare a cheltuielilor Calculul cheltuielilor lunare - stabilirea lunii curente de prelucrare- verificare daca toate datele necesare pentru calculul cheltuielilor au fost introduse in sistem, inclusiv consumurile contorizate- calcularea cheltuielilor lunare- afisarea listei de cheltuieliProprietarul unui apartament achita contravaloarea cheltuielilor lunare Incasare - stabilirea lunii curente de prelucrare- verificarea sumei datorate de proprietar, pe baza calculelor efectuate si a situatiei platilor pentru apartamentul respectiv pana in momentul dat- introducerea sumei incasate- emiterea unei chitanteTabel 5. Evenimente si functii2.5 Etapa proiectare. Diagrama Entitate-RelatieIn etapa de proiectare vom utiliza informatiile obtinute la faza de analiza pentru a realiza diagrama Entitate-Relatie, pe baza listelor cu entitati, atribute si relatii dintre acestea, precum si diagrama de functii, pe baza listei de evenimente si functii.Diagrama Entitate-Relatie este o forma generalizata si abstractizata a listei de entitati si atribute, si este utilizata apoi pentru realizarea schemei bazei de date. Aceasta diagrama este independenta de sistemul de gestiune a bazelor de date utilizat in etapa de implementare.Pentru generarea diagramei Entitate-Relatie, se pot utiliza unelte CASE, care permit editarea acesteia in mod vizual si care apoi pe baza diagramei astfel realizate pot sa genereze in mod automat structura bazei de date. Am utilizat in acest scop aplicatia AllFusion ERwin Data Modeler 4.1, dar pentru ca utiliza elemente de reprezentare a diagramei diferite de cele studiate, am decis sa realizez aceasta diagrama manual.Prezentam in continuare cateva elemente de notatie ale diagramei Entitate-Relatie.pentru entitati, exista urmatoarele notatii:Dreptunghiul cu colturile rotunjite reprezinta entitatea, in care cu litere mari se noteaza denumirea entitatii, si cu litere mici se noteaza atributele.Linia dintre entitati indica existenta unei relatii intre acestea. Astfel, linia continua indica o relatie obligatorie, linia intrerupta(punctata) reprezinta o relatie obligatorie iar „furca” reprezinta o relatie la N in partea respectiva, in cazul reprezentarii de mai sus relatia fiind de 1:N. pentru specificarea atributelor, exista 3 simboluri distincte:# (diez) indica faptul ca atributul respectiv este un element de identificare a entitatii, numit si cheie, sau ID.* (asterisc) indica faptul ca atributul este unul obligatoriu.? (grad) indica faptul ca atributul este optional.

Citirea diagramei Entitate-Relatie:Cuvintele din apropierea liniilor sunt cuvinte cheie care definesc relatia si se citesc astfel: <ENTITATE 1> <cuvant cheie><ENTITATE 2>Cuvintele cheie care sunt deasupra liniei sunt pentru citirea in directia de la stanga la dreapta, iar cele care sunt sub linie pentru citirea in sens invers, de la dreapta la stanga.Exemplu: apartament are un consum consum pentru apartament luand in considerare si relatia de 1:N neobligatorie, vom citi: un apartament poate sa aiba unul sau mai multe consumuri un

Page 400: tutoriale vba

consum trebuie sa fie pentru un apartamentAceasta metoda de citire a diagramei se foloseste pentru toate entitatile si toate relatiile dintre acestea.Se poate observa in diagrama Entitate-Relatie existenta unor atribute de identificare, , identificatori unici sau de tip cheie, acestea sunt necesare pentru stabilirea legaturilor dintre entitati in faza de implementare a schemei bazei de date. In continuare vom enumera aceste atribute:ATRIBUT ENTITATEA DE CARE APARTINE TIP ATRIBUT lunaID luna cheie primara apartamentID apartament cheie primara incasareID incasare cheie primara consumID consum cheie primara tipConsumID tipConsum cheie primara furnizorID furnizor cheie primara tipCalculID tipCalcul cheie primara facturaID factura cheie primaraTabel 6. Atribute de identificareBara verticala perpendiculara pe o linie de legatura la capatul dinspre N ne indica faptul ca identificatorul unic(cheia) al entitatii respective se propaga, pe baza relatiei de legatura, si in entitatea care are aceasta bara. Acest fapt este utilizat la constructia structurii bazei de date pentru realizarea efectiva a relatiilor dintre entitati.Am exclus entitatea imobil din diagrama Entitate-Relatie pentru ca legatura acesteia cu alte entitati a fost ignorata din considerente bine intemeiate. Astfel, in loc sa consideram ca fiind utila relatia dintre entitatile imobil si apartament, am preferat sa cream o legatura artificiala intre entitatile luna si apartament, care va fi mult mai utila la realizarea acestei aplicatii, deoarece intre aceste doua entitati exista o relatie de 1:N, adica la fiecare instanta de tip luna ii vor corespunde toate apartamentele din imobil, cu specificatia ca acestea vor avea structura(din punct de vedere al numarului de persoane, al proprietarului, al suprafetei si a numarului de camere) valabila numai pentru luna curenta de prelucrare. Astfel obtinem o flexibilitate sporita la trecerea de la o luna la alta, pentru ca modificarea unei caracteristici a unui apartament nu va influenta situatia din lunile anterioare.2.6 Etapa proiectare. Diagrama Functionala Figura 3. Diagrama functionala2.7 Etapa proiectare. Arhitectura aplicatiei Pentru dezvoltarea aplicatiilor cu baze de date, in functie de necesitatile de utilizare ale aplicatiei, se pot utiliza 3 tipuri de arhitectura, pe care le vom prezenta in continuare. a. Arhitectura DesktopArhitectura desktop este caracterizata de coexistenta aplicatiei si a bazei de date pe aceeasi masina fizica(pe acelasi calculator)Figura 4. Arhitectura DesktopAcest tip de arhitectura se utilizeaza in cazul aplicatiilor de complexitate redusa, cand baza de date este utilizata de o singura aplicatie si eventual de un singur utilizator. Accesul la baza de date se face fie direct de catre aplicatie(de exemplu in cazul unei aplicatii realizate in Visual Fox) sau prin intermediul unui motor de baze de date.b. Arhitectura Client-ServerIn cazul arhitecturii client-server, baza de date si aplicatia nu se gasesc neaparat pe acelasi calculator. Aplicatia ruleaza pe un sistem de calcul numit client, iar baza de date se gaseste pe un alt sistem de calcul, numit server, si este gestionata de un server de baze de date(de exemplu SQL Server, MySQL, etc.) Comunicarea dintre client si server se face prin intermediul unui canal de comunicatie, care este de obicei o retea locala LAN(Local Area Network) sau o retea WAN(Wide Area Network).Acest tip de arhitectura permite accesul la baza de date de la distanta prin conectarea directa a clientului la serverul de baze de date, de exemplu printr-o conexiune de tip peer-to-peer.Figura 5. Arhitectura Client-Serverc. Arhitectura Multistrat

Page 401: tutoriale vba

Arhitectura multistrat este cea mai moderna dintre cele 3, si este caracterizata prin existenta a cel putin 3 sisteme de calcul, in mod generic. Aplicatia ruleaza pe sistemul client, pe care eventual ruleaza si un browser de web, prin intermediul caruia aplicatia poate sa emita cereri serverului de aplicatii, care poate fi de asemenea si un server de web. Serverul de aplicatii contine regulile de business ale aplicatiei, si este controlat de un administrator care cunoaste foarte bine intregul sistem si se ocupa cu eventualele actualizari ale sistemului. Un al treilea sistem este serverul de baze de date, unde se gaseste si baza de date. Serverul de aplicatii functioneaza ca un intermediar(gestionar) intre client si serverul de baze de date.In aplicatiile prin intermediul internetului, de multe ori pe calculatorul client nu ruleaza o aplicatie specializata, ci doar serverul de web, iar utilizatorul are acces la baza de date prin accesarea unei pagini de internet.Figura 6. Arhitectura MultistratDintre cele trei arhitecturi prezentate, vom utiliza pentru dezvoltarea aplicatiei arhitectura desktop, pentru ca deocamdata nu se justifica utilizarea unei conexiuni la distanta sau prin intermediul internetului. Intr-o etapa de dezvoltare ulterioara a aplicatiei, se pot lua in considerare si celelalte tipuri de arhitectura. Aceasta problema este dezbatuta pe larg in capitolul Dezvoltari ulterioare.2.8 Etapa implementare Pentru implementarea aplicatiei am ales mediul de programare Visual Basic 6.Mediul de programare Microsoft? Visual Basic este unul dintre cele mai utilizate medii de programare pentru realizarea aplicatiilor cu baze date, pentru ca acest mediu are o serie de facilitati pentru utilizarea bazelor de date.Visual Basic 6 contine un motor complet de baze de date, care reprezinta, in esenta, o aplicatie de baze de date cu autocontinere. Spre deosebire de un procesor de texte sau alte aplicatii dotate cu interfete utilizator, o baza de date lucreaza, de regula, „in fundal”. Orice interfata vizibila de catre utilizator este cel mai adesea construita pentru o anumita aplicatie. Functionalitatea bazei de date este asigurata de un program denumit motorul bazei de date. Visul Basic simplifica programarea conectivitatii la o baza de date sau utilizarea controalelor grafice pentru configurarea modului de afisare si transformare a datelor.a10iPrin notiunea de conectare la o baza de date intelegem stabilirea unui protocol de comunicatie intre aplicatie si motorul care gestioneaza baza de date.Am ales acest mediu de programare pentru ca este o unealta cu un suport puternic in ceea ce priveste lucrul cu baze de date. Visual Basic permite conectarea nativa la numeroase tipuri de baze de date, cum ar fi: Acces, DBASE III, dBASE IV, dBASE 5.0, FoxPro 2.0, 3.0, Paradox 3.x-5.x, ODBC, etc.De asemenea, acest mediu de programare contine elemente puternice de dezvoltare a interfetelor utilizator, precum si de utilizare a controalelor ActiveX. ActiveX este o tehnologie Microsoft care permite utilizarea in cadrul unei aplicatii sau a unor unelte de dezvoltare a unor obiecte dezvoltate de catre o alta aplicatie. Aceste aplicatii sau unelte de dezvoltare se numesc formal OLE Automation Servers.a11iPentru conectarea la baza de date vom utiliza un control Microsoft ADO -; ActiveX Data Objects.ActiveX Data Objects este o tehnologie dezvoltata de Microsoft pentru accesul la baze de date care implementeaza obiecte de tip data connection, data command, recordset si colectii ale acestor obiecte. Aceasta tehnologie permite si realizarea de aplicatii de tip client-server, aplicatii cu baze de date avand la baza tehnologii web sau internet.a11iPentru implementarea bazei de date am ales o tehnologia dezvoltata de Microsoft Acces, tehnologie care foloseste acelasi motor de baze de date ca si Visual Basic. Astfel, cu ajutorul Microsoft Acces, specializat pe lucrul cu baze de date, am creat structura bazei de date, iar ca rezultat fizic, baza de date este continuta intr-un singur fisier, cu extensia .mdb.

Page 402: tutoriale vba

Aplicatia este centrata pe un formular(engleza form) de tip MDI, Multiple-Document Interface, care este un formular de tip container, mentine mai multe formulare in interiorul sau. Aceste formulare, numite si formulare child, pot sa fie deschise simultan in interiorul containerului, fiecare intr-o fereastra proprie si cu functionalitate proprie.De asemenea, am utilizat doua controale de tip ActiveX:VideoSoft VSFlexGrid, care este un control de tip grid, cu o functionalitate foarte bine pusa la punct, si care permite inclusiv legarea grid-ului de o sursa de date prin intermediul ADO, OLEDB sau DAO.Data Dynamics ActiveReports este un control specializat pe generarea de rapoarte dintr-o sursa de date. Acesta prezinta multiple facilitati, cum ar fi tiparirea raportului la imprimanta, functii de marire-micsorare, exportul raportului in diferite formate.Din punct de vedere al accesului la baza de date, acesta se face prin intermediul unor interogari SQL care au ca rezultat un recordset(set de inregistrari) sau prin comenzi directe ale instantei unui obiect de tip Connection.Implementarea efectiva a aplicatiei, este descrisa amanuntit in capitolul 3, Memoriu Justificativ.3. MEMORIU JUSTIFICATIV3.1 Proiectarea si implementarea bazei de date Proiectarea bazei de date am facut-o pe baza etapelor studiate in capitolul anterior, iar implementarea cu ajutorul produsului Microsoft Acces.Baza de date va fi sub forma unui fisier de tip mdb, si fiecare astfel de fisier va reprezenta un imobil(sau o asociatie de proprietari), la un moment dat pot sa existe mai multe baze de date ale mai multor imobile, iar la rularea aplicatiei utilizatorul va putea sa aleaga imobilul(asociatia de locatari), si implicit baza de date curenta. Am ales aceasta metoda pentru a obtine o mai buna portabilitate a bazei de date.In urma etapelor de analiza si de proiectare prezentate in capitolul anterior, am realizat structura bazei de date cu ajutorul produsului Microsoft Acces. Astfel, baza de date contine un numar de 11 tabele, 9 sunt cele corespunzatoare entitatilor prezentate in tabelul 1 din subcapitolul 2.3:- apartament- consum- factura- furnizor- imobil- incasare- luna- tipCalcul- tipConsumCelelalte 2 sunt tabele auxiliare, care nu rezulta in urma analizei, ci au fost introduse ca elemente ajutatoare pentru simplificarea codului. Acestea sunt:- deIncasat -; se memoreaza temporar rezultate ale calculelor efectuate- listaRap -; se stocheaza temporar diverse informatii necesare generarii de rapoarteIn figura urmatoare, prezentam structura bazei de date, cu tabelele si legaturile dintre ele. Observam ca fata de atributele prezente in diagrama entitate-relatie, sunt prezente si atributele de identificare de tip chei straine, care se propaga in momentul realizarii legaturilor dintre tabele. De exemplu, in tabela apartament, atributul LunaID, este cheie straina propagata din tabela luna, pentru a se face legatura dintre cele 2 tabele.Figura 7. Structura bazei de dateIn general, am denumit atributele de identificare cu postfixul ID(de la identificator sau index).

Page 403: tutoriale vba

Mentionez ca in momentul implementarii bazei de date, prin definirea unei legaturi intre 2 tabele, am stabilit reguli de fortare a integritatii referentiale, adica motorul de baze de date nu va permite stergerea unei inregistrari din baza de date daca aceasta inregistrare are legatura cu o alta inregistrare din tabela cu care se afla in relatie. Aceasta regula se defineste in sensul de la 1 la N, adica nu pot sa sterg inregistrarea de la capatul 1 daca la capatul N exista cel putin o inregistrare care are referinta la aceasta.Stabilirea acestei reguli se face prin bifarea optiunii „Enforce Referetial Integrity” la editarea unei relatii.Fiecare fisier de tip mdb aflat in directorul aplicatiei va contine baza de date corespunzatoare unei asociatii de proprietari, exceptie face fisierul template.mdb, care se livreaza o data cu aplicatia, si care contine structura generica a bazei de date, fara a contine date despre o anumita asociatie. Acest fisier este folosit ca si model in momentul in care utilizatorul creeaza prima baza de date a unei asociatii de proprietari sau atunci cand creeaza o asociatie noua. Fiecare fisier nou creat va avea forma: mdb<nume_asociatie>.mdb exemplu: mdbCiortea7.mdb va contine baza de date pentru asociatia de proprietari denumita de catre utilizator Ciortea7La initializarea aplicatiei, se apeleaza o functie care cauta toate fisierele care incep cu mdb si au extensia mdb din directorul curent si le pune la dispozitia utilizatorului, pentru ca acesta sa poata sa aleaga baza de date cu care va lucra. In acest mod am asigurat o buna portabilitate a informatiei, necesara de exemplu in cazul in care utilizatorul foloseste doua calculatoare pe care are instalata aplicatia, transportul informatiei intre cele 2 puncte de lucru se face prin simpla copiere a fisierului respectiv din directorul aplicatiei.Numele ultimei baze de date utilizate se memoreaza la iesirea din aplicatie intr-un fisier de configurare, astfel ca utilizatorul nu va trebui sa aleaga de fiecare data cand intra in aplicatie baza de date curenta.Acest fisier se numeste administrator.ini, se gaseste in directorul aplicatiei si are urmatoarul continut:Afiseaza Dialog Selectie Asociatie = FalseUltima Asociatie Utilizata = Dorobantilor109Prima optiune se refera la afisarea formularului de selectie a asociatiei curente la lansarea in executie a aplicatiei si poate sa aiba valorile True(adica afiseaza) sau False(adica nu afiseaza).3.2 Proiectarea interfetei utilizator Meniul aplicatieiMeniul aplicatiei este implementat in formularul container MDI, care se numeste frmMDIPrincipal. si are urmatoarea structura arborescenta:Figura 8. Structura arborescenta a meniuluiTabelul urmator contine categoriile, subcategoriile meniului precum si functionalitatea acestora.CATEGORIE SUBCATEGORIE FUNCTIONALITATEGeneral Alege Luna Curenta Alegerea, schimbarea lunii curente de prelucrareAlege Asociatie Alegerea, schimbarea asociatiei de proprietari curenteOptiuni Optiuni ale aplicatieiIesire Iesire din aplicatieActualizari Facturi Lunare Introducerea, modificarea si vizualizarea facturilor lunare de la furnizorii de serviciiConsumuri pe Apartament Introducerea, modificarea si vizualizarea consumurilor lunare pe apartament(apartamentele contorizate)Incasari Locatari Introducerea, modificarea si vizualizarea incasarilor de la proprietarii de apartamente(locatari)Afisari Lista Cheltuieli Generarea, vizualizarea si tiparirea listei lunare de cheltuieli cu suma

Page 404: tutoriale vba

totala de plata si restanteLista Cheltuieli Defalcate Generarea, vizualizarea si tiparirea listei lunare de cheltuieli cu suma totala de plata, restante si sumele defalcate pe consumuri.Situatie Apartament Vizualizarea situatiei incasarilor pentru un apartamentNomenclatoare Apartamente Introducerea, modificarea si vizualizarea datelor despre apartamenteDate Asociatie Introducerea, modificarea si vizualizarea datelor despre asociatia de proprietari(imobil)Tip Consum Introducerea, modificarea si vizualizarea tipurilor de consum(tipuri de servicii)Furnizori Introducerea, modificarea si vizualizarea listei de furnizori de serviciiAjutor Asistenta Documentatia online(help-ul) a aplicatieiDespre Informatii despre aplicatieTabel 7. Structura meniuluiIn general, functionalitatea meniului, si implicit a aplicatiei, este legata de luna curenta de prelucrare, care se poate modifica din meniul General. Exceptie de la aceasta regula fac subcategoriile aflate in categoria General, subcategoria Situatie Apartament din categoria Afisari, precum si Date Asociatie din categoria Nomenclatoare. Luna curenta de prelucrare este afisata permanent pe bara de titlu a aplicatiei(Title Bar). Prin schimbarea lunii curente de prelucrare folosind subcategoria Alege Luna Curenta, se actualizeaza toate informatiile dependente de luna de prelucrare, inclusiv nomenclatorul de apartamente, furnizori sau tipuri de consum.In figura 9 este prezentata o mostra referitoare la organizarea meniului. Caracterele care sunt subliniate sunt shortcut-uri pentru utilizarea cu ajutorul tastaturii.Figura 9. Forma meniuluiPe bara de titlu a aplicatiei este afisata permanent asociatia de proprietari curenta(in figura 9 este Dorobantilor 109), luna curenta si anul curent de prelucrare(in figura 9 este vorba de iunie 2004).Fiecare subcategorie din meniu, cu exceptia celei de Iesire, are atasat un formular, care se initializeaza si se afiseaza la activarea optiunii respective. Subcategoriile Lista Cheltuieli si Lista Cheltuieli Defalcate au atasat acelasi formular, dar la initializarea acestuia se stabileste intr-o variabila specifica care dintre optiuni a facut apelul.Toate formularele apartin containerului MDI, cu exceptia subcategoriei Asistenta, care se deschide separat fata de aplicatie.Mentionez ca am urmarit sa realizez interfata utilizator intr-un mod cat mai simplu si intuitiv, folosind elemente de interfata standard de Windows, astfel incat utilizatorul sa fie deja familiarizat cu o mare parte din aceste elemente.Formulare FORMULAR TIP FORMULAR SUBCATEGORIE sau FORMULAR FUNCTIONALITATE frmSelectieLuna dialog modal Alege Luna Curenta Alegerea, schimbarea lunii curente de prelucrare frmAlegeAsociatie dialog modal Alege Asociatie Alegerea, schimbarea asociatiei de proprietari curente frmOptiuni dialog Optiuni Optiuni ale aplicatiei frmMsgBoxRom dialog modal Utilizat pentru rezolvarea unor optiuni de tip DA/NU frmFacturi MDI child Facturi Lunare Introducerea, modificarea si vizualizarea facturilor lunare de la furnizorii de servicii frmConsum MDI child Consumuri pe Apartament Introducerea, modificarea si vizualizarea consumurilor lunare pe apartament(ap. contorizate) frmIncasare MDI child Incasari Locatari Introducerea, modificarea si vizualizarea incasarilor de la proprietarii de apartamente(locatari) frmListaCheltuieli MDI child Lista CheltuieliLista Cheltuieli Defalcate Generarea, vizualizarea si tiparirea listei lunare de cheltuieli cu suma totala de plata, restante si sumele defalcate pe consumuri. frmSituatieAp MDI child Situatie Apartament Vizualizarea situatiei incasarilor pentru un apartament frmApartamente

Page 405: tutoriale vba

MDI child Apartamente Introducerea, modificarea si vizualizarea datelor despre apartamente frmDateAsociatie MDI child Date Asociatie Introducerea, modificarea si vizualizarea datelor despre asociatia de proprietari frmTipConsum MDI child Tip Consum Introducerea, modificarea si vizualizarea tipurilor de consum(tipuri de servicii) frmFurnizori MDI child Furnizori Introducerea, modificarea si vizualizarea listei de furnizori de servicii frmSelectieData dialog modal frmIncasare Selectarea datei frmRECSelection dialog modal frmSituatieAp Alegerea unui anumit apartament dintr-o lista frmDespre dialog Despre Informatii despre aplicatieTabel 8. Lista FormularelorFormularele de tip dialog modal sunt formulare care odata afisate, vor ramane afisate peste toate formularele(ferestrele) deschise deja, interzicand accesul la acestea pana la rezolvarea dialogului, de cele mai multe ori apasarea pe un buton de pe formularul dialog.Observam in tabelul 8 ca unele formulare, cum ar fi frmSelectieData sau frmMsgBoxRom nu sunt direct afisabile dintr-o subcategorie a meniului. Aceste formulare sunt utilizate de catre alte formulare sau sunt afisate direct, fara a avea un formular parent.Formulare cu regim special sunt frmAlegeAsociatie, si frmSelectieLuna, ambele sunt de tipul dialog modal.Formularul frmAlegeAsociatie este afisat la prima intrare in aplicatie sau daca este bifata optiunea respectiva, se ocupa cu selectarea asociatiei de proprietari curenteFigura 10. Formularul frmAlegeAsociatieAsa cum am precizat deja, acest formular cauta toate fisierele a caror denumire incepe cu mdb si au extensia mdb din directorul aplicatiei si le adauga in controlul de tip lista care se vede si in figura 9. Secventa de cod care face acest lucru este urmatoarea: fisier = Dir(appPath & "\" & "mdb*.mdb")If fisier <> "" Then comboAsociatie.AddItem (mid(fisier, 4, Len(fisier) - 7))End IfWhile fisier <> "" fisier = DirIf fisier <> "" Then comboAsociatie.AddItem (mid(fisier, 4, Len(fisier) - 7))End IfWendFormularul frmSelectieLuna are de asemenea un regim special, acesta se afiseaza intotdeauna la pornirea aplicatiei precum si la apelarea subcategoriei Alege Luna din meniu. Din punct de vedere functional, acesta se ocupa cu selectarea lunii curente si a anului curent de prelucrare, prin interogarea bazei de date referitor la inregistrarile din tabelul luna.Figura 11. Formularul de selectie a lunii de prelucrareDupa cum se observa in figura de mai sus, formularul incarca intr-un control de tip lista lunile de prelucrare gasite in tabela luna. Utilizatorul are posibilitatea de a selecta una din lunile de prelucrare existente deja sau poate sa creeze o luna de prelucrare noua.Secventa de cod care ruleaza in momentul adaugarii unei luni noi este urmatoarea: anul = Val(InputBox("Introduceti anul", "Anul", Year(Date)))If anul < 2000 Or anul > 2100 Then Exit Sub luna = Val(InputBox("Introduceti luna", "Luna", Month(Date)))If luna < 1 Or luna > 12 Then Exit SubIf GetFieldFromTable("lunaID", "luna", "anul=" & anul & " and luna=" & luna) = "" Then idLastLuna = GetMaxMinFieldTable("max", "lunaID", "luna") conexiune.Execute "INSERT INTO luna (anul,luna) VALUES ("&anul&","&luna& ")"If Not IsNull(idLastLuna) Then idLuna = GetDBIdentityOpenRS rs, "SELECT * FROM apartament WHERE lunaID=" & idLastLunaIf rs.RecordCount <> 0 ThenWhile Not rs.EOF conexiune.Execute "INSERT INTO apartament " _

Page 406: tutoriale vba

&"(lunaID,NrApartament,Proprietar,NrPersoane,NrCamere,Suprafata) " _&"VALUES("&idLuna&","&rs("NrApartament")&",'"&rs("Proprietar")&"'," _&rs("NrPersoane")& "," & rs("NrCamere") & "," & rs("Suprafata") & ")" rs.MoveNextWendEnd IfEnd IfElseMsgBox "Aceasta luna este deja existenta in baza de date", vbExclamationEnd IfIn aceasta secventa de cod, pentru creearea unei luni noi de prelucrare se adauga o inregistrare in tabela luna si apoi se copiaza structura apartamentelor din luna cea mai recenta gasita in aceasta tabela.Un alt formular cu regim special pe care il vom prezenta este frmRECSelection, care este afisat la apasarea butonului Cauta Ap(Cauta Apartament) din toolbar-ul formularului frmSituatieAp. Este un formular de tip dialog modal.Figura 12. Formularul frmRECSelectionAcest formular cauta toate inregistrarile din tabela apartament chiar daca nu sunt pentru luna curenta de prelucrare. Dupa selectia unuia dintre apartamente, in formularul frmSituatieAp se vor afisa toate incasarile facute pentru apartamentul selectat.Proiectarea acestui formular este flexibila in sensul ca i se transmite printr-o variabila un sir care reprezinta o interogare SQL: frmRECSelection.lblQueryMaster = "SELECT apartamentID, nrApartament, " _ & "proprietar FROM apartament WHERE lunaID=" & ID_LUNA& " ORDER BY nrApartament"Un alt formular folosit de catre frmIncasare este frmSelectieData care este un dialog modal si contine un control de tip Microsoft Acces Calendar Control, utilizat pentru stabilirea datei la care s-a emis chitanta pentru o incasare.Nu vom discuta separat fiecare formular de tip MDI child, pentru ca din punct de vedere al interfetei utilizator sunt similare, diferentele sunt minore. De aceea, vom exemplifica functionalitatea unui astfel de formular, si anume frmApartamente care se ocupa de evidenta apartamentelor din imobil. Observam in figura 12 ca formularul este centrat pe un control de tip grid, care asa cum am specificat este implementat cu controlul VSFlexGrid.Editarea se face in interiorul grid-ului, prin scrierea informatiei direct de la tastatura sau in unele cazuri prin selectarea unei celule a gridului se deschide un combobox.In partea de deasupra gridului exista un toolbar, unde exista butoane pentru functiile de Salvare, Linie Noua si Stergere Linie. Figura 13. Formularul frmApartamenteControlul de grid este legat de baza de date direct, prin secventa:Dim rs As New ADODB.RecordsetOpenRS rs,"SELECT * FROM apartament WHERE LunaID="&ID_LUNA&" ORDER BY nrApartament"Set grNom.DataSource = rs grNom.DataMode = flexDMBoundBatch unde OpenRS este o functie care deschide un recordset pe baza unei interogari SQL si grNom este instanta obiectului de gridModificarile pe care utilizatorul le face in grid se actualizeaza efectiv in baza de date numai la apasarea butonului Salveaza prin apelarea functiei:Public Sub DocSave() rs.UpdateBatch adAffectAll trebuieSalvat = FalseEnd Sub3.3 ImplementareDin punct de vedere al codului, aplicatia este compusa dintr-un modul principal, aflat in

Page 407: tutoriale vba

fisierul principal.bas. In acest modul se afla declaratiile variabilelor globale, definitiile functiilor publice utilizate precum si rutina Main(), care se executa la rularea aplicatiei.Functionalitatea fiecarui formular este definita in interiorul formularului, in functii care trateaza evenimentele de interfata ale obiectelor, cum ar fi initializarea formularului(eveniment de tip Form_Load) apasarea unei taste, editarea unei celule a gridului, apasarea unui buton din toolbar, selectarea unui element dintr-un combo, etc.Din punct de vedere al accesului la baza de date din cod, am utilizat 2 metode: a. operatii directe asupra bazei de date cu ajutorul metodei Execute a instantei numita conexiune a obiectului Connection. exemple: actualizarea unei inregistrari conexiune.Execute "UPDATE imobil SET" _& " denumire='" & txtDenumire & "'" _& " ,adresa='" & txtAdresa & "'" _& " ,localitate='" & txtLocalitate & "'" _& " ,Judet='" & txtJudet & "'" _& " ,numeAdministrator='" & txtNumeAdministrator & "'" _& " WHERE imobilid=" & imobilID & "" creearea unei tabele: conexiune.Execute "CREATE TABLE listaRap" adaugarea unor campuri intr-o tabela: conexiune.Execute "ALTER TABLE listaRap ADD COLUMN ID LONG" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Ap TEXT(5)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Proprietar TEXT(100)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN NrPers TEXT(3)" conexiune.Execute "ALTER TABLE listaRap ADD COLUMN Suprafata LONG"b. interogari SQL ale bazei de date si obtinerea unui recordset cu rezultatul interogarii exemplu:OpenRS rs,"SELECT Sum(incasare.Suma) FROM apartament INNER JOIN incasare" _& " ON apartament.apartamentID = incasare.ApartamentID where " _& " (((apartament.LunaID) < " & idLuna & ")) GROUP BY" _& " apartament.NrApartame

 

Visual Basic Românesc   1/8/2013

Lista VB RoCartiSurseArticoleProgrameLegaturiPareri

 

 

Common Dialogs       O problema des intilnita in programare (nu numai in Visual Basic) este posibilitatea de a folosi dialogurile standard din Windows avind textele (caption-ul) butoanelor sau celorlalte controale modificate (in alta limba).       Aceasta problema am rezolvat-o pentru Delphi (vezi p01805 ) mult mai usor pentru ca in Delphi, controlul cind in Visual Basic acesta nu are evenimente.       O solutie ar putea fi construirea unei forme utilizator care arata la fel si executa acelasi lucruri, insa asta inseamna redescoperirea rotii si oricum, este destul de greu de facut.       Solutia problemei consta in crearea dialogurilor utilizind functiile API Windows si subclasificarea acestora. Dialogurile standard se gasesc in 2 fisiere: comdlg32.ocx si comdlg32.dll. Pt. construirea la run-time a dialogurilor se folosesc functiile API din

Page 408: tutoriale vba

 

GetSaveFileName, ChooseFont, ChooseColor, respectiv Print care nu mai au nevoie de        Pentru fiecare din aceste dialoguri trebuie completata o structura (tip de date definit de utilizator) si apelata functia corespunzatoare. Unul din elementele structurii este adresa unei functii pentru tratarea mesajelor corespunzatoare dialogului. In aceasta functie vom trata mesajul care se primeste evident la initializarea dialogului si in care putem schimba textul dorit. In mod normal functia de afisare a dialogului returneaza 0 daca a totul decurge normal sau nenula daca a aparut o eroare (s-a apasat Cancel, s-a inchis pur si simplu dialogul sau alte erori). Aceasta valoare poate fi analizata prin apelarea functiei CommDlgExtendedError.        Sa analizam o problema care apare la toate dialogurile. Asa cum am mai spus, unul din elementele structurii este adresa unei functii care trateaza mesajele dialogului. Desi in Visual Basic exista AddressOf care returneaza adresa unei functii sau proceduri aceasta poate fi folosita doar in apelarea unor alte functii sau proceduri nu se poate folosi de sine statator. Deci, nu se poate scrie d.lpfnHook = AddressOf OProcedura si nici combinatii de acest gen. Pentru aceasta atribuire vom scrie d.lpfnHook = pAddressOf(addressOf OProcedura) unde functia pAddressOf este ca mai jos: Public Function pAddressOf(ByVal procaddr As Long) As Long pAddressOf = procaddrEnd Function

       In mod normal toate aceste dialoguri nu au in coltul stinga sus nici un icon. Pentru a afisa un icon folosim functia WM_SETICON care are wParam nul (0&), iar lParam este un pointer la un icon (la iconul ferestrei).        Alta problema care apare este faptul ca functia care trateaza mesajele dialogului (functia forma sau class-module).       Sa luam pe rind fiecare dialog.

1. Open - acesta se foloseste pentru selectarea sau crearea unui fisier dintr-un folder care poate fi creat. Acest dialog poate arata in 2 feluri diferite: asemanator cu dialogul open pt. Windows 3.x sau asemanator cu Windows Explorerul din Windows 9x. De asemenea poate fi sau nu subclasificat. Sa vedem mai jos codul pt. crearea unui dialog open cu textul in romaneste folosind functia        Intr-un modul scriem functia de tratarea mesajelor (care modifica textul) astfel:

Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As String) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long

Public Const OFN_EXPLORER = &H80000Public Const OFN_ENABLEHOOK = &H20

Private Const WM_INITDIALOG = &H110Private Const WM_SETICON = &H80

Private Const IDC_OK As Long = 1Private Const IDC_CANCEL As Long = 2Private Const IDC_HELP As Long = 1038Private Const IDC_READONLY As Long = 1040Private Const IDC_LOOKIN As Long = 1091Private Const IDC_FILESTYPES As Long = 1089Private Const IDC_FILENAME As Long = 1090

Public Function fDialogCallBack(ByVal lnghwnd As Long, ByVal lngMessage As Long, _ ByVal wParam As Long, ByVal lParam As Long) As LongDim l As LongIf lngMessage = WM_INITDIALOG Then If Form1.FLAGS And OFN_EXPLORER Then l = GetParent(lnghwnd) Else l = lnghwnd End If SetDlgItemText l, IDC_OK, "&Deschide" SetDlgItemText l, IDC_CANCEL, "Renunta"

Page 409: tutoriale vba

SetDlgItemText l, IDC_LOOKIN, "Deschide &in" SetDlgItemText l, IDC_FILENAME, "&Nume fisier" SetDlgItemText l, IDC_FILESTYPES, "&Tip fisier" SetDlgItemText l, IDC_READONLY, "Deschide &read-only" SendMessage l, WM_SETICON, 0&, CLng(Form1.Icon)End IfEnd Function

       Pun pe o forma un buton (command1) si un text-box (text1) apoi se scrie: Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _ (pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME lStructSize As Long hwndowner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String FLAGS As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As StringEnd Type

Dim d As OPENFILENAMEDim nf As String * 260 'numele de fisier selectat

Public FLAGS As Long

Private Sub Command1_Click()d.lStructSize = Len(d)d.hwndowner = hwnd 'HWND-ul parintelui dialoguluid.lpstrFilter = "Toate fisierele (*.*)" & Chr(0) & "*.*" & Chr(0) & _ "Fisiere text (*.txt)" & Chr(0) & "*.*" & Chr(0) & Chr(0)d.lpstrCustomFilter = vbNullStringd.nFilterIndex = 1d.lpstrFile = nfd.nMaxFile = 260d.lpstrTitle = "Un titlu" 'titlul dialoguluid.FLAGS = OFN_ENABLEHOOK Or OFN_EXPLORERFLAGS = d.FLAGS'adresa functiei de tratarea mesajelor dialoguluid.lpfnHook = pAddressOf(AddressOf fDialogCallBack) GetOpenFileName d 'afiseaza dialogulText1 = d.lpstrFile 'foloseste numele selectat in dialogEnd Sub

       Felul in care arata dialogul este dat de valoarea continuta in cimpul FLAGS din tipul OPENFILENAME (pastrat si in variabila publica FLAGS din forma). Printre altele aceasta poate fi OFN_ENABLEHOOK pt. a activa utilizarea unei functii de tratarea mesajelor pentru dialog sau OFN_EXPLORER pt. stil gen Windows Explorer. In cazul in care stilul nu este OFN_EXPLORER atunci HWND-ul pasat functiei de tratarea mesajelor dialogului este chiar HWND-ul dialogului, altfel, daca stilul este OFN_EXPLORER atunci HWND-ul dialogului este GetParent-ul parametrului transmis.

Page 410: tutoriale vba

       Filter-ul dialogului este despartit prin chr(0), iar finalul este marcat prin chr(0) & chr(0)       Textul butoanelor si controalelor se poate schimba cu SetDlgItemText. Pt. asta trebuie sa stim identificatorul controlului in dialog. Pt. a determina identificatorii controalelor din dialog se poate folosi: Dim l As LongDim sx As String * 260

Public Function fDialogCallBack(ByVal lnghwnd As Long, ByVal lngMessage As Long, _ ByVal wParam As Long, ByVal lParam As Long) As LongIf lngMessage = WM_INITDIALOG Then For i = 1 To 10000 sx = Space$(260) l = GetDlgItemText(GetParent(lnghwnd), i, sx, 260) 'l = GetDlgItemText(lnghwnd, i, sx, 260) 'daca stilul nu este OFN_EXPLORER If l <> 0 Then Debug.Print i & "--" & sx NextEnd IfEnd Function

       Am presupus ca acesti identificatori sint intre 1 si 10000 ceea ce a fost adevarat. Acesti identificatori nu se schimba (ca HWND-ul). Asa am obtinut valorile constantelor IDC_.        In final fisierul selectat este in d.lpstrFile care este vid daca nu s-a selectat nimic.        Acesta este cel mai simplist mod de a folosi dialogul open subclasificat dar evident se pot face mult mai multe.        La toate aceste schimbari de texte din dialog puteti observa ca desi initial butonul &Deschide atunci litera "D" va fi subliniata si functioneaza in continuare cu ALT+D asemanator cum a functionat cu ALT+O.

2. Save, Save As... - aceste 2 dialoguri arata aproape la fel si au aproape acelasi comportament cu dialogul afisate dialogurile. Singurele diferente constau in functia care trebuie apelata, de aceasta data apelindu-se functia scrie Save nu Open. Insa, la fel trebuie completata o structura (tip) OPENFILENAMEchiar pentru ca este la fel ca la dialogul open.

3. Color - pentru afisarea acestui dialog la fel ca mai sus, se completeaza o structura (tip) ChooseColor. Simplu!        Sa vedem mai intii codul dupa care o sa-l analizam. Punem intr-un modul:

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As LongPrivate Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As String) As Long

Private Const GW_CHILD = 5Private Const GW_HWNDNEXT = 2

Private Const WM_INITDIALOG = &H110Private Const WM_SETICON = &H80Private Const WM_SETTEXT = &HC

Private Const IDC_CANCEL As Long = 2Private Const IDC_ADDCUSTOMCOLORS As Long = 712Private Const IDC_DEFINECUSTOMCOLORS As Long = 719Private Const IDC_RED As Long = 726Private Const IDC_GREEN As Long = 727Private Const IDC_BLUE As Long = 728Private Const IDC_HELP As Long = 1038Private Const IDC_BASICCOLORS As Long = 65535

Public Function fColorCallBack(ByVal lnghwnd As Long, ByVal lngMessage As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long

Page 411: tutoriale vba

Dim l as LongIf lngMessage = WM_INITDIALOG Then SendMessage lnghwnd, WM_SETTEXT, 0&, "Selectie culori..." SendMessage lnghwnd, WM_SETICON, 0&, CLng(frmColor.Icon) SetDlgItemText lnghwnd, IDC_CANCEL, "Renunta" SetDlgItemText lnghwnd, IDC_DEFINECUSTOMCOLORS, "&Defineste culori utilizator" SetDlgItemText lnghwnd, IDC_ADDCUSTOMCOLORS, "&Adauga culori utilizator" SetDlgItemText lnghwnd, IDC_RED, "&Rosu" SetDlgItemText lnghwnd, IDC_GREEN, "&Verde" SetDlgItemText lnghwnd, IDC_BLUE, "Albastr&u" SetDlgItemText lnghwnd, IDC_HELP, "A&jutor" SetDlgItemText lnghwnd, IDC_BASICCOLORS, "Culori de &baza" l = GetWindow(lnghwnd, GW_CHILD) l = GetWindow(l, GW_HWNDNEXT) l = GetWindow(l, GW_HWNDNEXT) SendMessage l, WM_SETTEXT, 0&, "&Culori utilizator"End IfEnd Function

iar la forma cu un buton (command1) scriem: Private Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" _ (pChoosecolor As ChooseColor) As LongPrivate Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _ ByVal dwBytes As Long) As LongPrivate Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As LongPrivate Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As LongPrivate Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) Private Const GMEM_MOVEABLE = &H2Private Const GMEM_ZEROINIT = &H40Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)

Private Const CC_ENABLEHOOK = &H10

Private Type ChooseColor lStructSize As Long hwndowner As Long hInstance As Long rgbResult As Long lpCustColors As Long FLAGS As Long lCustData As Long lpfnHook As Long lpTemplateName As LongEnd Type

Dim c As ChooseColorDim alCustomColors(15) As Long '16 elemente de la 0 la 15

Private Sub Command1_Click()Dim l as LongDim lCustomColorSize As LongDim lCustomColorAddress As LongDim lMemHandle As Long

c.lStructSize = Len(c)c.hwndowner = hwnd

lCustomColorSize = Len(alCustomColors(0)) * 16lMemHandle = GlobalAlloc(GHND, lCustomColorSize)

Page 412: tutoriale vba

If lMemHandle = 0 Then Exit SubEnd If

lCustomColorAddress = GlobalLock(lMemHandle)If lCustomColorAddress = 0 Then Exit SubEnd If

Call CopyMemory(ByVal lCustomColorAddress, alCustomColors(0), lCustomColorSize) c.lpCustColors = lCustomColorAddressc.FLAGS = CC_ENABLEHOOKc.lpfnHook = pAddressOf(AddressOf fColorCallBack)l = ChooseColor(c) if l<>0 then 'daca s-a selectat 'Cancel' sau nu a fost selectata o culoare atunci l=0

Call CopyMemory(alCustomColors(0), ByVal lCustomColorAddress, lCustomColorSize)BackColor = c.rgbResult

End IfEnd Sub

       Ceea ce difera la acest dialog fata de precedentele este faptul ca unul din elementele tipului in care vor fi returnate culorile utilizator alese, altele decit cele de baza. Dupa cum stiti Visual Basic-ul nu are pointeri asa ca trebuie sa apelam la subterfugii. Acestea sint functiile API GlobalAlloc, GlobalLock, GlobalFree si CopyMemorypointerii. Codul programului cred ca este destul de lamuritor privind utilizarea acestor functii.        Pentru a activa subclasificarea dialogului in membrul FLAGS al structurii CHOOSECOLOR trebuie sa punem valoarea        Dupa apelul functiei ChooseColor copiem valorile culorilor definite de utilizator inapoi in sirul viitoare cind va fi afisat dialogul.        La acest dialog (ca si la urmatorul font) structura (tipul) cu care se apeleaza functia API corespunzatoare nu are nici un membru pentru a modifica numele dialogului. Pentru a modifica numele dialogului se apeleaza SendMessage cu mesajul wParam nul (0&) si lParam avind noul nume al dialogului.        In final, rezultatul alegerii dvs. se regaseste in rgbColor.

4. Font - acest dialog este foarte asemanator cu dialogul color si asa cum banuiti se apeleaza pentru afisarea lui functia API Windows structura de tip CHOOSEFONT. Sa vedem mai intii codul din modul:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ ByVal lParam As Any) As LongPrivate Declare Function SetDlgItemText Lib "user32" Alias "SetDlgItemTextA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As String) As Long

Private Const WM_INITDIALOG = &H110Private Const WM_SETTEXT = &HCPrivate Const WM_SETICON = &H80

Private Const IDC_OK As Long = 1Private Const IDC_CANCEL As Long = 2Private Const IDC_HELP As Long = 1038Private Const IDC_APPLY As Long = 1026Private Const IDC_STRIKEOUT As Long = 1040Private Const IDC_UNDERLINE As Long = 1041Private Const IDC_EFFECTS As Long = 1072Private Const IDC_SAMPLE As Long = 1073Private Const IDC_FONT As Long = 1088Private Const IDC_FONTSTYLE As Long = 1089Private Const IDC_SIZE As Long = 1090Private Const IDC_COLOR As Long = 1091

Page 413: tutoriale vba

Public Function pAddressOf(ByVal procaddr As Long) As Long pAddressOf = procaddrEnd Function

Public Function fFontCallBack(ByVal lnghwnd As Long, ByVal lngMessage As Long, _ ByVal wParam As Long, ByVal lParam As Long) As LongDim l As LongIf lngMessage = WM_INITDIALOG Then SendMessage lnghwnd, WM_SETTEXT, 0&, "Selectie fonturi" SendMessage lnghwnd, WM_SETICON, 0&, CLng(Form2.Icon) SetDlgItemText lnghwnd, IDC_CANCEL, "Renunta" SetDlgItemText lnghwnd, IDC_STRIKEOUT, "&Taiat" SetDlgItemText lnghwnd, IDC_UNDERLINE, "S&ubliniat" SetDlgItemText lnghwnd, IDC_EFFECTS, "Efecte" SetDlgItemText lnghwnd, IDC_FONTSTYLE, "&Stilul fontului" SetDlgItemText lnghwnd, IDC_SIZE, "&Marime" SetDlgItemText lnghwnd, IDC_SAMPLE, "Exemplu"End IfEnd Function

iar intr-o forma cu un buton (command1) si un text-box (text1) scriem: Private Declare Function CHOOSEFONT Lib "comdlg32.dll" Alias "ChooseFontA" _ (pChoosefont As CHOOSEFONT) As Long

Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _ ByVal dwBytes As Long) As LongPrivate Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As LongPrivate Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As LongPrivate Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long) Private Declare Function GetDeviceCaps& Lib "gdi32" (ByVal hdc&, ByVal nIndex&)

'constants for API memory functionsPrivate Const GMEM_MOVEABLE = &H2Private Const GMEM_ZEROINIT = &H40Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)

Private Const cdlCFBoth = &H3&Private Const cdlCFScreenFonts = &H1&Private Const cdlCFTTOnly = &H40000Private Const cdlCFEnableHook = &H8&

Private Const LF_FACESIZE = 32Private Const FW_BOLD = 700

Private Type LOGFONT lfHeight As Long lfWidth As Long lfEscapement As Long lfOrientation As Long lfWeight As Long lfItalic As Byte lfUnderline As Byte lfStrikeOut As Byte lfCharSet As Byte lfOutPrecision As Byte lfClipPrecision As Byte lfQuality As Byte

Page 414: tutoriale vba

lfPitchAndFamily As Byte 'lfFaceName(LF_FACESIZE) As Byte lfFaceName As String * LF_FACESIZEEnd Type

Private Type CHOOSEFONT lStructSize As Long hwndowner As Long hdc As Long lpLogFont As Long iPointSize As Long FLAGS As Long rgbColors As Long lCustData As Long lpfnHook As Long lpTemplateName As String hInstance As Long lpszStyle As String nFontType As Integer MISSING_ALIGNMENT As Integer nSizeMin As Long nSizeMax As LongEnd Type

Private Sub Command1_Click()Dim df As CHOOSEFONTDim f As LOGFONTDim l As LongDim lLogFontSize As LongDim lMemHandle As LongDim lLogFontAddress As Longf.lfHeight = Text1.Font.Size / (72 / GetDeviceCaps(hdc, 90)) * -1f.lfFaceName = Text1.FontName & Chr(0)f.lfItalic = IIf(Text1.FontItalic, 1, 0)f.lfUnderline = IIf(Text1.FontUnderline, 1, 0)f.lfStrikeOut = IIf(Text1.FontStrikethru, 1, 0)f.lfWeight = IIf(Text1.FontBold, FW_BOLD, 0)lLogFontSize = Len(f)lMemHandle = GlobalAlloc(GHND, lLogFontSize)If lMemHandle = 0 Then Exit SubEnd IflLogFontAddress = GlobalLock(lMemHandle)If lLogFontAddress = 0 Then Exit SubEnd IfCall CopyMemory(ByVal lLogFontAddress, f, lLogFontSize)df.rgbColors = Text1.ForeColordf.lpLogFont = lLogFontAddressdf.FLAGS = cdlCFScreenFonts Or &H100& Or &H40& Or cdlCFEnableHook 'Or cdlCFTTOnlydf.lpfnHook = pAddressOf(AddressOf fFontCallBack)df.lStructSize = Len(df)df.hwndowner = hwndl = CHOOSEFONT(df)If l <> 0 Then Call CopyMemory(f, ByVal lLogFontAddress, lLogFontSize) Text1.FontName = f.lfFaceName Text1.FontSize = CLng(df.iPointSize / 10) Text1.FontBold = (f.lfWeight >= FW_BOLD) Text1.FontItalic = (f.lfItalic = 1)

Page 415: tutoriale vba

Text1.FontStrikethru = (f.lfStrikeOut = 1) Text1.FontUnderline = (f.lfUnderline = 1) Text1.ForeColor = df.rgbColorsEnd IfEnd Sub

       Si la acest dialog se folosesc pointerii pt. ca unul din elemetele structurii CHOOSEFONTnevoie de functiile API GlobalAlloc, GlobalLock, GlobalFree si CopyMemory. Mai intii completam structura (tipul) LOGFONT cu datele fontului selectat la aparitia dialogului iar apoi completam elemetele structurii CHOOSEFONT.        De asemenea, pentru a activa subclasificarea dialogului in membrul FLAGS al structurii CHOOSEFONT trebuie sa punem valoarea CF_ENABLEHOOK (cdlCFEnableHook). In acelasi loc se poate specifica si alte setari, de ex. daca sa afiseze sau nu toate fonturile sau doar cele TTF (cdlCFTTOnly).        Dupa apelul functiei ChooseFont valorile selectate sint copiate inapoi in structura (tipul) LOGFONT de unde sint folosite. Unele valori selectate se gasesc la structura CHOOSEFONT nu la LOGFONT.

5. Print, Print Setup - pentru a utiliza aceste dialoguri folosind functiile API PrintDlgacest exemplu nu subclasifica dialogul. Toate incercarile mele de a subclasifica acest dialog au fost nereusite asa ca nu-mi ramine decit sa va rog sa-mi trimite-ti si mie un exemplu de subclasificare al acestui dialog (tratind mesajul WM_INITDIALOG) daca a-ti reusit dvs. Multumesc in avans.

6. Help - desi la CommonDialog este metoda ShowHelp cu ajutorul caruia se poate afisa un fisier de help (*.hlp), acesta nu este de fapt un dialog propriu-zis si nu avem de ce sa-l subclasificam pentru a schimba caption-ul controalelor pentru ca nu are controale. Acelasi lucru se poate face si apelind functia API WinHelp fara utilizarea controlului dialog (si fara comdlg32.ocx) ca mai jos (nu avem nevoie de nici un modul):

Private Declare Function WinHelp Lib "user32" Alias "WinHelpA" (ByVal hwnd As Long, _ ByVal lpHelpFile As String, ByVal wCommand As Long, ByVal dwData As Long) As Long

Private Const HELP_COMMAND = &H102&Private Const HELP_CONTENTS = &H3&Private Const HELP_CONTEXT = &H1 ' Display topic in ulTopicPrivate Const HELP_CONTEXTPOPUP = &H8&Private Const HELP_FORCEFILE = &H9&Private Const HELP_HELPONHELP = &H4 ' Display help on using helpPrivate Const HELP_INDEX = &H3 ' Display indexPrivate Const HELP_KEY = &H101 ' Display topic for keyword in offabDataPrivate Const HELP_MULTIKEY = &H201&Private Const HELP_PARTIALKEY = &H105&Private Const HELP_QUIT = &H2 ' Terminate helpPrivate Const HELP_SETCONTENTS = &H5&Private Const HELP_SETINDEX = &H5 ' Set current Index for multi index helpPrivate Const HELP_SETWINPOS = &H203&

Private Sub Command1_Click()WinHelp hwnd, "c:\cale\help.hlp", HELP_CONTENTS, 0&End Sub

       Acelasi lucru se obtinea punind un CommonDialog pe o forma si scriind: Private Sub Command1_Click()CommonDialog1.HelpFile = "c:\cale\help.hlp"CommonDialog1.HelpCommand = cdlHelpContentsCommonDialog1.ShowHelpEnd Sub

 

ai multe fișiere sursă. Un fișier sursă prevede definirea și implementarea de clase, structuri, module si interfete, care conțin în cele din urmă tot codul.

Page 416: tutoriale vba

Elemente de programare la nivel de fișier

Când începe un proiect sau fișier și deschideți editorul de cod, veți vedea un cod deja în vigoare și, în ordinea corectă. Orice cod care scrie ar trebui să urmeze următoarea secvență:

1. Declarații Opțiunea 2. Declarații Importuri

3. Declarațiile de spațiu de nume și elemente de spațiu de nume la nivel

Dacă introduceți declarații într-o ordine diferită, erori de compilare poate avea ca rezultat.

Un program poate conține, de asemenea, declarații compilare condiționată. Puteți amesteca acestea, în fișierul sursă, printre declarațiile secvența precedent.

Declarații Opțiunea

Declarații Opțiunea să stabilească reguli de bază de cod ulterioare, ajutând la prevenirea sintaxa și erori logice. Declarație explicită Opțiunea (Visual Basic) se asigură că toate variabilele sunt declarate și scrise corect, ceea ce reduce timpul de depanare. Declarația strictă Opțiunea ajută pentru a minimiza erorile de logică și pierderea de date care poate apărea atunci când lucrați între variabile de diferite tipuri de date. Opțiunea Compara Declaratie specifică modul în care siruri de caractere sunt comparate între ele, fie pe baza binare sau valori text.

Importuri Declarații

Puteți include o declarație Importurile de a importa nume definite în afara proiectului. O declarație Importurile permite codul de clase și alte tipuri definite în spațiul de nume importate, fără a le califica. Puteți folosi cât mai multe declarații Import, după caz. Pentru mai multe informații, consultați Referințe și declarația Importuri .

Declarații de spațiu de nume

Spații de nume ajuta să vă organizați și clasifica elementele de programare pentru ușurința de grupare și accesarea. Puteți utiliza Declarația Spațiul să clasifice următoarele afirmații într-un anumit spațiu de nume. Pentru mai multe informații, consultați Spații de nume în Visual Basic .

Declarații compilare condiționată

Declarații compilare condiționată pot apărea aproape oriunde în fișierul sursă. Acestea provoacă părți de cod pentru a fi incluse sau excluse în momentul compilării, în funcție de anumite condiții. Puteți, de asemenea, să le utilizeze pentru depanarea cererea dumneavoastră, deoarece codul condiționată rulează în modul depanare numai. Pentru mai multe informații, consultați condiționată elaborare generală .

Elemente de programare spațiu de nume-Level

Page 417: tutoriale vba

Clase, structuri, și module conțin toate codul în fișierul sursă. Acestea sunt elemente de spațiu de nume de nivel, care pot apărea într-un spațiu de nume sau la nivel fișierul sursă. Ei susțin declarațiile de toate celelalte elemente de programare. Interfețe, care definesc semnături de elemente, dar nu oferă implementare, apar, de asemenea, la nivel de modul. Pentru mai multe informații cu privire la elementele la nivel de modul, consultați următoarele:

Declarație de clasă (Visual Basic) Declarația structura

Declarația Modulul

Declarație de interfață (Visual Basic)

Elementele de date la nivel de spațiu de nume sunt enumerările și delegați.

Elemente de programare la nivel de modul

Proceduri, operatori, proprietăți, și evenimente sunt singurele elemente de programare, care poate stoca cod executabil (declarații care efectuează acțiuni de la momentul execuției). Acestea sunt elemente la nivel de modul de program. Pentru mai multe informații cu privire la elementele de procedura de nivel, consultați următoarele:

Declarația funcție (Visual Basic) Declarația Sub (Visual Basic)

Declara Declarație

Declarația operatorul

Declarație de proprietate

Declarația eveniment

Elementele de date la nivel de modul sunt variabile, constante, enumerările, și delegați.

Elemente de programare procedura de nivel

Cele mai multe dintre conținutul de elemente procedurii de nivel sunt declaratii executabile, care constituie codul de run-time a programului. Toate cod executabil trebuie să fie într-o procedură (Function, sub, Operator, te, Set, AddHandler, RemoveHandler, RaiseEvent). Pentru mai multe informații, consultați instrucțiunile executabile .

Elementele de date la nivel de proceduri sunt limitate la variabile locale și constante.

Procedura principală

Procedura principală este primul cod pentru a rula atunci când cererea a fost încărcat principal servește ca punct de plecare și de control general pentru aplicația dumneavoastră.. Există patru tipuri de principal:

Page 418: tutoriale vba

Sub Main () Sub Main (ByVal cmdArgs () Ca String)

Funcția principală () ca integer

Funcția principală (ByVal cmdArgs () Ca String) ca integer

Cea mai frecventă varietate a acestei proceduri este Sub Main (). Pentru mai multe informații, consultați Procedura principal în Visual Basic .

A se vedea de asemenea

Concepte

Visual Basic Versiunea de Hello, World Procedura principal în Visual Basic Visual Basic Convențiile de denumire Limitări Visual Basic

Opțiunea declarație explicită (Visual Basic) Visual Studio 2005 Alte versiuni

51 din 79 evaluat acest ajutor - Voteaza acest subiect

Forțează declarație explicită a tuturor variabilelor într-un fișier.

Opțiunea explicită {On | Off}

Piese de schimb

Pe

Opțional. Foloseste optiunea verificarea explicită. Dacă On sau Off nu este specificat, implicit este On.

De pe

Opțional. Dezactivează opțiunea de verificare explicită.

Observații

Dacă este utilizat, declarație explicită opțiune trebuie să apară într-un fișier înainte de orice alte declarații de cod sursă.

Page 419: tutoriale vba

Când Opțiunea explicită apare într-un fișier, trebuie să declare în mod explicit toate variabilele folosind declarațiile Dim sau ReDim. Dacă încercați să utilizați un nume de variabilă nedeclarate, apare o eroare în timpul compilării.

Utilizați opțiunea explicită a evita tastarea incorect numele unei variabile existente sau pentru a evita confuzia în cod în cazul în care domeniul de aplicare al variabilei nu este clar. Dacă nu folosiți declarație explicită opțiune, toate variabilele nedeclarate sunt de tip obiect.

Nota Implicit compilator este o opțiune explicită, dacă nu se specifică Opțiunea explicită în codul.

Puteți seta, de asemenea, opțiunea explicită în mediul Visual Studio integrat de dezvoltare (IDE), sau pe o linie de comandă.

Pentru a seta opțiunea explicită în mediul de dezvoltare integrat (IDE)

1. În meniul Instrumente, selectați Opțiuni. 2. Deschide proiecte și nod Solutions.

3. Alegeți Defaults VB.

4. Modifica setarea explicită Option.

Pentru a seta opțiunea explicită cu privire la linia de comandă

Includeți / optionexplicit opțiunea compilator în comanda VBC.

Exemplu

Următorul exemplu utilizează declarație explicită Opțiunea de a forța declarație explicită a tuturor variabilelor. Încercarea de a folosi o variabilă nedeclarate produce o eroare în timpul compilării.

VB "Forța declarație variabilă explicită. Opțiunea explicite privind

VB ThisVar Dim Ca Integer thisVar = 10 "Următoarea misiune produce o eroare de compilare, deoarece "Variabila nu este declarată și opțiunea explicită este On. thisInt = 10 'face EROARE

A se vedea de asemenea

Trimitere

Page 420: tutoriale vba

Declarația Dim (Visual Basic) ReDim Declarație (Visual Basic) Opțiunea Compara Declaratie Opțiunea Declarație Strict / Optioncompare / Optionexplicit / Optionstrict Implicite Visual Basic, Proiecte, Opțiuni caseta de dialog

Intrări comunitare

ADD

Opțiunea Declarație Strict Visual Studio 2005 Alte versiuni

23 din 37 evaluat acest ajutor - Voteaza acest subiect

Restricționează implicite conversiile de tipuri de date la conversii doar lărgirea.

Opțiunea strictă {On | Off}

Piese de schimb

Pe

Opțional. Foloseste optiunea verificarea strictă.

De pe

Opțional. Dezactivează Opțiunea verificarea strictă. Dacă On sau Off nu este specificat, implicit este Off.

Observații

Dacă este utilizat, declarația Strict opțiune trebuie să apară într-un fișier înainte de orice alte declarații de cod sursă.

Visual Basic permite conversia de mai multe tipuri de date la alte tipuri de date. Pierderea de date pot apărea atunci când valoarea de un tip de date este convertit la un tip de date cu mai puțin de precizie sau de capacitate mai mică. O eroare de run-time apare în cazul în care o astfel de conversie prin trunchiere nu Option Strict asigură notificare de compilare a acestor conversii ingustarea astfel încât să poată fi evitate..

Page 421: tutoriale vba

În plus față de refuzare conversii implicite ingustarea, Option Strict generează o eroare pentru sfârșitul obligatoriu. Un obiect este târziu legat atunci când este atribuit unei variabile care este declarat a fi de tip obiect.

Deoarece Opțiunea stricte cu privire asigură tastarea puternic, previne conversii de tip nedorite cu pierderea de date, nu permite tarziu obligatorii, şi îmbunătăţeşte performanţele, utilizarea sa este foarte recomandat.

Nota Implicit compilator este opțiunea Off strictă, dacă nu se specifică Opțiunea stricte în codul.

Puteți seta, de asemenea, opțiunea strictă în mediul Visual Studio integrat de dezvoltare (IDE), sau pe o linie de comandă.

Pentru a seta opțiunea strictă în mediul de dezvoltare integrat (IDE)

1. În meniul Instrumente, selectați Opțiuni. 2. Deschide proiecte și nod Solutions.

3. Alegeți Defaults VB.

4. Modifica setarea Strict Option.

Pentru a seta opțiunea stricte cu privire la linia de comandă

Includeți / optionstrict opțiunea compilator în comanda VBC.

Exemplu

Următorul exemplu demonstrează modul în care opțiunea nu permite Declarație de stricte târziu caracter obligatoriu și conversii în care datele vor fi pierdute.

VB Opțiunea stricte cu privire la

VB ThisVar Dim Ca Integer ThisObj Dim ca obiect = New widget variabila declarată thisVar = 1000 "nu generează eroare. "Încercarea de a converti Double la Întreg genereaza o eroare de compilare. thisVar = 1234567890.9876542 "Cauzele Eroare "Apel Late-legat generează o eroare de compilare. Call thisObj.Method1 () "Cauzele Eroare

A se vedea de asemenea

Trimitere

Page 422: tutoriale vba

Opțiunea Compara Declaratie Opțiunea declarație explicită (Visual Basic) / Optioncompare / Optionexplicit / Optionstrict Implicite Visual Basic, Proiecte, Opțiuni caseta de dialog

Concepte

Lărgirea și Îngustarea Conversii

Crearea unei macrocomenziAscundere totală

Crearea unei macrocomenzi se face prin utilizarea înregistratorului de macrocomenzi pentru a înregistra o secvență de acțiuni, sau prin introducerea de cod Visual Basic pentru Aplicații în Editor Visual Basic.

Aveți posibilitatea de a utiliza ambele metode. Aveți posibilitatea de a înregistra anumiți pași și de a i îmbunătăți prin cod suplimentar.

Prin înregistrarea pașilor

1. Din meniul Instrumente, poziționați-vă pe Macrocomandă și apoi faceți clic pe Înregistrare macrocomandă nouă.

2. În caseta Nume macrocomandă, tastați un nume pentru macrocomandă.

3. În caseta Memorare macrocomandă în, faceți clic pe șablonul sau pe documentul în care doriți să memorați macrocomanda.

4. În caseta Descriere, tastați descrierea macrocomenzii.

5. Dacă nu doriți să asociați macrocomanda unei bare de instrumente, unui meniu sau unor taste de comenzi rapide, faceți clic pe OK pentru a începe înregistrarea macrocomenzii.

Pentru a asocia macrocomanda unei bare de instrumente sau unui meniu, faceți clic pe Bare de instrumente, apoi faceți clic pe fila Comenzi. În caseta Comenzi, faceți clic pe macrocomanda pe care o înregistrați și glisați-o pe bara de instrumente, sau pe meniul cu care doriți să o asociați. Faceți clic pe Închidere pentru a începe înregistrarea macrocomenzii.

Pentru a asocia macrocomanda unei taste de comenzi rapide, faceți clic pe Tastatură. În caseta Comenzi, faceți clic pe macrocomanda pe care o înregistrați. În caseta Se apasă noua tastă de comenzi rapide, tastați secvența de taste apoi faceți clic pe Asociere. Faceți clic pe Închidere pentru a începe înregistrarea macrocomenzii.

6. Realizați acțiunile pe care doriți să le includeți în macrocomandă.

Când înregistrați o macrocomandă, utilizați mausul pentru a face clic pe comenzi și opțiuni, dar nu pentru a selecta text. Trebuie să utilizați tastatura pentru a înregistra aceste acțiuni. De

Page 423: tutoriale vba

exemplu, utilizați F8 pentru a selecta text și apăsați END pentru a muta cursorul la sfârșitul liniei.

7. Pentru a întrerupe înregistrarea macrocomenzii, faceți clic pe Oprire înregistrare .

Utilizând Visual Basic pentru Aplicații

1. Din meniul Instrumente, selectați Macrocomandă și apoi faceți clic pe Macrocomenzi.

2. În lista Macrocomenzi în, faceți clic pe șablonul sau pe documentul în care doriți să memorați macrocomanda.

3. În caseta Nume macrocomandă, tastați un nume pentru macrocomandă.

4. Faceți clic pe Creare pentru a deschide editorul Visual Basic.

 Notă   Dacă dați unei macrocomenzi noi același nume cu o comandă predefinită din Microsoft Word, noua acțiune a macrocomenzii va înlocui acțiunile existente. Pentru a vizualiza o listă a macrocomenzilor predefinite din Word, selectați Macrocomandă din meniul Instrumente și apoi faceți clic pe Macrocomenzi. În lista Macrocomenzi în, faceți clic pe Comenzi Word.

Mecanisme de transfer a argumentelor unei proceduri in VB.NET

No comments -

O procedura [...] este invocata, apelata, intr-un context dat. Procedura executa secventa de cod sursa in mod repetat, utilizand date diferite la fiecare invocare a sa. Datele utilizate sunt reprezentate de variabile [...], constante si expresii transferate in procedura.Parametrul reprezinta o valoare pe care procedura o asteapta la momentul invocarii. Definirea unei proceduri presupune si eventuala definire a listei de parametri.Argumentul reprezinta valoarea furnizata parametrului procedurii la momentul invocarii acesteia. Argumentele reprezinta elemente cu valori diferite pentru invocari diferite ale procedurii.

Transferul argumentelor unei proceduri VB.NET se realizeaza prin doua mecanisme:

prin valoare; prin referinta.

Prin mecanismul de transfer, se stabileste daca procedura modifica elementul reprezentat de argumentul transferat procedurii. Definirea listei de parametri stabileste mecanismul de transfer al argumentelor la momentul invocarii procedurii. Astfel, transferul prin valoare presupune declararea parametrului cu specificatia ByVal, iar transferul prin referinta consta in definirea parametrului cu ByRef.La transferul unui argument intr-o procedura, trebuie sa aiba in vedere urmatoarele aspecte:

Page 424: tutoriale vba

elementul reprezentat de argumentul transferat poate fi sau nu modificat; argumentul insusi este sau nu modificat;

argumentul este transferat prin valoare sau referinta;

tipul de date al argumentului este un tip valoare sau tip referinta.

Criterii de selectie a mecanismului de transfer a argumentelor unei proceduri:

protectie: se considera expunerea la schimbare a variabilei de apel; transferul prin referinta ByRef consta in returnarea unei valori catre codul apelator prin argument; avantajul transferului ByVal consta in protectia variabilei transferate la modificarile din secventa executabila a procedurii;

performanta: transferul prin valoare presupune copierea argumentului; astfel, pentru valori mari ale datelor transferate este mai eficient mecanismul de transfer prin referinta.

Situatii de utilizare a argumentelor transferate prin valoare:

elementul de programare transferat catre procedura nu este modificabil; elementul transferat este modificabil, dar procedura nu trebuie sa modifice valoarea

acestuia; doar codul apelator poate schimba valoarea elementului transferat.

Situatii de utilizare a argumentelor transferate prin referinta:

procedura necesita modificarea elementului reprezentat de argument; executia corecta a aplicatiei depinde de valorile modificate de procedurile invocate.

Cele doua proceduri incluse in aplicatia Console Application de mai jos exemplifica mecanismele de transfer prin valoare si referinta a argumentelor unei proceduri.

Module Module1    Function SumaFct(ByVal x As Integer, ByVal y As Integer) As Long        Dim z As Long        z = x + y        Return z    End Function    Sub SumaProc(ByVal x As Integer, ByVal y As Integer, ByRef z As Long)        z = x + y    End Sub

    Sub Main()        Dim c As Long        c = SumaFct(10, 11)        MsgBox("c = " & c)        MsgBox("Suma este: " & SumaFct(12, 13))        SumaProc(14, 15, c)        MsgBox("Noul c = " & c)    End SubEnd Module

Cele doua mecanisme de transfer coexista in aceeasi procedura.In cazul procedurii Function, se observa ca cei doi parametri sunt transferati prin valoare. Rezultatul prelucrarilor este transferat inapoi in codul apelator cu ajutorul specificatiei

Page 425: tutoriale vba

Return, intrucat variabila locala nu mai exista la revenirea in codul apelator. Valoarea acesteia este salvata intr-o noua locatie sau este utilizata direct in alte expresii de calcul.In cazul procedurii Sub, lista parametrilor este suplimentat cu unul transferat prin referinta. La invocare, acesta este reprezentat de un argument de tip variabila care va surprinde modificarea efectuata in cadrul procedurii. Astfel, rezultatul prelucrarilor este referit direct prin denumirea variabilei c.

Definirea procedurilor de tip proprietate in VB.NET

1 comment -

In VB.NET, procedura proprietate reprezinta secventa de cod sursa de manipulare a unei caracteristici intr-un modul [...], clasa de obiecte [...] sau structura [...].VB.NET pune la dispozitie urmatoarele proceduri de tip proprietate:

Get: returneaza valoarea caracteristicii; caracteristica este accesata printr-o expresie; Set: stabileste valoarea caracteristicii, incluzand referinta de obiect; este invocata

pentru atribuirea unei valori pentru o proprietate.

Proprietatile sunt definite in perechi de proceduri Get si Set, dar nu obligatoriu. Pot exista definite doar proprietati Get sau proprietati Set.Implicit, proprietatile au asociat modificatorul de acces Public [...], ceea ce inseamna ca pot fi apelate din orice punct al aplicatiei. Mecanismul de transfer al parametrilor este cel prin valoare implementat prin specificatia ByVal.Implementarea proprietatilor se realizeaza prin specificatiile Property si End Property. Get si Set se definesc in mod similar procedurilor [...].

Dim a As IntegerProperty aProp()    Get        Return a    End Get

    Set(ByVal value)        If value < 0 Then            a = 0        Else            a = value        End If    End SetEnd Property

Exemplul de mai sus creeaza o proprietate read/write. Proprietatea Get extrage valoarea variabilei a, iar proprietatea Set asociaza variabilei a o valoarea stocata de parametrul value, in functie de valoarea acestui parametru.O proprietate este invocata atunci cand denumirea acesteia apare intr-o expresie, in mod similar utilizarii unei variabile. De exemplu, procedura Get este invocata astfel:

...a = 10Dim x As Integerx = aPropMsgBox("x=" & x)

Page 426: tutoriale vba

...

Se observa ca viaribila a este referita direct prin atribuirea:

a = 10

Valoarea lui a poate fi schimbata si prin intermediul urmatoarei secvente de cod sursa:

...x = x + 13aProp = xMsgBox("a=" & aProp)MsgBox("a=" & a)...

Efectul executiei codului sursa de mai sus consta in modificarea valorii variabilei a prin invocarea implicita a proprietatii Set. Cele doua apeluri ale MsgBox au acelasi efect, respectiv afisarea noii valori a variabilei a prin invocarea proprietatii Get, respectiv prin referirea directa a variabilei a.

Solutions and tutorials for IT&C development

Home Posts list

About

« JavaScript InjectionHow to: Create a Table Object in a Database Microsoft Access 2003 »

Definirea modulelor in VB.NET

7 comments -

Un modul reprezinta unul dintre elementele de programare care contin cod sursa ce urmeaza a fi compilat si executat. Un element similar de programare este clasa de obiecte [...]. Spre deosebire de modul, clasa de obiecte poate fi adaptata cerintelor particulare ale dezvoltatorilor prin implementarea mostenirii.Modulul este implementat cu ajutorul specificatiilor Module si End Module.

Module Module1    Structure Persoana        Dim CNP As String        Dim Nume As String        Dim Adresa As String    End Structure

    Sub Main()        Dim p As Persoana        p = New Persoana

Page 427: tutoriale vba

        p.CNP = "1801010433012"        p.Nume = "Popescu Gigel"        p.Adresa = "Bld. Victoriei nr. 13"

        MsgBox(p.Nume & " are domiciliul " & p.Adresa)    End Sub

End Module

In exemplul anterior, modulul Module1 include procedura Main ce reprezinta punctul de intrare in aplicatie. Mediul Visual Studio include automat un modul cu procedura Main atunci cand se creeaza o aplicatie de tip Console Application. De asemenea, modulul include definirea unei structuri denumita Persoana.Compilatorul genereaza eroare in cazul aplicatia Console Application nu gaseste procedura Main definita intr-un modul sau clasa de obiecte.In cazul in care procedura Main este definita in clasa de obiecte si nu intr-un modul, atunci Main se defineste ca metoda Shared, ceea ce inseamna ca respectiva clasa nu trebuie sa fie instantiata.

Solutions and tutorials for IT&C development

Home Posts list

About

« Definirea unui ansamblu in VB.NETSolution for “A potentially dangerous Request.Form value was detected from the client…” »

Definirea procedurilor in VB.NET

2 comments -

Procedura reprezinta un bloc de specificatii VB.NET incluse intr-o declaratie precum: Function, Sub, Operator, Get si Set. Toate specificatiile executabile VB.NET sunt incluse intr-o procedura.

Invocarea unei proceduri este cunoscuta si sub denumirea de apel de procedura si reprezinta momentul lansarii in executie a specificatiilor incluse in respectiva procedura. La sfarsitul executiei codului din procedura, controlul executiei se preda codului in punctul in care procedura a fost invocata.

Predarea controlului catre codul apelator se efectueaza astfel:

specificatia Return: controlul este predat imediat codului apelator; pot exista mai multe specificatii return intr-o procedura;

Page 428: tutoriale vba

specificatia Exit Sub sau Exit Function: predarea imediata a controlului catre codul apelator; pot exista mai multe astfel de specificatii si pot fi combinate cu specificatii de Return;

daca Return sau Exit Sub/Exit Function lipsesc din codul unei proceduri, atunci specificatiile End Sub, End Function, End Get sau End Set inchid executia procedurii, apelul fiind predat imediat catre codul sursa apelator.

O procedura este definita cu zero, unul sau mai multi parametri ce reprezinta valori asteptate a fi transferate in procedura. La invocare, lista de parametri este pusa in corespondenta cu lista de argumente. Argumentul reprezinta valoarea transferata corespunzator parametrului, la invocarea unei proceduri.

Tipuri de proceduri definite in VB.NET:

Sub: executa actiuni, dar nu returneaza nici o valoarea codului apelator;

'definire procedura SubSub Adun(ByVal x As Integer, ByVal y As Integer, ByRef z As Long)        z = x + yEnd Sub...'invocare procedura SubDim a, b As IntegerDim c As Longa = 11b = 13Adun(a, b, c)MsgBox("Suma este:" & c)...

handler de eveniment [...]: procedura Sub executa la transmiterea mesajului asociat producerii unui eveniment [...];

'definire handler de evenimentPublic Sub OpDiferenta(ByVal a As Integer, ByVal b As Integer)    Dim dif As Integer    dif = a - b    MsgBox("Diferenta este: " & CStr(dif))End Sub

'definirea unui evenimentPublic Event Calcul(ByVal x As Integer, ByVal y As Integer)

'definire procedura de asociere eveniment-handler evenimentPublic Sub SetUpEventHandlerDif(ByVal a As Integer, ByVal b As Integer)    AddHandler Calcul, AddressOf OpDiferentaEnd Sub...'prima invocare a handler-ului de evenimentRaiseEvent Calcul(x, y)'a doua invocare a handler-ului de evenimentRaiseEvent Calcul(x, y)...

Function: executa actiuni si returneaza o valoare catre codul apelator;

'definire procedura FunctionFunction Dif(ByVal x As Integer, ByVal y As Integer) As Long

Page 429: tutoriale vba

        Return x - yEnd Function...'invocare procedura FunctionDim a, b As IntegerDim c As Longa = 11b = 13c = Dif(a, b)MsgBox("Diferenta este:" & c)...

Property: returneaza si asociaza valori proprietatilor obiectelor sau modulelor [...];

'definire clasa de obiecte SirPublic Class Sir    Private s As String

    Public Sub New(ByVal x As String)        s = x    End Sub       Public Property sirChar()        Get            Return s        End Get        Set(ByVal value)            s = value        End Set    End PropertyEnd Class...'invocare procedura PropertyDim obA, obB As SirobA = New Sir("Primul sir.")obB = New Sir("Al doilea sir.")MsgBox(obA.sirChar)obB.sirChar = obA.sirCharMsgBox(obB.sirChar)...

Operator: defineste comportamentul standard al unui operator atunci cand operandul sau operanzii sunt clase de obiecte [...] sau structuri [...] definite de utilizator;

'definire clasa de obiecte SirPublic Class Sir    Public s As String    Public Sub New(ByVal x As String)        s = x    End Sub    Public Shared Operator +(ByVal x As Sir, ByVal y As Sir) As Sir        Dim rez As New Sir("")        rez.s = x.s & y.s        Return rez    End OperatorEnd Class...'invocare procedura OperatorDim obA, obB As SirobA = New Sir("Primul sir.")obB = New Sir("Al doilea sir.")Dim ObRez As Sir

Page 430: tutoriale vba

ObRez = obA + obBMsgBox(ObRez.s)...

generice: definesc unul sau mai multi parametri de tip in plus fata de lista de parametri; la invocare sunt transferate tipuri de date specifice.

'definire procedura genericaPublic Sub Proc(Of t)(ByVal x As t)

End Sub...'invocare procedura genericaProc(15)'Tipul argumentului transferat se determina la momentul executiei...

Avantaje ale structurarii codului in proceduri:

impartirea aplicatiei in componente logice: usurinta de dezvoltare si depanare; reutilizarea procedurilor: mai multe aplicatii pot utiliza aceleasi proceduri cu eventuale

modificari minime ale codului acestora.

Solutions and tutorials for IT&C development

Home Posts list

About

« Definirea interfetelor in VB.NETDefinirea si referirea unei structuri in VB.NET »

Implementarea interfetelor in VB.NET

1 comment - This post in english

Implementarea unei interfete in limbajul VB.NET se realizeaza prin cuvantul rezervat Implements. Interfetele pot fi implementate de catre clase de obiecte [...] si structuri [...]. O clasa de obiecte sau o structura pot implementa una sau mai multe interfete, separate prin operatorul , in VB.NET.Lista de interfete implementate de clasa de obiecte/structura este data prin denumirile asociate acestora la definire [...].

In secventa de cod sursa VB.NET de mai jos, este exemplificata implementarea unei interfete in VB.NET:

Module Module1

Page 431: tutoriale vba

     Interface IOperatii        Event Calcul(ByVal x As Integer, ByVal y As Integer)        Function OpDiferenta(ByVal a As Integer, ByVal b As Integer)_As Integer        Function OpProdus(ByVal a As Integer, ByVal b As Integer) As Long    End Interface     Class COperatiiBin        Implements IOperatii         Public Event CalculOp(ByVal x As Integer, ByVal y As Integer)_Implements IOperatii.Calcul         Public Function Dif(ByVal a As Integer, ByVal b As Integer)_As Integer Implements IOperatii.OpDiferenta            Return a - b        End Function         Public Function Prod(ByVal a As Integer, ByVal b As Integer)_As Long Implements IOperatii.OpProdus            Return a * b        End Function           End Class       Sub Main()        Dim x, y, w As Integer        x = 10        y = 8        Dim z As Long        Dim OCalcul As New COperatiiBin        z = OCalcul.Prod(x, y)        w = OCalcul.Dif(x, y)               MsgBox("Diferenta este: " &amp; w &amp; " Produsul este: " &amp; z)     End Sub End Module

In exemplul de mai sus, se observa urmatoarele:

definirea interfetei IOperatii; declararea implementarii interfetei de catre clasa de obiecte COperatiiBin prin

specificatia Implements IOperatii;

implementarea evenimentului prin CalculOp si a celor doua functii prin metodele Dif, respectiv Prod; se observa ca la declararea acestora trebuie precizat elementul implementat din interfata prin specificatiile Implements IOperatii.Calcul, Implements IOperatii.OpDiferenta si Implements IOperatii.OpProdus;

evenimentul si cele doua metode respecta intocmai prototipurile definite in interfata IOperatii;

clasa de obiecte nu contine alte elemente definite aditional interfetei implementate IOperatii.

Aplicatia contine procedura Main, fiind una de tipul Console Application.

Page 432: tutoriale vba

Solutions and tutorials for IT&C development

Home Posts list

About

« Transmiterea mesajului asociat unui eveniment definit in VB.NETImplementarea interfetelor in VB.NET »

Definirea interfetelor in VB.NET

2 comments - This post in english

Interfata reprezinta o multime de definitii privind  proprietati, metode si evenimente. Spre deosebire de clasele de obiecte [...], interfetele nu contin partea de implementare. Interfetele sunt implementate [...] de catre clasele de obiecte, dar se definesc ca entitati separate de acestea.O clasa de obiecte care implementeaza o interfata trebuie sa implementeze toate elementele definite in acea interfata.

Definirea unei interfete VB.NET se realizeaza cu ajutorul cuvantului rezervat Interface, iar implementarea interfetei cu ajutorul cuvantului rezervat Implements.La definirea unei interfete se pot prelua specificatii definite in alte interfete. Mostenirea elementelor definite in alte componente se implementeaza in limbajul VB.NET cu specificatia Inherits.Intr-un namespace [...], interfetele au asociat implicit modificatorul de acces Friend [...], iar cele definite in clase de obiecte, module, interfete si structuri au asociat implicit modificatorul de acces Public.Interfata reprezinta un instrument puternic de programare, intrucat separa definitia obiectelor de partea de implementare. Situatii in care se recomanda definirea de interfete:

clase de obiecte cu nivel de ortogonalitate ridicat: implementare pe scara redusa a mostenirii la definirea claselor de obiecte;

flexibilitate ridicata: o clasa de obiecte poate implementa mai multe interfete;

nu se doreste mostenirea implementarii dintr-o clasa de baza;

nu se poate utiliza mostenirea in cazul claselor de obiecte: structurile [...] nu pot mosteni clase de obiecte, dat pot implementa interfete.

Exemplu de implementare in cod sursa VB.NET a definirii unei interfete:

Interface IOperatii    Event Calcul(ByVal x As Integer, ByVal y As Integer)    Function OpDiferenta(ByVal a As Integer, ByVal b As Integer) As Integer    Function OpProdus(ByVal a As Integer, ByVal b As Integer) As LongEnd Interface

Page 433: tutoriale vba

In exemplul anterior, definirea interfetei IOperatii s-a realizat cu ajutorul cuvantului rezervat Interface si s-a incheiat cu specificatia End Interface.Interfata IOperatii defineste un eveniment denumit Calcul si doua proceduri de tip Function denumite OpDiferenta, respectiv OpProdus.Aplicatia creata cu Visual Studio este de tip Console Application.

Acces, Clasa de obiecte, Cod sursa, Definire, Interfata, Mostenire, Namespace, Procedura, Structura, VB.NET