Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Cod, sintaxa si comenzi  BindEvent() si ...
 BindEvent() si RaiseEvent()
 
 10/24/2005 7:38:44 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






BindEvent() si RaiseEvent()
 (Romania)

Salutare

De cateva zile ma invart pe langa astea doua de mi s-a pus pata. Nu pricep si pace care-i diferenta. Poate cineva sa-mi explice si mie, in dulcele grai moldovenesc, prin ce se deosebesc astea doua? Ce se poate face cu una si nu se poate face cu cealalta? Un exemplu ar fi nemaipomenit.

In momentul asta eu vad lucrurile asa: Pot sa determin o metoda sa se execute cu ajutorul lui RaiseEvent(), cand vreau io. Da' si bindevent face acelasi lucru. Sa zicem ca vreau ca o metoda de-a mea sa se execute ori de cate ori fac click pe un buton. Pot sa introduc un RaiseEvent in codul din buton. Da' la fel de bine pot sa BindEvent() metoda mea de event-ul Click() al butonului.

Nu mai pricep nimica. Ma lasa nervii frate. Ajutati un suflet pierdut.


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 10/24/2005 7:56:18 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: BindEvent() si RaiseEvent()
 (N/A) Modified By Alex Dobrin  on 10/24/2005 7:57:19 PM)
Eu nu am folosit niciodata RaiseEvent si deci imi dau doar cu presupusul (doar dupa ce am citit help-ul fara sa fac nici o proba :) ). Poate te ajuta. Mi se pare ca diferenta este faptul ca poti folosi RaiseEvent ca sa declansezi un eveniment dintr-o procedura care nu apartine unui obiect, iar Bind event declanseaza un eveniment prin legatura cu un alt eveniment dintr-un obiect.

Alex Dobrin
Algis Info
 10/24/2005 10:53:55 PM
User is offlineanonymous
0 posts


Re: BindEvent() si RaiseEvent()
 (Romania)
Poate nu inteleg eu exact problema, nu le-am folosit niciodata, dar una din ele seteaza un trigger pe un anumit eveniment, in timp ce a doua simuleaza producerea unui eveniment ... Sau ?
Ca poti obtine acelasi behaviour pe mai multe cai, asta n-ar fi prima si sigur nici ultima oara ..
 10/25/2005 6:48:36 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: BindEvent() si RaiseEvent()
 (N/A) Modified By Daniel Buduru  on 10/25/2005 6:50:49 PM)

In momentul asta eu vad lucrurile asa: Pot sa determin o metoda sa se execute cu ajutorul lui RaiseEvent(), cand vreau io. Da' si bindevent face acelasi lucru. Sa zicem ca vreau ca o metoda de-a mea sa se execute ori de cate ori fac click pe un buton. Pot sa introduc un RaiseEvent in codul din buton. Da' la fel de bine pot sa BindEvent() metoda mea de event-ul Click() al butonului.

Cu RAISEEVENT () poti declara un eveniment definit de catre utilizator, in afara celor native ale obiectelor VFP. Apoi, cu BINDEVENT() poti lega acest eveniment la o metoda existenta in acelasi obiect sau intr-un alt obiect. 

Poate exemplul atasat este mai explicit.


Daniel Buduru
 10/25/2005 7:45:44 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: BindEvent() si RaiseEvent()
 (Romania)

Salut, Dan, si multumesc pentru raspuns. M-am uitat in codul atasat, am inteles cum functioneaza (de fapt, stiam cum functioneaza) dar din pacate nu raspunde la intrebarea mea initiala.

Daca inlocuiesc in codul atasat RaiseEvent(This, "Changed") cu un simplu apel al procedurii - This.Changed(), fereastra va continua sa functioneze fara nici o diferenta. BindEvent() se va lega de metoda Changed si ori de cate ori aia va fi apelata de undeva, metoda bind-uita se va executa si ea.

Tocmai asta nu reuseam sa inteleg eu: de ce sa BindEvent() la o metoda, si apoi sa RaiseEvent() acea metoda, cand simpla apelare a ei este suficienta? Ce-are in plus RaiseEvent() fata de simplul apel?

Remarci, sper, faptul ca am folosit timpul trecut. Intre timp m-am lamurit. Diferenta consta, supriza, supriza, din modul in care faci BindEvent. Mai exact, din parametrii aia suplimentari, numiti in help "flags". Ei bine, daca flags lipseste (adica e 0, valoarea implicita) sau daca e 1, intre RaiseEvent si apelul metodei nu e nici o diferenta din punctul de vedere al lui BindEvent. Acesta va exacuta cu ravna si insufletire codul metodei specificate in RaiseEvent sau in apelul propriu-zis.

In schimb, daca flags este 2 sau 3 lucrurile se schimba. RaiseEvent va determina BindEvent sa percuteze, in timp ce apelul metodei nu.

Uite o secventa de cod care este semnificativa pentru scenariul de mai sus:

*------ Primul obiect listener
Define Class
Obj1 As custom
Procedure Init
    BindEvent
(MyCustomClass,"CustomEvent",This,"HandleEvent")
EndProc

Procedure HandleEvent
   
Wait Window This.Name
EndProc
EndDefine

*------ Al doilea obiect listener
Define Class
Obj2 As Custom
Procedure Init
   
BindEvent
(MyCustomClass,"CustomEvent",This,"HandleEvent")
EndProc

Procedure HandleEvent
   
Wait Window This.Name
EndProc
EndDefine

*------ Obiectul global
Define Class
MyCustomClass As Custom
Procedure
CustomEvent
EndProc
EndDefine

Ok. Salvam asta ca prg si rulam urmatoarele chestii din fereastra de comenzi:

Set Procedure To numeprg.prg
MyCustomClass = CreateObject("MyCustomClass")
Obj1 = CreateObject("Obj1")
Obj2 = CreateObject("Obj2")
*-- In acest moment obiectele sunt create, si obiectele Obj il sunt legate de metoda CustomEvent a lui MyCustomClass.
MyCustomClass.CustomEvent()
*-- Apar doua ferestre wait window. Corect, ne asteptam la asta.
RaiseEvent(MyCustomClass,"CustomEvent")
*-- Apar doua ferestre wait window. Corect, si la asta ne asteptam.
Deschidem din nou prg-ul si adaugam un 2 la coada primului BindEvent. Definitia primului obiect arata asa:

Define Class Obj1 As custom
Procedure Init
  
BindEvent
(MyCustomClass,"CustomEvent",This,"HandleEvent",2)
EndProc

Procedure HandleEvent
   
Wait Window This.Name
EndProc
EndDefine

Bun. Rulam urmatoarele in Command window:

Set Procedure To numeprg.prg
MyCustomClass = CreateObject("MyCustomClass")
Obj1 = CreateObject("Obj1")
Obj2 = CreateObject("Obj2")
*-- In acest moment obiectele sunt create, si obiectele Obj il sunt legate de metoda CustomEvent a lui MyCustomClass.
MyCustomClass.CustomEvent()
*-- Apare numai o fereastra wait window, generata de obiectul 2
RaiseEvent(MyCustomClass, "MyCustomEvent")
*-- Apar ambele ferestre wait window.

Mai exact, cand e Bind() cu 2 sau 3, numai RaiseEvent determina executia codului din eveniment. Apelul metodei nu. Adica 2 sau 3 il fac pe BindEvent() sa bind-uiasca la EVENIMENT. Nu la METODA. Diferenta dintre 2 si 3 e ordinea in care se executa (daca e delegatul se executa inaintea evenimenului sau dupa) si nu e relevanta pentru problema ridicata.

Asta-i toata diferenta. Practic, BindEvent face diferenta dintre ele, din modul in care este setat flags.


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 10/25/2005 11:49:14 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: BindEvent() si RaiseEvent()
 (Romania)
Nici o reactie, vad. Any comments? Am scapat ceva?
Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 10/25/2005 11:54:49 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: BindEvent() si RaiseEvent()
 (N/A)

