Search  
Wednesday, May 23, 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  Visual FoxPro in general  Fox-ul are nevo...
 Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 
 5/14/2006 9:44:04 PM
User is offlineNexus
22 posts
www.pcmaker.ro




Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Situatia e urmatoarea:
La evenimentul click al unui buton se initializeaza valoarea unei variabile cu o valoare de la 1 la 29 in functie de butonul click-uit.
Valoarea acestei variabile declarata publica nu se schimba in nici o alta secventa de program, fiind folosita doar la identificarea butonului apasat.
Totul functioneaza ok o vreme, variabila se initializeaza cu valoarea corespunzatoare butonului apasat, dar dupa ce se lucreaza cam 30 min cu programul sau daca fereastra aplicatiei este minimizata si o alta aplicatie primeste focusul, totul o ia razna.
Variabila se initializeaza cu valori aleatorii care nu corespund cu valoarea stabilita programatic.
Daca opresc si repornesc aplicatia situatia revine temporar la normal dupa care iar o ia razna.
Poate cineva sa explice de ce se intimpla acest lucru si cum se poate remedia?
 5/14/2006 9:54:04 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Nu inteleg exact ce se intampla. Apesi pe buton si variabila respectiva ia alte valori? Cum e comanda de initializare a variabilei?
Variabila are un nume pe care il mai folosesti si intr-o baza de date sau in alt loc in program?
Ti-as sugera sa renunti la variabila globala si sa folosesti o proprietate a obiectului _screen. La deschiderea programului generezi acea proprietate :
_screen.addproperty("nrButon",0)
Iar la metoda click a butoanelor folosesti _screen.nrButon in locul acelei variabile publice. _screen.nrButon este in continuare accesibila de oriunde din program.

Alex Dobrin
Algis Info
 5/14/2006 10:04:47 PM
User is offlineNexus
22 posts
www.pcmaker.ro




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Numele variabilei nu se confunda cu nici un cimp al nici unei tabele folosite in aplicatie.
Programul consider ca l-am scris corect dat fiind ca functioneaza conform asteptarilor, e drept doar o vreme.
Ce nu inteleg, si cred ca greseala nu e la mine, ce se intimpla ca variabila nu ia acea valoare pe care io dau eu.
Mi se pare o problema grava, fiindca foarte bine putea sa fie o variabila care sa stocheze rezultatul unui calcul.
Cum ar fi ca in loc de rezultatul scontat sa gasim dupa o vreme valori dupa bunul plac al nici nu stiu cui (fox, windows, calculator, etc), dar nici pe departe valoarea de care am avea nevoie?
Se mai poate avea incredere?
 5/14/2006 10:30:38 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Folosesc Fox-ul de mai mult de 10 ani dar nu am auzit (de patit nici atat) ca o variabila sa nu ia valoarea data de programator.
Simptomele pe care le-ai postat sunt caracteristice situatiei in care o variabila este folosita (i se atribuie diferite valori) in mai multe locuri din program.
Este de preferat sa se ocoleasca utilizarea variabilelor publice tocmai din acest motiv.
Problema nu este de Fox. Sunt sigur de asta.
Incearca te rog solutia pe care ti-am sugerat-o (_screen.nrButon in locul variabilei publice) si ai sa te convingi.


Alex Dobrin
Algis Info
 5/14/2006 11:29:06 PM
User is offlineNexus
22 posts
www.pcmaker.ro




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Si eu programez in fox din 1995, si nici eu n-am mai patit asa ceva.
Am folosit foarte mult foxul 2.6 din dos care cred eu ca a ajuns sa fie marginalizat pe nedrept. E mult mai productiv decit acesta visual.
Ca sa obtin aceeasi functionalitate in programele scrise in vfp imi trebuie cam de 3 ori mai mult timp decit in IDE-ul DOS.
Eu cred ca datorita complexitatii mediului visual aceasta versiune are un bug, caci varianta dos a functionat totdeauna conform asteptarilor.
In ceea ce priveste problema de la care a pornit discutia, o sa stochez valoarea variabilei intr-o tabela si o s-o iau de acolo cind am nevoie, si sper ca programul sa n-o mai ia razna dupa aprox. 30 minute.
 5/14/2006 11:48:02 PM
User is offlineAlex Dobrin
766 posts
www.algis.ro
1st






Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Ce versiune de VFP folosesti?
Daca ar fi un bug de ce crezi ca nu s-ar repeta si daca ti valoarea in dbf?
Procedezi cum crezi de cuviinta dar cred ca gresesti folosind o tabela in situatia asta.

In ce priveste productivitatea trebuie sa te contrazic. In VFP o problema poate fi rezolvata mult mai repede decat in FPD. Iti sugerez sa citesti "Contacts pentru incepatori 1.5" din Download / Tutoriale incepatori.
Totul depinde de cum abordezi problema.

Alex Dobrin
Algis Info
 5/14/2006 11:59:00 PM
User is offlineNexus
22 posts
www.pcmaker.ro




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
In visual se pot face lucruri spectaculoase repede e drept. Dar cind vine vorba de lucrurile de rutina cum ar fi aranjarea cimpurilor intr-un raport si a textelor aferente e mult mai bun fpd-ul, caci in vfp formatarea outputului e o loterie, niciodata nu e acolo unde ar trebui sa fie decit doar aproximativ si atunci trebuie ajustat pozitia cimpului in report designer ca rezultatul sa fie cel dorit.
Mai sunt si alte aspecte, de exemplu ma deranjeaza ca nu pot scrie cod la acelasi eveniment dar la mai multe obiecte deodata si in consecinta trebuie sa intru la fiecare in parte si sa scriu codul necesar...o imensa pierdere de vreme si foarte plictisitor.
 5/15/2006 12:06:44 AM
User is offlineDanTodor
297 posts
4th


Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (Romania)
Cred ca ar trebui sa-ti revezi un pic bazele ... Chiar nu poti in VFP sa declari o functie si s-o apelezi din mai multe locuri ? Se pare ca degeaba iti da omul sugestii, ca tie ti-a casunat pe vfp si pace...
 5/15/2006 12:08:05 AM
User is offlineedyshor
1450 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (Romania)
practica adoptata de mine in ceea ce priveste variabilele globale (ptr stocarea diferitelor informatii) consta in gruparea lor intr-un (obiect session atribuit unei variabile globale), variabilele fiind proprietati ale acestui obiect ..
oricand le poti verifica fara prea mare bataie de cap si nu intra in conflict cu altele .. (nu pot sa sufar varianta cu memvar.. mi se pare .. instabila si "error-prone")
 
ex:

PUBLIC gov

gov=NEWOBJECT("session")

*-

ADDPROPERTY(gov,"codg",0)   && cod gestiune

ADDPROPERTY(gov,"cods",0)   && cod sectie

ADDPROPERTY(gov,"anln",0)   && anul si luna ex: 200605

*-


se poti folosi si in view-uri .. si ptr reactualiuzare un simplu requery() dupa ce ai dat alte valori (gov.anln=200604)
 
referitor la simptomele tale .. si in visual ai un Debuger .. cu Locals .. si Watch :) .. incearca-l .. s-ar putea sa-ti placa :P
ok .. lasand gluma la o parte .. sunt de acord cu Alex .. cred ca-i modifici valoarea pe undeva  ..
poate ca ai dreptate in ce priveste fpd din punctul tau de vedere .. dar prefer visual ptr ideea de oop .. clasele astea . .atat de folositoare :)
 
have fun .. si good luck ;)
 5/15/2006 12:27:53 AM
User is offlineNexus
22 posts
www.pcmaker.ro




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Multumesc pentru exemplu, imi place idea.
Stiu ca este debuger si asa mai departe, dar ce te faci cind eroarea nu apare la simpla rulare a programului ci doar dupa o vreme. (pina atunci totul functioneaza ca la carte)
 5/15/2006 12:34:14 AM
User is offlineNexus
22 posts
www.pcmaker.ro




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Si ca sa apelezi functia trebuie sa intri la evenimentul corespunzator la obiectul dorit, si daca sunt multe obiecte care trebuie sa apeleze acea functie nu-mi spune mie ca nu ti-ar placea sa poti face aceasta apelare introducind codul aferent o singura data pentru toate...
 5/15/2006 8:50:23 AM
User is offlineedyshor
1450 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (Romania)
ai posibilitate sa intrerupi programul atunci cand variabila isi schimba valoarea sau cand are o anume valoare (Breakpoints) ..
in Debuger apesi Ctrl+B si la Type alegi ce ti se pare potrivit ("Break when expresion is true"), mai jos la Expression scrii "myvar=value" unde myvar e variabila ta ("gov.ButtonId") si valoare e valoarea gresita .. ex: "gov.ButtonId=-1" ..
sper sa-ti fie de ajutor :)
 
 5/15/2006 10:50:18 AM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (Romania)
Asta este simptom CLAR de variabila reasignata din neatentie. Renunta la variabilele publice. Daca ai nevoie sa pastrezi ceva vizibil, adauga o proprietate la _Screen si stocheaza acolo (dupa cum ti s-a sugerat mai devreme). Subliniez la randul meu ca pentru ceea ce patesti exista o singura explicatie - variabila aia se reasigneaza din program, din neatentie.
Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 5/15/2006 10:55:28 AM
User is offlineAdrian Gerlan
581 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (Romania)
Nexus, ca sa intelegi ca nu este nevoie sa scrii in metode acea functie pentru fiecare obiect in parte, luam urmatorul scenariu... Intr-un form unde ai "x" obiecte, adaugi o metoda unde scrii functia de care ai nevoie apoi in fiecare obiect faci apel catre acea metoda. Cand vrei sa modific functia, o modifici doar intr-un singur loc. E simplu. Si eu vin din lumea celor din FPD. Uneltele puse la dispozitie de VFP sunt extraordinare. Trebuie doar sa ai rabdarea sa la studiezi. In ce priveste acea variabila sunt sigur ca exista o eroare in cod. Sigur nu este din cauza unui presupus "bug" al VFP. Mai sapa un pic, sau pune la dispozitie secventa de cod sa vedem si noi, poate ne prindem unde-i buba.
AdiG
 5/15/2006 2:19:15 PM
User is offlineedyshor
1450 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (Romania)
ideea cu proprietate la _screen nu-i rea, mai ales ca _screen exista oricum de la inceput dar nu-mi place sa o folosesc din principiu (Aplicatie SDI) si in debug _screen imi arata toate proprietatile si obiectele pe care le contine .. nu doar variabilele mele .. dar fiecaruia cum ii place si cum s-a obisnuit ^_^ oricum si u Nexus o sa-ti formezi propriul stil de programare, o sa ti-l rafinezi si in timp deja o sa-ti intre in reflex precum "browse" sau "use ? in 0"
have fun ..
 5/15/2006 4:03:16 PM
User is offlineDoru
160 posts
www.aquila.ro
5th




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Pentru a gasi in cod, peste tot, unde ai folosit variabila incearca sa o cauti cu Tools -> Code References; dai numele si-ti face o lista cu liniile de cod si locatia lor din tot proiectul; dublu-click pe linia de cod si deschide automat program/form/metoda unde se gaseste variabila.
Cristian Tenea
Aquila
 5/16/2006 12:27:57 AM
User is offlineNexus
22 posts
www.pcmaker.ro




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Am n obiecte si la fiecare in evenimentul click vreau sa apelez functia x, deci in consecinta la fiecare din aceste n obiecte trebuie sa intru si sa scriu =x(parametru).
Ma satisface putin faptul ca definesc functia o singura data si o modific intr-un singur loc daca pentru a o putea apela trebuie sa intru in n locuri.
Nu era mai elegant si mult mai eficace daca puteam sa editez evenimentul click pentru toate cele n obiecte deodata?
Ceva in genul cum se pot stabili parametrii de formatare la o selectie multipla de obiecte.
 5/16/2006 4:05:30 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Poate nu inteleg eu bine ce vrei sa faci. Pai daca cele n obiecte sunt create dintr-o  subclasa, editezi evenimentul click doar in subclasa si va fi mostenit in toate obiectele. Sunt de acord ca in FPD, totul mergea mai repede, dar gandeste-te ca ecranul avea doar 25*80 de caractere si cand faceai un form puteai aranja destul de repede "obiectele", insa si  limitarile erau  pe masura. Ar mai fi si gradul de reutilizare al codului. In FPD aveam o gramada de scule care imi mareau productivitatea. In VFP, acestea sunt in curs de realizare, astfel incat in acest moment nici eu nu ma pot lauda cu o productivitate foarte mare.


 5/16/2006 4:32:11 AM
User is offlineAdrian Gerlan
581 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Daca ai nevoie de n obiecte care sa aiba aceeasi proprietate, metoda sau eveniment, faci o subclasa a acelui obiect asa cum il vrei tu si apoi poti sa-l pui pe form (sau unde vrei) de cate ori ai nevoie, fara sa mai scrii nici macar o linie de cod in plus. c'mon man, VFP nu e chiar asa de rau pe cat il vezi tu acum.. ai putintica rabdare...
AdiG
 5/16/2006 10:28:25 AM
User is offlineedyshor
1450 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (Romania)
nush daca deja subclaseaza .. mi mi se pare ca e pe la inceput ^_^ .. anyway .. o idee .. (tot subclasare)
 
- creezi o clasa cmdBt bazata pe commandbutton, ii adaugi o proprietate ".cmd" tip string (va contine comanda de executat) iar in metoda Click scrii:
   if !this.enabled then
      return
  endif
  *- daca nu-i enabled nu trebuie sa se execute comanda assignata
  local scmd
  scmd=this.cmd
  &scmd
  *- executa comanda din proprietatea .cmd
apoi folosesti butonul (subclasat pe cmdBt) oriunde ai tu nevoie .. acum nu trebuie decat sa pui comanda de executat (functia) in proprietatea "cmd" (interactiv sau programatic) iar la click pe butoane se va executa .. poti sa faci asta la mai multe simultan dar cred ca "x"-ul din codul tau reprezinta un nr de control, sa sti care buton a fost clickuit ... in cazul asta o sa fie nevoie sa scrii comanda la fiecare buton in parte cu x-ul (parm functiei) aferent scopului urmarit (sau programatic in int-ul formului de ex)
 
- o alta idee (fara subclasare) .. poti folosi un optiongroup, ii setezi butoanele (optionbutton) pe graphical si in interactivechange la optiongroup verifici ce buton s-a apasat (this.value) poti, dupa verificare, sa resetezi butoanele sa nu para "apasate" (this.value=0)
 
incearca sa vezi ce obtii cu astea .. si apoi zi-ne si noua :)
Succes!
 5/17/2006 12:41:50 AM
User is offlineNexus
22 posts
www.pcmaker.ro




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Ai intuit bine ca vreau sa stiu ce buton a fost apasat si din aceasta cauza nu ma ajuta subclasarea, iar varianta cu optiongroup imi restringe libertatea de aranjare a butoanelor pe form.
In aplicatia ce-am facut-o fiecare buton reprezinta o masa dintr-un restaurant si trece prin 3 faze: masa libera, masa ocupata cu comanda lansata si masa ocupata cu comanda inchisa(platita). In functie de aceasta butonul isi schimba culoarea pentru a reprezenta grafic starea sa. Fiecare buton este astfel asezat pe form incit sa corespunda pozitiei mesei in sala.
De asemenea ai dreptate ca sunt la inceput in VFP dar am reusit sa fac tot ce mi-am propus pina acum folosindu-ma de ce stiu din FPD si binenteles citind helpul VFP-ului.
Din aceasta cauza solutiile alese de mine nu sunt tocmai elegante si mai mult ca sigur ca multe lucruri puteau fi facute cu mai putin efort, dar acesta este pretul pe care trebuie sa-l platesc.
In consecinta accept bucuros orice sfat pe care-l primesc fiindca informatia de pe forum este la obiect (adica ce ma doare la un moment dat) si nu este nici pe departe asa de arida ca cea din help.
Va multumesc tuturor!
 5/17/2006 10:44:04 AM
User is offlineEugen Gliga
1052 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (N/A)
Subclasarea te poate ajuta. In evenimentul click al subclasei, cand apelezi functia ii poti transmite si doi parametri, unul fiind numele butonului si celalat starea mesei, care banuiesc ca este o proprietate a butonului. Asfel functia apelata va sti cine a apelat-o, fara sa scrii ceva explicit in fiecare buton.






 5/17/2006 11:15:01 AM
User is offlineedyshor
1450 posts
1st




Re: Fox-ul are nevoie de tratament antirabic ca a luat-o razna
 (Romania) Modified By edyshor  on 5/17/2006 11:20:00 AM)
ok .. subclasarea te ajuta foarte mult .. iar clasa cmdBtn care ti-am descris-o este universala (pentru scopul sau) .. comanda de executat o pui in proprietatea .cmd (ex: thisform.cmdMasa1.cmd="thisform.do_click_masa(nr_masa)" ) poti merge chiar mai departe cu ceva de genu:
thisform.cmdMasa1.cmd="thisform.do_click_masa( val( right(this.name,len(this.name-7)) ) )"
thisform.cmdMasa2.cmd="thisform.do_click_masa( val( right(this.name,len(this.name-7)) ) )"
thisform.cmdMasa11.cmd="thisform.do_click_masa( val( right(this.name,len(this.name-7)) ) )"
(ghici ce se intampla la executia comenzii :) )
*-
acum .. best practices..
dupa cum ti-am mai spus, fiecare isi formeaza propriul stil de lucru .. mie-mi plac lucrurile simple si la obiect .. decat sa trag dupa mine in fiecare proiect librariile (classlib, vcx) de clase "abstract" si "controls" si asa mai departe, imi fac un classlib special ptr proiectul respectiv in care imi copiez clasele pe care o sa le folosesc in proiect (etxt, ecmb - enhanced standard; etxtdt, frmtool, lbltherm - controale speciale, etc)
subclasarea nu o aplic decat la primul nivel (o subclasa din baseclass careia ii adaug functionalitatea dorita in asa fel incat sa o pot folosi in orice situatie - de regula cu parametri/proprietati si metoda de initializare)
daca am nevoie in proiectul respectiv de clase bazate pe o subclasa (ptr fucnctionalitate specifica proiectului) atunci fac subclasare la clasa respectiva in proiect; daca descoperi ca faci asta prea des ar trebui sa gandesti din nou clasa respectiva :)
deja dupa un timp de lucru in vfp cu formuri si controale ai o lista cu ce ai fi vrut "standard" in textbox-uri, combo, grid, commandbutton, optiongroup (indiferent daca tine de functionalitate sau de estetic), acum ai sansa sa indrepti asta prin subclasare;
creeaza un classlib abstratct ("CREATE CLASSLIB standard.vcx");
acum deschide standard.vcx cu ClassBrowser-ul (il gasesti in meniul tools, open e al doilea buton din toolbar);
creezi o clasa noua (butonul dupa find-binoclu); alegi clasa de baza - "based on" (textbox) iar la nume pui "etxt";
aici, in class designer, poti sa-ti "desenezi" clasa cum vrei tu :); incearca urmatoarele:
SpecialEffect = 1; Margin=1; Height=20; asta pentru cosmetica
in eventul LostFocus baga codul urmator:

IF !(INLIST(LASTKEY(),13,10,9,15,148) OR MDOWN()) THEN && Enter, Ctrl+Enter, Tab, Shift+Tab, Ctrl+Tab
   NODEFAULT
ENDIF

mai adauga o metoda "release" la clasa ta (nu poti sti niciodata cand iti e de folos); in meniul class -> new method
acum adauga codul urmator in Release:

RELEASE this

gata. acum ai textbox "standard" (cum il vad eu.. remember fiecare programator cu stilul lui)
trebuie sa-l testezi, so .. inchide (salveaza), creaza un form (create form .. ), adauga 2 textboxuri de genu "etxt" pe form (poti sa le tragi din classbrowser din iconita care e in stanga combo-ului in toolbar - doar de acolo poti sa-l tragi pe form din classbrowser) si executa formul :)


ok .. un cmd (ecmd) ti-am dat .. daca-l folosesti cum ti l-am aratat mai sus poti sa pui la toate aceeasi val in proprietatea ".cmd" si automat o sa ai parmetru in thisform.do_click_masa() care buton a fost clickuit. apropo .. metoda trebuie sa o creezi tu in form (Meniu Form->New Method -> ii pui numele "do_click_masa") apui modifici metoda si prima linie sa contina "LPARAMETERS nrMasa" in restul metodei verifici starea butonului apasat (nrMasa) si iei masurile necesare.

alternativ in loc de
thisform.cmdMasa1.cmd="thisform.do_click_masa( val( right(this.name,len(this.name-7)) ) )"  poti folosi
thisform.cmdMasa1.cmd="thisform.do_click_masa( this )"  in cazul asta trimiti parametru referinta obiect a butonului clickuit
te poti folosi de asta in do_click_masa in felul urmator: nrMasa.ForeColor= <culoare noua>

cel mai bun lucru care poti sa-l faci este sa studiezi clasele fox-ului (fundation, samples) exemplele care le gasesti pe net .. inveti multe asa
si crede-ma potibilitatile sunt imense =)

la asezarea butoanelor in intr-un optiongroup.. tine apasat Ctrl cand dai click pe un buton din interionr ;)

sper sa-ti fie de ajutor .. have fun ..

 

  Visual FoxPro  Visual FoxPro in general  Fox-ul are nevo...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement