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  Clase - VCX si PRG  definirea clase...
 definirea claselor
 
 5/22/2006 11:30:00 AM
User is offlineAlin Berce
371 posts
3rd




definirea claselor
 (Romania)
Tot citind pe aici pe forum una alta m-am luminat un pic cum sta treaba cu clasele si de ce sunt ele necesare. Asa ca m-am apucat sa imi fac niste clase. Un exemplu ar fi clasa pentru navigare care contine 4 butoane first,prev,next si last.
Buuuuun, intrebarea mea este urmatoarea:
Daca userul e pozitionat pe prima inregistrare din tabela: first si prev sunt enable pe .f. si tot asa tot felul de conditii. Aceste verificari le fac intr-o metoda a commandgroup-ului din clasa mea care se numeste mynav.
Problema mea a aparut in momentul in care fac aceste verificari.
Sa dau un exemplu:
-mynav.refresu-
select this.tabela
if recno()=1
thisform.mynav1.cmdfirst.enabled=.f.
endif.... etc
Cand inserez un obiect din clasa mynav intr-un form acesta va avea numele mynav1.. cum pot substitui thisform.mynav1 cu ceva generalizat care sa nu tina cont de denumire astfel sa pot redenumi cum vreau in proiect acel obiect? Banuiesc ca se poate, nu?

Multumesc. O zi buna.

VFP, C#, SQL Server 2005/2008
"Proud to be a ProFox member".
 5/22/2006 11:40:22 AM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: definirea claselor
 (Romania)
Din cate vad eu, tu incerci sa adresezi obiectul mynav dintr-o metoda de-a lui. Poti folosi THIS pentru asta. This adreseaza intotdeauna obiectul in a carui metoda te afli. Evident, This fiind o referinta, poti folosi mai departe obiectul referit: This.Parent, This.Parent.Class, This.Parent.Refresh(), etc.
Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 5/22/2006 11:41:35 AM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: definirea claselor
 (Romania)

Concret, in cazul codului tau ai putea avea (admitand ca esti in metoda MyNav.Refresh):

If Recno() = 1
This.CmdFirst.Enabled = .F.
EndIf


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 5/22/2006 11:44:44 AM
User is offlineDoru
160 posts
www.aquila.ro
5th




Re: definirea claselor
 (N/A) Modified By Doru  on 5/22/2006 11:47:26 AM)

Nu apelezi cu thisform pentru ca esti deja in obiectul mynav

if recno()=1
this.cmdfirst.enabled=.f.
endif

In alta ordine de idei nu e bine sa faci cu recno() pentru ca nu este asta primul totdeauna - in functie de ordonare. Se face cu ceva de genul:

skip -1
if BOF()
  this.cmdfirst.enabled=.f.
endif
skip

Edt:  :) pina apuc sa scriu apare un raspuns mai rapid.


Cristian Tenea
Aquila
 5/22/2006 12:20:30 PM
User is offlineanonymous
0 posts


Re: definirea claselor
 (N/A)
O singura remarca as avea de facut:

chestia cu
skip -1
if bof()

este destul de problematica, daca, de ex, nu am nici o inregistrare. Fiind deja pe BOF, skip -1 imi va da um mesaj de eroare.
De aceea eu as merge pe o functie care sa imi zica daca sunt sau nu pe prima inregistrare

function isFirstRecord()
if bof()
return .t.
else
skip -1
if bof()
return .t.
endif
endif
skip
return .f.
endfunc
 5/22/2006 12:27:11 PM
User is offlineedyshor
1450 posts
1st




Re: definirea claselor
 (Romania) Modified By edyshor  on 5/22/2006 12:28:58 PM)
nu inteleg prea bine ce vrei sa faci .. dar tine minte ca "thisform" reprezinta formul in care se afla obiectul (suportul cel mai de jos) iar "this" reprezinta obiectul in care te afli in mom respectiv ..
in cazul tau daca modififci metoda "refresu" a obiectului "mynav" (clasa) e de preferat sa folosesti this cand vrei sa te referi la obiectul respectiv:
 
Select(this.tabela)
If RecNo()=1 then 
   this.cmdfirst.enabled=.f.
endif
 
alternativ:
 
select(this.tabela)
this.cmdFirst.enabled= (recno()>1)   && .T./.F.
this.cmdPrev.enabled= (recno()>1)  
this.cmdNext.enabled= (recno()<reccount())
this.cmdLast.enabled= (recno()<reccount())
this.txtRecno.value=recno()            && un textbox intre butoane (daca folosesti container) care arata recno-ul curent ;)
 
totusi .. gandeste-te la recno() ala .. daca ai un order pe un index o sa zapacesti utilizatoru, iar inregistrarile sterse ?!
e un inceput totusi :)
 
nu te intereseaza ce nume o sa aiba pe form nav1, nav2, nav100 .. "this" se refera la el ca obiectul curent
din "cmdFirst.Click()" de ex daca vrei sa te referi la mynav folosesti "parent", cmdFirst fiind copilul lui mynav:
 
*cmdFirst.Click()
select(this.parent.tabela)
go top
this.parent.refresu()
*-
 
in clase trebuie sa fii flexibil .. nu sti daca il vei pune pe un form, intr-un container sau intr-un pageframe, nu sti cum o sa se numeasca parintele (Form1, FormView, FormNav, CntView, etc) iar daca vrei sa expui o valoare  pe care s-o folosesti ulterior, considera folosirea unei proprietati gen "mynav.currentrecno". si mai interesant e ca poti sa incapsulezi un eveniment in calasa ta, o metoda, "mynav.on_recnochange()" pe care o apelezi in codul unde se schimba recno-ul de ex (cmdFirst.Click(), cmdPrev.Click(), etc).
in metoda o sa pui cod acolo unde folosesti clasa, in form sau in container,  in felul acesta poti "prinde" cand se schimba recno-ul si executa ce cod ai nevoie pentru form sau alte obiecte din form
 
sper sa-ti fie de ajutor :)
have fun ..
 
Edit: wow! cate raspunsuri au aparut :) ce sa-i faci daca fac mai multe odata (sunt la servici) si nu pot sa-l scriu mai repede .. sper ca ai inteles totusi :)
 5/22/2006 12:44:34 PM
User is offlineedyshor
1450 posts
1st




Re: definirea claselor
 (Romania)
 camsambora wrote
function isFirstRecord()
   if bof()
      return .t.
   else
      skip -1
      if bof()
         return .t.
      endif
   endif
   skip
   return .f.
endfunc
 
dc legi de functie si navigarea ?! (skip) si apoi observ ca te duci un pas inainte sa fii sigur ca nu esti la inceput dar apoi nu te mai intorci inapoi, ci ii dai doar return .t., considera urmatorul:
 
*-
local lval
if bof() then
   lval=.t.         && sunt la inceput si n-am mutat cursorul
else
   skip -1        && ma duc un pas inaint
   lval=bof()    && sunt sau nu la inceput ?!
   skip             && ma intorc inapoi
endif
return lval       && intorc rezultatul
*-
 
doar o parere :D
 5/22/2006 1:51:06 PM
User is offlineAlin Berce
371 posts
3rd




Re: definirea claselor
 (Romania)
wow ce de raspunsuri!
Oke, m-am lamurit! Back to the old drawing board.
Va Multumesc tututor pentru timpul acordat!

Am mai facut o clasa care este un toolbar care o dockez in partea de jos a ecranului. Acest toolbar se redimensioneaza dupa rezolutia windowsului, am pe el un editbox redimesionat sa fie vizibile 2 randuri - si inca doua textboxuri in care afisez data curenta si ceasul si un buton de iesire.

Clasa asta vreau sa o pornesc in main-ul aplicatiei si e vizibila tot timpul. Toate bune pana aici, in editbox care e readonly afisez diferite informatii despre ce fac anumite controale de pe formuri... un fel de statusbar. Acum ceea ce nu stiu eu daca se poate face e: in momentul in care sunt prin meniu pot afisa pe aceasta bara de stare informatii despre aceasta optiune din meniu? De exemplu daca in meniu am optiunea Furnizori in bara de stare sa imi apara: "Administrarea catalogurlui de furnizori".
Clasa am pornit-o initial in main cu
set classlib to 'D:\Projects\clase\tool'
statusbar=createobject('tool')
statusbar.show()

Cand sunt intr-un form la mousemove pun:
statusbar.editbox.value='ceva mesaj informativ' si merge. Dar cum fac in cazul meniului... ?


VFP, C#, SQL Server 2005/2008
"Proud to be a ProFox member".
 5/22/2006 3:01:29 PM
User is offlineDoru
160 posts
www.aquila.ro
5th




Re: definirea claselor
 (N/A)
 edyshor wrote
 camsambora wrote
function isFirstRecord()
   if bof()
      return .t.
   else
      skip -1
      if bof()
         return .t.
      endif
   endif
   skip
   return .f.
endfunc
 
dc legi de functie si navigarea ?! (skip) si apoi observ ca te duci un pas inainte sa fii sigur ca nu esti la inceput dar apoi nu te mai intorci inapoi, ci ii dai doar return .t., considera urmatorul:
 
*-
local lval
if bof() then
   lval=.t.         && sunt la inceput si n-am mutat cursorul
else
   skip -1        && ma duc un pas inaint
   lval=bof()    && sunt sau nu la inceput ?!
   skip             && ma intorc inapoi
endif
return lval       && intorc rezultatul
*-
 
doar o parere :D

Fox-ul are o comportare ciudata in cazul BOF, EOF; si sint si diferite comportarile.

Chiar daca esti pe prima inregistrare BOF nu intoarce T . Numai daca dai un skip -1 BOF va intoarce .T. dar pointerul de inregistrare nu se muta o pozitie in sus. Incearca urmatoarele:

go top
?recno()
?BOF()
skip -1
?recno()
BOF()

recno-urile vor fi identice. In cazul aceluiasi test pe sfirsitul fisierului recno nu va mai fi identic dar EOF() tot nu intoarce .T. dupa un go bottom. Concluzia ar fi ca dupa un test de BOF in caz ca este BOF()=.T. nu mai trebuie sa dai un skip 1 pentru ca in felul asta ajungi pe a doua inregistrare.


Cristian Tenea
Aquila
 5/22/2006 3:50:16 PM
User is offlineGrigore Dolghin
3590 posts
www.class-software.eu
1st






Re: definirea claselor
 (Romania)
Nu sunt sigur ca se poate intercepta miscarea mouse-ului pe meniu. Instructiunea DEFINE PAD (cea care este folosita si de builderul de meniuri) are clauza MESSAGE, care permite afisarea unui mesaj, dar afisarea aia se duce DIRECT in status bar-ul VFP. Sugestia mea ar fi sa folosesti chiar status bar-ul VFP pentru afisarea mesajelor.
Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 5/22/2006 4:03:06 PM
User is offlineDorin Vasilescu
1366 posts
1st




Re: definirea claselor
 (Romania)
 Alin B. wrote

Cand sunt intr-un form la mousemove pun:
statusbar.editbox.value='ceva mesaj informativ' si merge. Dar cum fac in cazul meniului... ?



Eu as zice sa folosesti un flag daca nu ai MouseEnter/MouseLeave
IF not this.{flag}
    statusbar.editbox.value='ceva mesaj informativ'
ELSE
    this.{flag} = ...
ENDIF

Altfel ai sansa sa vezi clepsidra pe durata miscarii mausului peste control

Referitor la meniu, e mai complicat. Cu VFP9 se poate face BINDEVENT() pe WM_ENTERIDLE

Altfel, se poate rezolva cu un timer care sa verifice _vfp.StatusBar si sa-l schimbe, daca e nevoie.

 5/22/2006 4:21:39 PM
User is offlineedyshor
1450 posts
1st




Re: definirea claselor
 (Romania)
 Doru wrote
recno-urile vor fi identice. In cazul aceluiasi test pe sfirsitul fisierului recno nu va mai fi identic dar EOF() tot nu intoarce .T. dupa un go bottom. Concluzia ar fi ca dupa un test de BOF in caz ca este BOF()=.T. nu mai trebuie sa dai un skip 1 pentru ca in felul asta ajungi pe a doua inregistrare.
mda .. cam ai dreptate :) .. mersi.
 5/23/2006 10:23:43 AM
User is offlineanonymous
0 posts


Re: definirea claselor
 (N/A)
Functia cu pricina am luat-o dintr-o aplicatie de a mea, deci teoretic ar trebui sa functioneze OK.
Cit despre modul cum se comporta fox-ul, prefer sa nu comentez ... ideea este sa il faci sa iti rezolve tie problemele.
  Visual FoxPro  Clase - VCX si PRG  definirea clase...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement