|
accepta sau returna valori,corespunzator cu setul de instructiuni din
|
səhifə | 3/10 | tarix | 03.11.2017 | ölçüsü | 0,98 Mb. | | #29921 |
| accepta sau returna valori,corespunzator cu setul de instructiuni din
cele doua proceduri Let si Get.
EXEMPLU: deschideti o fereastra si editati urmatorul cod:
Dim Valoare1 As Variant
Property Let Proprietate1(Valoare2 As Variant)
Valoare1 = Valoare2
End Property
Property Get Proprietate1() As Variant
Proprietate1 = Valoare1
End Property
Private Sub Form_Click()
Valoare1 = "Variabila atribuita="
Form1.Print Proprietate1
Proprietate1 = 53,755
Form1.Print Proprietate1
End Sub
Executati fereastra cu Run si apoi efectuati un click de mouse.
In exemplul de mai sus se remarca urmatoarele:
-toate datele sunt de tip Variant,asa ca sunt perfect compatibile si
pot accepta orice fel de valori
-declaratia Property Let are un parametru suplimentar (Valoare 2),
compatibil cu valoarea returnata de Property Get.
-cele doua proceduri sunt inlantuite prin variabila publica Valoare1
-proprietatea astfel definita (Proprietate1) poate accepta valori,
sau poate returna valoarea continuta
-pentru setarea proprietatii se poate utiliza si variabila publica
utilizata pe post de tampon de memorie (Valoare1)
-in exemplul de mai sus,cele doua proceduri nu efectueaza nici un
fel de operatii asupra datelor.In realitate,procedurile obiectelor vor fi
astfel concepute incat sa realizeze fie o selectie,fie o restrictie sau
o conversie a datelor,fie sa efectueze un set oarecare de operatii.Este
posibil sa execute seturi diferite de operatii pentru cele doua proceduri.
-13-
EVENIMENTE (Events) - sunt mesaje emise de catre un obiect,sau un modul,
prin care semnalizeaza faptul ca s-a intamplat ceva.De obicei un astfel
de mesaj este determinat de o actiune oarecare la nivelul obiectului
respectiv : click de mouse,deplasarea indicatorului mouse,apasarea unei
taste,activarea sau dezactivarea obiectului etc.Exista si situatii in
care se poate elibera un astfel de mesaj si ca urmare a unei inactiuni:
de exemplu se utilizeaza un Timer (cronometru) care semnalizeaza perio-
dic faptul ca indicatorul mouse este amplasat deasupra unui anumit obiect.
Pentru obiectele de tip Windows si pentru toate actiunile ce se desfa-
soara in mediul Windows exista un set de mesaje standardizate,al caror
nume incepe cu WM_ (Exemple: WM_ACTIVATE,WM_CLEAR,WM_COMMAND,WM_CREATE,
WM_ENABLE,WM_LBUTTONDBLCLK,WM_LBUTTONDOWN etc.).Puteti gasi intreaga
lista de mesaje Windows in manualul Help al limbajului Pascal cu obiecte.
Pentru ca aceste mesaje sa poata fi exploatate,este necesara o procedura
speciala,prin care sunt citite in permaneta toate mesajele eliberate in
memoria de operare si apoi sunt filtrate sau interpretate.Dupa identifi-
carea unui mesaj,se utilizeaza o alta procedura,denumita procedura pentru
exploatarea mesajului (EventHandler) in care sunt grupate codurile ce
urmeaza sa fie executate la aparitia mesajului.Practic este ca si cand
se utilizeaza o variabila oarecare,pentru a declansa executia unei pro-
ceduri.Daca variabila primeste o anumita valoare,functia este declansata
cu Call.Diferenta consta in faptul ca mediul de operare Windows lucreaza
cu zeci sau sute de astfel de mesaje.Practic,in fiecare secunda,in mediul
Windows sunt active mai multe astfel de mesaje.Pentru a filtra aceste
mesaje,se utilizeaza niste functii speciale,denumite functii delegate
(delegates).Aceste functii utilizeaza un fel special de pointeri,astfel
incat aparitia unui mesaj de semnalizare,determina executia unei anumite
proceduri.Pentru a realiza legatura dintre mesaj si functia de raspuns la
mesaj,se pot utiliza diferite procedee: tabele de adevar,arii de memorie
parametrizate,tabele de tip .dbf,functii de selectie si filtrare etc.
Mesajul de semnalizare,impreuna cu functa de raspuns la mesaj formeaza
impreuna un eveniment.Evenimentele se utilizeaza pentru a organiza modul
de control al executiei.Daca in mediul BASIC,programul era format dintr-o
lista de coduri in care executia se facea secvential,sau cu salturi de la
un nivel la altul,in mediul Visual Basic codurile sunt compartimentate in
module distincte,iar executia programului se deplaseaza de la un modul la
altul,ca urmare a unui eveniment ce a aparut la nivel de obiect sau modul.
Se spune despre programele visuale ca sunt controlate prin evenimente
(event driven).Asadar,notiunea de eveniment este fundamentala pentru inte-
legerea legaturilor dintre diferitele elemente ce compun un program.
Evenimentele sunt comune pentru toate programele si limbajele de pro-
gramare ce opereaza cu obiecte vizuale de tip Windows (Pascal,Delphi,C++,
OWL,Visual Fox,Visual Java etc.),dar conventiile si denumirile specifice
pot fi usor diferite.In limbajul Visual Basic,functia dare exploateaza un
anumit eveniment se denumeste astfel: numele obiectului care a generat
mesajul,urmat de o liniuta de subliniere si de numele evenimentului.
EXEMPLU: Form_Click() este functia declansata de un click de mouse
in interiorul unei ferestre,iar:
Form_DblClick() este functia declansata de un dublu click de
mouse in aceeasi fereastra.Exista un numar oarecare de evenimente standard
pentru fiecare obiect obiect vizual standard.
-14-
Din punct de vedere practic,exista doua metode prin care puteti sa
alegeti evenimentele cu care doriti sa controlati executia programului.
Prima metoda este sa deschideti manualul Help prin Contents,apoi alegeti
Language Reference si Events pentru a identifica lista evenimentelor
grupate alfabetic.Alegeti evenimentul dorit si apoi editati codul in
fereastra de cod.
Cea de a doua metoda,este mult mai simpla si mai practica si apeleaza
direct la fereastra Code.
EXEMPLU: deschideti o fereastra noua (Form1),apoi executati un click
drept de mouse si alegeti View Code.
Fereastra Form1(Code) contine doua casete de dialog.Alegeti pe cea in
care este inclus codul (General) si apasati butonul de derulare.Apoi
alegeti obiectul dorit.In cazul de fata nu figureaza decat obiectul Form.
Alegeti Form.In fereastra de editare se va edita automat codul:
Private Sub Form_Load()
End Sub
adica scheletul procedurii ce urmeaza sa fie executata automat in moment-
ul in care fereastra este creata.Acest eveniment se va executa automat,
ori de cate ori se lanseaza in executie fereastra respectiva.Sa presupu-
nem ca doriti sa modificati dimensiunile cu care se va deschide fereastra.
Introduceti in procedura urmatoarele instructiuni:
Private Sub Form_Load()
Form1.Height = 7500
Form1.Width = 10000
End Sub
Apoi executati fereastra cu Run si Start.Observati ca fereastra va avea
alte dimensiuni decat cele initiale (initial era de 3600/4800).
Pentru a exploata un alt eveniment,deschideti din nou View Code.
Observati ca in prima caseta de dialog figureaza textul "Form" iar in
cea de a doua figureaza textul "Load".Pentru a alege un alt eveniment,
apasati butonul de derulare din cea de a doua caseta de dilaog (cea in
care figureaza "Load") si alegeti Click.
In fereastra de editare se va edita automat procedura:
Private Sub Form_Click()
End Sub
Puteti utiliza aceasta procedura,pentru a codifica operatiile pe care
doriti sa le declanseze efectuarea unui click de mouse in fereastra.De
exemplu,pentru a verifica evenimentul,editati urmatorul text:
Private Sub Form_Click()
Form1.Print "Click de mouse in fereastra"
End Sub
Apoi alegeti in cea de a doua caseta de editare,DblClick si editati pro-
cedura pentru dublul click astfel:
Private Sub Form_DblClick()
MsgBox("Dublu click in fereastra")
End Sub
Apoi executati fereastra cu Run si Start se executati cate un click si
apoi un dublu click in fereastra.Observati ca operatia de dublu click
antreneaza si procedura de click simplu.
-15-
In exemplul de mai sus,cele doua evenimente Click si DblClick inter-
fereaza,deoarece nu se poate executa un dublu click fara a executa un
simplu click.Acest gen de combinatie de evenimente se va utiliza doar
atunci cand procedura declansata de DblClick executa un set suplimentar
de operatii fata de cele executate de un click simplu.In toate celelalte
situatii,se vor alege evenimente cat mai discriminative,astfel incat sa
nu existe nici o interferenta posibila.
De exemplu,pentru a declansa un eveniment prin apasarea unui taste
oarecare,alegeti evenimentul KeyDown si completati procedura:
Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)
MsgBox ("Tasta a fost apasata")
End Sub
Aceasta procedura se va executa indiferent de tasta apasata.Daca doriti
ca procedura sa fie mai selectiva,trebuie sa introduceti una sau mai multe
conditii pentru executie.De exemplu,pentru ca procedura sa returneze un
mesaj doar daca a fost apasata tasta A se va introduce conditia:
Private Sub Form_KeyDown(KeyCode As Integer,Shift As Integer)
If KeyCode = 65 Then
MsgBox ("Tasta A a fost apasata !")
End If
End Sub
In acest caz,procedura nu va returna un mesaj,decat daca se apasa tasta
A.Orice alta tasta nu returneaza nici un mesaj.Pentru lista completa a
tuturor tastelor si a combinatiilor de taste,consultati din Help pagina
Key Code constants.
Nu abuzati de aceasta procedura.Incepatorii au o predilectie bolnavi-
cioasa de a "secretiza" o serie intreaga de actiuni cu ajutorul unor ast-
fel de combinatii de taste.De cele mai multe ori,combinatiile sunt atat
de secrete,incat le uita si autorii lor si pierd accesul la functii impor-
tante din program.Daca este strict necesar sa utilizati astfel de combi-
natii secrete,este bine sa pastrati intr-un loc sigur si o lista clara
a combinatiilor utilizate (peste un an... sau mai multi ani,e posibil sa
aveti nevoie de ele).
Numarul de evenimente standard,pentru fiecare obiect Windows este
destul de mare si acopera necesitatile curente de programare.Observati
lista de evenimente pentru Form.Incercati sa utilizati si singuri un
astfel de eveniment (De exemplu : fereastra sa execute un Beep de averti-
zare in momentul in care este inchisa).
Fiecare obiect are un set propriu de evenimente.De exemplu,pentru a
explora evenimentele unui buton de comanda,alegeti din View optiunea
Toolbox.Se va deschide bara de obiecte vizuale pentru design.Pentru a
adauga un buton in fereastra selectati cu mouse din aceasta bara de
obiecte pe cel care reprezinta un buton (cand amplasati indicatorul mouse
apare textul "CommandButton").Executati un dublu click pe acest buton.
In fereastra Form1,va apare butonul denumit Command1.Selectati cu mouse
butonul,apoi executati un click drept si deschideti View Code:
In fereastra Form1(Code),alegeti in prima caseta de dialog obiectul
Command1 si apoi utilizati cea de a doua caseta de dialog pentru a explo-
ra evenimentele standard conectate la buton.Procedura ce se creaza auto-
mat este procedura Command1_Click().Puteti adauga un text de genul:
MsgBox("Butonul a fost apasat")
-16-
Executati exemplul de mai sus.Observati ca toate procedurile generate
de mouse sunt functionale,in schimb,cele generate de tastatura nu mai
sunt functionale,desi figureaza in fereastra de cod.Acest fapt se dato-
reaza faptului ca butonul Command1 nu poate fi actionat decat prin mouse.
Ca rezultat,aplicatia nu mai asteapta mesaje decat de la mouse (cele
eliberate de tastatura sunt "filtrate").Pentru a reactiva evenimentele
generate de tastatura trebuie sa eliminati butonul din fereastra (selec-
tati butonul,executati un click drept de mouse si apoi alegeti Cut).
Si acest exemplu,ilustreaza faptul ca evenimentele nu pot fi alese
chiar la intimplare.Trebuie sa existe o anumita ordine de prioritati.
Dupa fiecare eveniment nou,este bine sa verificati cu atentie,daca nu
exista nici o interactiune cu celelalte evenimente din program.Uneori
este bine sa desenati pe hartie o schita simpla cu obiectele si modulele
din program si cu spatiul de vizibilitate al fiecarui eveniment sau mesaj.
Exista sute de evenimente standard,majoritatea specializate pentru
fiecare tip de obiect vizual de tip Windows.Toate evenimentele standard
pot fi create automat cu ajutorul ferestrei Code si sunt legate automat
de functia care exploateaza evenimentul,astfel incat nu trebuie decat
sa completati codurile dorite in scheletul de procedura creat automat.
In unele situatii,poate ca doriti sa creati si unele evenimente noi,sau
sa rescrieti unul dintre evenimentele standard.Pentru acest gen de situa-
tii se pot utiliza instructiunile Event si RaiseEvent,la care se va ada-
uga apoi si procedura pentru exploatarea evenimentului.Spre deosebire de
evenimentele standard,aceste evenimente nu pot fi create sau declansate
automat.Dupa declarare,evenimentul trebuie sa fie declansat cu o instruc-
tiune explicita de tip RaiseEvent.
EXEMPLU: atat fereastra cat si butoanele de comanda,au cate un eveniment
de tip Click.Pentru a face diferenta dintre cele trei tipuri de Click,se
poate edita un cod de genul:
1.deschideti o fereastra si adaugati doua butoane de comanda (cu
dublu click in bara de obiecte Toolbox).Apoi deschideti fereastra View
Code si editati urmatorul text:
Event Click(ByVal ButtonNum%)
Private Sub Command1_Click()
RaiseEvent Click(1)
Form1.Print "Buton 1"
End Sub
Private Sub Command2_Click()
RaiseEvent Click(2)
Form1.Print "Buton2"
End Sub
Private Sub Form_Click()
RaiseEvent Click(0)
Form1.Print "fereastra"
End Sub
Lansati cu Run/Start si executati cate un click pe butoane,sau in inte-
riorul ferestrei.Prin acest procedeu,cele trei evenimente Click au fost
grupate intr-un singur eveniment,cu mai multe variante generate de para-
metrul ButtonNum%.
Pe cat posibil,este recomandabil sa utilizati numai evenimentele stan-
dard (cele personalizate acupa memorie,incetinesc executia si depanarea).
-17-
Daca doriti,puteti sa editati si functia dispecer,cea care distribuie
mesajele catre obiectul de destinatie.Daca utilizati mesajele sitemului
Windows,trebuie sa utilizati si functiile Windows pentru prelucrarea si
filtrarea mesajelor.Dintre acestea,cele mai importante sunt: GetMessage,
DispatchMessage,CallWindowProc,PeekMessage,PostMessage,ReplyMessage,Send-
Message,TranslateMessage si WaitMessage si sunt grupate in nucleul de
functii API Windows,in biblioteca Kernel32.dll.Pentru a putea apela aceste
functii,trebuie sa fie declarate extern,impreuna cu fila .Dll sursa.
Prin combinarea acestor functii se poate crea functia responsabila
pentru preluarea,filtrarea si interpretarea mesajelor.De obicei se utili-
zeaza un tampon de memorie de tip stiva,in care mesajele sunt arhivate
in ordinea in care au fost receptionate.Periodic,la interval de cateva
nanosecunde,mesajele din stiva sunt preluate,filtrate si expediate catre
obiectul care asteapta mesajul respectiv.Alternativ,se pot utiliza tipuri
diferite de pointeri,ce apeleaza direct functiile de explotatre a mesaje-
lor (asa numitele functii delegate).Dupa ce mesajele au fost prelucrate,
se apeleaza functia pentru eliberarea tamponului de memorie.Cu cat tampo-
nul de memorie este mai mare si cu cat intervalul dintre doua citiri este
mai mic,cu atat functia de prelucrare a mesajelor este mai performanta.
In cazul aplicatiilor mari,cu multe controale si numeroase operatii per
secunda,numarul de mesaje eliberate este foarte mare.Daca tamponul de
preluare a mesajelor este prea mic,sau intervalul de citire este prea
mare,exista riscul ca unele dintre mesaje sa nu mai poata fi preluate in
tampon,sau sa fie suprascrise,fapt ce poate genera diverse erori de exe-
cutie.Tot la acest nivel,se face si filtrarea mesajelor ce urmeaza sa
determine un raspuns semnificativ (sa apeleze o functie delegat).Pentru
acest scop,se pot utiliza functii de filtrare formate din conditii de
tip IF...Them si Select Case...End Case,sau se pot utiliza tabele de
adevar,selectii de tip SQL,matrice cu solutii preformate,grile de calcul
sau file pentru calcul tabelar,etc.Puteti alege oricare dintre solutii,in
functie de experienta anterioara.
In principiu,mesajele Windows sunt compatibile cu un numar destul de
mare de programe si limbaje de programare.Este posibil sa gasiti diverse
obiecte de tip ActiveX,create special pentru a organiza si gestiona eve-
nimentele Windows.Puteti utiliza aceste obiecte,cu conditia de a testa
compatibilitatea cu mediul Visual Basic.Ori de cate ori un eveniment oare-
care genereaza erori de executie,verificati care este mesajul exploatat si
ce alte functii exploateaza acelasi mesaj.De cele mai multe ori,exista
mai multe obiecte,sau mai multe functii ce raspund simultan la acelasi
mesaj.De obicei,solutia cea mai simpla este sa alegeti un alt eveniment,
astfel incat sa nu existe interactiuni.
Pentru ca un eveniment sa poata fi executat,este necesar ca obiectul
de destinatie sa fie activat si selectat si sa poata prelucra mesajele
din tipul respectiv.
EXEMPLU: butoanele nu pot exploata mesajele transmise de la tastatura,
deoarece nu sunt obiecte destinate pentru editarea datelor.Pentru a uti-
liza evenimentele tastaturii,trebuie ca obiectul ce are "focus", sa fie
un obiect destinat pentru editare (de exemplu o fereastra).
Evenimentele reprezinta o piatra de temelie pentru conceptia si modul
de implementare a oricarui program vizual.Este esential sa intelegeti
toate amanuntele legate de acest concept.
-18-
CONTROLUL FLUXULUI DE EXECUTIE -este modalitatea de organizare a progra-
mului,prin care executia programului sare de la un bloc de date la altul,
in functie de necesitatile de moment.Pentru executia unui program,proce-
sorul principal contine un tampon de memorie,in care preia blocurile de
cod ce urmeaza sa fie executate.Imediat dupa executarea lor,tamponul este
eliberat si preia urmatoarele blocuri de cod.
Pentru a dirija modul in care se executa aceste salturi in program,se
utilizeaza in principal evenimentele generate de actiunile utilizatorului:
apasa un buton,editeaza un text,selecteaza cu mouse un obiect oarecare,etc
Exista si alte modalitati prin care se poate controla fluxul de executie.
Pentru a efectua diverse tipuri de salt,in interiorul unei proceduri sau
a unui modul,se pot utiliza instructiunile: Go Sub...Return,Go To,On Error
On...GoSub,On...Goto.Pentru a executa o iesire fortuita dintr-un program
sau dintr-o procedura,se pot utiliza instructiunile End,Exit si Stop,sau
Functia DoEvents (care intrerupe executia pana cand sistemul de operare
proceseaza toate evenimentele aflate "pe linie de asteptare" in coada
stivei).Pentru a executa diverse tipuri de repetitii,se pot utiliza bucle
de rpetitie de tip: Do...Loop,For...Next,For Each...Next,While...Wend sau
With.Pentru a slecta dintr-un grup de optiuni,se pot utiliza functiile:
Choose si Switch sau instructiunile If...Then...Else si Select Case.Iar
Dostları ilə paylaş: |
|
|