O clipa, IE crash la upload :)

Refac textul

 


Daniel Buduru
 10/26/2005 12:21:03 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: BindEvent() si RaiseEvent()
 (N/A)

Nu ma indoiam ca ii dai de capat. Am doar o completare de facut.

E adevarat ca se poate obtine aceeasi functionalitate si cu cod scris in respectivele metode/eventuri. Avantajul utilizarii BindEvants() si RaiseEvants() este mai evident atunci cand programezi OOP loose coupling, si dau un exemplu:

PUBLIC oform1
oform1=
NEWOBJECT
("form1")
oform1.
Show
RETURN

DEFINE CLASS form1 AS form
Top
= 0
Left
= 0
Height
= 272
Width
= 461
DoCreate
= .T.
Caption
= "BindEvent & RaiseEvent"
Visible
= .T.
Name
= "Form1"

ADD OBJECT command1 AS commandbutton WITH ;
Top
= 0, ;
Left
= 372, ;
Height
= 27, ;
Width
= 84, ;
Cancel
= .T., ;
Caption
= "Exit", ;
Name
= "Command1"

ADD OBJECT command2 AS commandbutton WITH ;
Top
= 1, ;
Left
= 0, ;
Height
= 27, ;
Width
= 84, ;
Caption
= "Add Container", ;
Name
= "Command2"

ADD OBJECT label1 AS label WITH ;
FontSize
= 8, ;
WordWrap
= .T., ;
Caption
= [Apasa de 2-3 ori "Add Container", apoi, in fiecare container, "EditMode"], ;
Height
= 47, ;
Left
= 312, ;
Top
= 36, ;
Width
= 142, ;
Name
= "Label1"

ADD OBJECT label2 AS label WITH ;
FontSize
= 8, ;
WordWrap
= .T., ;
Caption
= "Incearca inchiderea formului din Close Box si de la butonul Exit", ;
Height
= 58, ;
Left
= 312, ;
Top
= 108, ;
Width
= 142, ;
Name
= "Label2"

PROCEDURE command1.Click
thisform
.
release
ENDPROC

PROCEDURE command2.Click
LOCAL
lnIndex
WITH thisform
lnIndex=.Objects.count
+1
.
NewObject('evtcontainer'+TRANSFORM
(lnIndex),'evt')
IF LOWER(.objects(lnIndex-1).class
)='evt'
   .
Objects(lnIndex).Move(1,.objects(lnIndex-1).top+.Objects(lnIndex-1).Height
)
ELSE
   .Objects(lnIndex).Move(1,this.top+this.Height
)
endif
 .Objects(lnIndex).Visible
=.t.
ENDWITH

ENDPROC

ENDDEFINE

DEFINE CLASS evt AS container
Width
= 289
Height
= 73
editmode = .F.
Name
= "evt"

ADD OBJECT dbtextbox1 AS dbtextbox WITH ;
Enabled
= .F., ;
Left
= 5, ;
Top
= 4, ;
Name
= "Dbtextbox1"

ADD OBJECT dbtextbox2 AS dbtextbox WITH ;
Enabled
= .F., ;
Left
= 6, ;
Top
= 32, ;
Name
= "Dbtextbox2"

ADD OBJECT check1 AS checkbox WITH ;
Top
= 2, ;
Left
= 213, ;
Height
= 24, ;
Width
= 72, ;
Alignment
= 0, ;
Caption
= "EditMode", ;
Value
= .F., ;
Style
= 1, ;
Name
= "Check1"

PROCEDURE onformrelease
nodefault
MESSAGEBOX
("Aveti o editare in curs")
RETURN
.f.
ENDPROC

PROCEDURE oneditmode
LPARAMETERS
tlEditMode
IF
tlEditMode
   BINDEVENT(thisform,'release',this
,'OnFormRelease')
   BINDEVENT(thisform,'queryUnload',this
,'OnFormRelease')
Else
   UNBINDEVENTS(thisform,'queryUnload',this
,'OnFormRelease')
   UNBINDEVENTS(thisform,'release',this
,'OnFormRelease')
ENDIF
ENDPROC

PROCEDURE Init
BINDEVENT
(this,'editmode',this,'OnEditMode',1)
ENDPROC

PROCEDURE check1.InteractiveChange
RAISEEVENT
(this.Parent,'editmode',this.Value
)
ENDPROC

ENDDEFINE
DEFINE CLASS
dbtextbox AS textbox
Height
= 23
Width
= 100
editmode = .f.
Name
= "dbtextbox"

PROCEDURE oneditmode
LPARAMETERS
tlEditMode
this.Enabled
=tlEditMode
this.Value=IIF
(tlEditMode,'EditMode','Disabled')
ENDPROC

PROCEDURE Init
IF PEMSTATUS
(this.Parent,'editmode',5)
   
BINDEVENT(this.Parent,'editMode',this
,'OnEditMode',1)
endif
ENDPROC
ENDDEFINE

Imi cer scuze pentru codul prea lung inserat, am sperat ca e mai scurt.
In esenta, vreau sa scot in evidenta faptul ca utilizarea acestor functii permite o mai mare flexibilitate, un obiect poate ajusta functionarea containerului / formului dupa necesitati, in situatia in care formul nu stie nimic despre obiectul respectiv.

Dupa ce am testat functiile, mi-am reproiectat o mare parte din calsele de baza si din framework, avantajele fiind mari.

Un alt exemplu: un singur obiect din aplicatie face polling pe baza de date, urmarind modificarea fisierelor de lookup. Apoi face broadcast in aplicatie(raiseevent) cu numele fisielor modificate. Am redus atat traficul, cat si timpul de raspuns al aplicatiei - pentru cursoarele lookup modificate frecvent faceam requery a fiecare intrare in editare ...

Nu insist mai mult, sunt convins ca deja ai trecut in revista "potentialul" functiilor. Am facut precizarile mai mult pentru cei care, eventual, mai urmaresc acest thread.

Off topic, tin sa te felicit atat pentru initiativa de a-linvita pe Ken Levi la Bucuresti, cat si pentru reusita vizitei. Sunt convins ca cele postate de Ken atat pe forumul de la UT cat si in blogul personal ti se datoreaza in cea mai mare parte. Initiativa insa iti apartine in exclusivitate. Ai toata stima mea pentru ce ai realizat, si nu numai conferinta, ci si activitatea de pe forumul UT si de pe acest forum

Dan


Daniel Buduru
 10/26/2005 12:33:48 AM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: BindEvent() si RaiseEvent()
 (Romania)

Foarte corect, Dan. Inteleg unde bati. Obiectele alea nu stiu unul de existenta altuia. Doar BindEvent() stie, si le leaga fara ca ele sa stie ce si cum. Si din momentul ala ele, fara sa aiba cod specific (care sa apeleze din unul metodele celuilalt) se comporta unitar si fac impreuna o treaba, nu conteaza ce.

Off topic - initiativa de a-l invita pe Ken nu-mi apartie, ci este a lui Sergiu Cazan. Sa fiu sincer, eu n-am indraznit sa-l chem. Da' Sergiu a avut mai mult nerv. (Apropo, are cineva idee de ce Sergiu nu s-a inregistrat pe forum?)


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 10/26/2005 12:55:32 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: BindEvent() si RaiseEvent()
 (N/A)

Asa cum ziceam, ai explorat deja potentialul functiilor.

Off topic - Eu vorbesc despre ce am vazut pe UT - invitatia a fost adresata de tine. Nu am legaturi in sfera programatorilor de aici, nu am stiut de Sergiu Cazan - imi cer scuze fata de el, cu aceasta ocazie, sperand ca va citi candva acest topic. Nu am fost nici la conferinta, de altfel - si regret ca nu mi-am facut timp pentru asta.


Daniel Buduru
  Visual FoxPro  Cod, sintaxa si comenzi  BindEvent() si ...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement