[MS-VBAL]: VBA Language SpecificationMS-VBAL].pdf · [MS-VBAL]: VBA Language Specification ... vba
tutoriale vba
Click here to load reader
-
Upload
tefanius-florian-voica -
Category
Documents
-
view
864 -
download
67
Transcript of 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
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
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;
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;
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
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
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
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
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
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;
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;
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.
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
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.
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)
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.
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
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)
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.
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
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
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.
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.
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).
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]
[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
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.
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)
Ş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.
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
î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]
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
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ă:
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
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
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.
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.
Când faceţi clic pe tab-ul Toolbox, comună Toolbox controale vor apărea.
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:
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
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.
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:
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 .
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
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:
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
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.
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.
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
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
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
(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.
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:
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
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.
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
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
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
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
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
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.
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):
(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:
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)
^ (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
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:
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:
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
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)
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).
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.
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"
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
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.
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
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 #.
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)
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.
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
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( ).
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.
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
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
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)
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
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) <> lni = i + 1Wend
' stergem rindul si mutam rindurile de mai jos in susRows(i).SelectSelection.Delete Shift:=xlUp' renumerotam rindurileWhile Cells(i, column) <> ""Cells(i, column) = lni = i + 1ln = ln + 1
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) <> ""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) <> ""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
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
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.
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
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
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
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
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”
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
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
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.
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.
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
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.
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.
<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.
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')
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:')
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()
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
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)
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
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'
‘ 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.
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:")
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:
Functia trim elimina spatiile dintr-un sir de caractere . Este folosit in cazul variabilelor string.
Exemplu:
Efectul rularii:
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
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.
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
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
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
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
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”
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.
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:
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
Lasa un comentariu
Nume (Obligatoriu)
Mail (nu va fi publicat) (Obligatoriu)
Website
Lasa un comentariu
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 :-):
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.
Î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'].
?- 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).
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:
?- 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ă
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).
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).
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.
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) */
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.
?- 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.
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
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:
?- 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).
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
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 !
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
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
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
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
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.
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
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
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 )
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
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:
Cel mai simplu program constă în afişarea unui mesaj prin comanda msgBox, urmat de textul ce se doreşte a se afişa:
Vom salva fişierul cu un nume sugestiv şi cu extensia VBS:
Î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
reafişarea valorii introduse, vom folosi variabila n pe care o vom utiliza în comanda msgBox.
Scriptul în desfăşurare, în momentul introducerii datelor:
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
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.
Scriptul lansat, la momentul introducerii datelor:
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
text a procedurii formatNumber.
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
Case:
Î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.
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.
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
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
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)
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…
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.
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!
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...
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.
"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
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
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:
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,
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ă.
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.
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)
' 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
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".
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.
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.
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
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
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)
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
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.
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
' 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.
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
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 = _
"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"
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
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:
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 [, …]]
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
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ă.
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.
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")
' 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;
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;
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;
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;
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.
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:
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;
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;
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;
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.
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;
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;
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;
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;
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();
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.
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?
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;
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;
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;
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?
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?
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;
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;
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;
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:
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.
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
» 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
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
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
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;
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
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.
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:
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 »
B. TABELUL “DATE PRIMARE”
C. INTEROGAREA “QUERY1”, LEGATURA INTRE TABELE DE TIPUL “UNUL LA MAI MULTI”
RAPORT1 »
E. COMANDA DE MACRO « MACRO1 »
F. COMANDA DE MACRO « MACRO2 »
G. COMANDA DE MACRO « MACRO3 »
H. FORMULARUL “INTRODUCERE DATE”, PREZENTAT IN DESIGN VIEW, FEREASTRA DE PROPRIETATI A BUTONULEI CU ETICHETA “RAPORT”;
I. FORMULARUL “INTRODUCERE DATE”, PREZENTAT IN PREVIEW – MODUL DE CULEGERE A
J. FORMULARUL “INTRODUCERE CARTI”, PREZENTAT IN PREVIEW – MODUL DE CULEGERE A
K. FORMULARUL “SALI DE LECTURA », PREZENTAT IN PREVIEW – MODUL DE CULEGERE A
L. FORMULARUL « PERMISE », PREZENTAT IN PREVIEW – MODUL DE CULEGERE A DATELOR;
M. DATA ACCESS PAGE PREZENTAT IN MODUL PREVIEW – MODUL DE VIZUALIZARE A DATELOR
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.
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 :
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.
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.
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
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”
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
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
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:
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 :
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
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:
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;
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.
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.
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.
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.
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
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).
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
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.);
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.
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
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
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.
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.
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;
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)
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:
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
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;
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.
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.
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:
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.
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:
- 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.
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.
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
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
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:
[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;
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);
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;
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.
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
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]
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
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 = ''
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
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()
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
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'
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()
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
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
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
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
'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
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
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 _
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>'
End Sub
5) Lista de produse
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
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'
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'
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)
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) = ''
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) = ''
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) = ''
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
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
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
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
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
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
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
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()
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
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
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
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()
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)
'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
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
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
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
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 & '', '' _
& 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
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 = ''
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
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
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
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'
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
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
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
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
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
If Data1.Recordset.RecordCount > 0 Then
MSFlexGrid1.Visible = True
End If
End Sub
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
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
!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
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
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
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
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
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)
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 = ''
'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
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)
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
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
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
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 = '-'
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
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
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
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
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
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
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
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
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
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&)
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
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)))
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
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
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
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)
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
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
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')
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
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
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.
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.
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
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:
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
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
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.
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
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:
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
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.
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
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
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
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
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
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
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
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
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.
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).
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
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
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 " _
&"(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
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
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"
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.
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
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)
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
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
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)
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.
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
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:
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ă.
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
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..
Î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
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
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:
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
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)
...
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
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;
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
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
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
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: " & w & " Produsul este: " & 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.
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
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