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  Form-uri si generatoare de form-uri  Release form...
 Release form
 
 12/12/2011 11:27:37 AM
User is offlineclivius33
68 posts


Release form
 (N/A)
Vreau sa inchid programatic un anumit nr. de form-uri care se lanseaza una din alta. De ex. am 3 form-uri, toate 3 au ShowWindow = 0 - In Screen (Default) si WindowType = 1 - Modal. Prima o lansez din meniul principal al aplicatiei cu o c-da de genul "Do form forma1", pe acesta forma am un buton de unde lansez forma 2 cu o c-da "do form forma2". Pe forma 2 am un buton de unde lansez forma 3 cu "do form forma3" si tot asa.
Vreau sa le inchid programatic cu secventa :
local k, l_formcount
l_formcount = _Screen.FormCount
for k = 1 to l_formcount
    _Screen.Forms[1].Release
endfor

Din motive pe care nu mi le explic insa este inchisa doar forma 3, la iesirea din ciclul for-endfor proprietatea _Screen.FormCount ramanand cu valoarea 2 ! Tot studiez si fac incercari de vreo saptamana, am incercat sa le inchid in ordine inversa, plecand de la forma parinte spre copii, degeaba, tot nu merge. Am inteles ca daca am vreo referinta la o forma atunci asta ar fi un motiv de nu o pot inchide, dar ce referinta sa am, lansez simplu cu "do form", fara "name" sau altceva in sintaxa. De asemenea nu am toolbar-uri pe nicaieri.
Multumesc anticipat !


 12/12/2011 1:00:01 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
De unde lansezi secventa de inchidere?

Daniel Buduru
 12/12/2011 1:07:02 PM
User is offlineEugen Gliga
1052 posts
1st




Re: Release form
 (N/A)
Pai zici ca toate formele sunt modale. In acest caz doar ultima forma poate fi activa si nu ai cum inchide forma care a apelat-o..

O solutie pt problema ta ar fi ca fiecare forma apelanta sa se inchida dupa revenirea din forma apelata, ceva de genul:


Do form forma1
ThisForm release


 12/12/2011 7:07:13 PM
User is offlineclivius33
68 posts


Re: Release form
 (N/A)
Secventa de inchidere o lansez din programul principal. Mai precis am o functie de 'auto-inchidere' care dupa o anumita perioada de 'idle time' sa-mi inchida aplicatia.
 12/12/2011 8:15:44 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
Nu stiu cum declansezi functia din programul principal "dupa o anumita perioada de timp".
In mod normal ai pune in _screen un timer, iar in evenimentuil timer o secvenat de inchidere de genul asta:

for each oform in _vfp.forms foxobject
oform.release
next




Daniel Buduru
 12/12/2011 9:49:43 PM
User is offlineclivius33
68 posts


Re: Release form
 (N/A)
 Daniel Buduru wrote
Nu stiu cum declansezi functia din programul principal "dupa o anumita perioada de timp".
In mod normal ai pune in _screen un timer, iar in evenimentuil timer o secvenat de inchidere de genul asta:

for each oform in _vfp.forms foxobject
oform.release
next





Pai asa fac, in procedura principala am o functie cu un timer care, daca trece un timp de inactivitate (idle time), declanseaza procedura de auto-inchidere a programului. Am incercat cu "for each oform in _screen.forms" si n-a mers, am sa incerc si cu colectia _vfp.forms sa vad cum merge. Multumesc.

 12/13/2011 8:32:01 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
Functioneaza si cu _screen.forms, desi nu este o colectie, ci un vector. _vfp.forms este colectie, si a fost introdusa in vfp8, odata cu introducerea clasei colectie in vfp.
In vfp9 s-a introdus parametrul FOXOBJECT, care specifica faptul ca obiectul enumerat este un obiect nativ vfp si nu un COM.
Daca tot nu functioneaza traseaza in debugger inchiderea si vezi in ce se agata.

Daniel Buduru
 12/13/2011 8:35:22 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
Vezi aici o discutie pe tema enumerarii in colectie si Foxobject:
http://www.tek-tips.com/viewthread.cfm?qid=1457269


Daniel Buduru
 12/13/2011 10:37:10 PM
User is offlinemgabi
135 posts
5th


Re: Release form
 (N/A)
Cred ca ai vrut sa zici:

_Screen.Forms[k].Release
si nu
_Screen.Forms[1].Release

Eu folosesc exact acelasi for si functioneaza. La debug ce-ti zice?
 12/14/2011 2:45:41 PM
User is offlineclivius33
68 posts


Re: Release form
 (N/A)
 mgabi wrote
Cred ca ai vrut sa zici:

_Screen.Forms[k].Release
si nu
_Screen.Forms[1].Release

Eu folosesc exact acelasi for si functioneaza. La debug ce-ti zice?


Daca te uiti cu atentie la codul meu ai sa vezi ca e corect _Screen.Forms[1].Release !
Debug-ul nu ma ajuta deloc, vad cum codul ruleaza corect, trece pe rand prin fiecare forma dar nu se inchide efectiv decat ultima deschisa (vad clar cum trece prin codul de 'destroy' si apoi din 'unload'), apoi la celelalte, desi nu-mi apare nici o eroare nici nu se face release-ul ! M-a disperat, nu merge cu nici o metoda. Tocmai de aceea am luat o pauza  si am trecut la alte teme mai urgente. Oricum o ciudatenie a fox-ului se pare ca este aceea ca atunci cand rulezi din debug, la prima forma in care se intra la ciclul for/endfor pt. a-i face release (adica ultima forma deschisa pe ecran),
variabila _screen.ActiveForm contine numele acestei forme, pe urma insa, variabila _screen.ActiveForm apare ca fiind nedefinita, parca fox-ul pierde focusul !
Multumesc pt. intentia de a ma ajuta !

 
 12/14/2011 5:27:26 PM
User is offlineEugen Gliga
1052 posts
1st




Re: Release form
 (N/A)
Parerea mea este ca deoarece formele sunt modale nu pot fi sterse decat in ordinnea inversa a crearii lor. Asa s-ar explica si faptul ca doar ultima forma se sterge. Ai putea incerca: Do While _Screen.FormCount>0 _Screen.Forms[_Screen.FormCount].Release() EndDo Astfel formele se vor sterge in ordinea inversa.
 12/14/2011 8:05:07 PM
User is offlineclivius33
68 posts


Re: Release form
 (N/A)
 Eugen Gliga wrote
Parerea mea este ca deoarece formele sunt modale nu pot fi sterse decat in ordinnea inversa a crearii lor. Asa s-ar explica si faptul ca doar ultima forma se sterge. Ai putea incerca: Do While _Screen.FormCount>0 _Screen.Forms[_Screen.FormCount].Release() EndDo Astfel formele se vor sterge in ordinea inversa.


Crede-ma ca am incercat sa le sterg si in ordine inversa si nu a mers ! Am incercat de asemenea si cu un ciclu 'do while' exact ca cel sugerat si am ramas in bucla infinita pt. ca _Screen.FormCount nu ajungea niciodata la 0.
Cand voi avea timp am sa fac de curiozitate niste teste si cu forme modeless sa vad daca ar merge, o conta si proprietatea 'ShowWindow' care acum la  mine este pe zero (In Screen), habar n-am.
Multumesc mult !
 12/14/2011 9:25:10 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
Ruleaza fmodal din exemplul atasat.

Daniel Buduru
CloseForms.zip 
 12/15/2011 4:02:16 PM
User is offlineclivius33
68 posts


Re: Release form
 (N/A) Modified By clivius33  on 12/15/2011 5:02:33 PM)
 Daniel Buduru wrote
Ruleaza fmodal din exemplul atasat.


In exemplul atasat merge, la mine in program nu, este practic si alt context, mai sap.
Multumesc mult !
 12/15/2011 4:42:41 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
Cea mai probabila cauza este o referinta "agatata" la un obiect din form.
Daca formurile sunt instantiate din acelasi form, sau au acelasi cod, sau sunt derivate dintr-o clasa proprie, sau in formuri ai obiecte derivate din calse proprii - asta ar fi numitorul comun intre formuri - e probabil ceva in cod.
Daca formul sau vreun obiect din el instantiaza un obiect care nu este inclus in form, si nu este eliberat la inchiderea formului, si aceste poate "agata" formul.

Exisra un utilitar al lui David Frankenbach, ObjRef, care gaseste referintele "agatate". Se putea descarca de pe situl autorului, dara cum acest site nu mai exista.
Il atasez aici, poate te ajuta.

Mai vezi si articolele urmatoare:
http://www.foxpert.com/docs/safeclasses.en.htm
http://fox.wikis.com/wc.dll?Wiki~ManualGarbageCollection
http://www.foxite.com/archives/thisformrelease-not-working-0000103064.htm
http://myvfpblog.blogspot.com/2008/04/vfp-editor-code-rtf2html-part-6.html
http://social.msdn.microsoft.com/forums/en-US/visualfoxprogeneral/thread/83a333f2-a7e4-4432-afff-b504dd3fb5ff


Daniel Buduru
objref.zip 
 12/16/2011 4:05:18 PM
User is offlinemgabi
135 posts
5th


Re: Release form
 (N/A)
Am incercat si eu sa reproduc situatia ta, si intr-adevar, daca incerc sa fac release din afara formurilor nu functioneaza.

Eu am folosit release-uri de acest gen doar din interiorul formului activ, exact ca in exemplu. Am testat cu o metoda din exterior ... nu merge.
Nu stiu din ce cauza, dar formul parinte nu "vede" ca odrasla nu mai exista si nu se inchide cand primeste release. Este ceva legat de modul in care trateaza evenimentele.
Cand o sa am putin timp o sa incerc si cu o metoda in formuri pe care sa o lasez din timer ... sa vad daca se schimba ceva.

La mine functioneaza cam asa, daca fac release din interiorul formului activ (dupa cate mi-am dat eu seama):

1.metoda_releALL din form3 incepe secventa for pentru release
2.formul 3 (ultimul=forms[1]) primeste release
3.formul 2 (forms[2]) primeste release
4.formul 1 (forms[3]) primeste release ... inca exista 3 formuri,de aceea am eu forms[k]
5. se termina metoda_releALL (cea care contine for-ul)
6. se inchide in sfarsit form3
7. form2 primeste controlul inapoi in metoda care lansase form3, termina metoda si abia acum se inchide.
8. form1 primeste controlul inapoi in metoda care lansase form2, termina metoda si abia acum se inchide.

In contextul tau este dificil sa-mi dau seama in ce ordine trateaza VFP evenimentele.

Daca le descurci, da-ne si noua de stire pls.
 12/16/2011 4:24:40 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
In exemplul postat, una dintre metode este cu un timer, alta cu un obiect custom, iar ultima cu codul in command.click

Daniel Buduru
 12/16/2011 4:28:22 PM
User is offlinemgabi
135 posts
5th


Re: Release form
 (N/A)
Daca muti timer-ul in screen iti merge?
 12/16/2011 4:37:26 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
Timerul oricum e instantiat in _screen. Poti vedea asta daca te uiti in cod.
Cu timerul in programul aplicatiei s epoate testa ci acest cod:

**doformclose.prg
IF !PEMSTATUS(_screen,'oCloser',5)
    _screen.NewObject('oCloser','Formcloser','closeforms.vcx')
ENDIF
_screen.oCloser.Interval=5000
_screen.oCloser.enabled=.t.
DO FORM fmodal

Se salveaza codul ca program, se lanseaza, se instantiaza oricate formuri in cascada. La 5 secunde dupa lansare, formurile se inchid.
Versiunea:
Visual FoxPro 09.00.0000.7423 for Windows

Daniel Buduru
 12/16/2011 4:43:50 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
Dupa prima rulare, timerul ramane instantiat in _screen. La rularile urmatoare, actioneaza complet din afara programului.

Daniel Buduru
 12/16/2011 4:50:13 PM
User is offlinemgabi
135 posts
5th


Re: Release form
 (N/A)
Incerc acum sa vad ce face la mine.
 12/16/2011 5:16:05 PM
User is offlinemgabi
135 posts
5th


Re: Release form
 (N/A)
Pe exemplu merge , si daca il fac programel , si daca testez direct pe formuri.

Cu formurile mele din aplicatii nu ... trebuie sa fac o comparatie, undeva este o diferenta de setari intre formuri.

 12/16/2011 5:35:08 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Release form
 (N/A)
Nu setarile formurilor sunt responsabile pentru asta, ci referintele "agatate".
Verifica mai intai variabilelele publice din aplicatie. Orice variabile de tip obiect cu vizibilitate publica este suspectul principal in acest caz.
Apoi proprietatile de tip obiect ale oricarui obiect din aplicatie.


Daniel Buduru
  Visual FoxPro  Form-uri si generatoare de form-uri  Release form...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement