Search  
Wednesday, January 20, 2021 ..:: 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  enable/disable ...
 enable/disable toate obiectele
 
 2/8/2006 5:29:42 PM
User is offlineAdrian Gerlan
608 posts
1st




enable/disable toate obiectele
 (Romania)
Se poate face enable sau disable la toate obiectele dintr-un form fara sa le enumar explicit ?
AdiG
 2/8/2006 5:40:22 PM
User is offlineGrigore Dolghin
4001 posts
www.class-software.ro
1st






Re: enable/disable toate obiectele
 (Romania)

Nu, din pacate. Form-ul are o proprietate numita Objects, care contine un array care pointeaza catre obiectele din form, dar este limitat la nivelul formului. Concret, daca ai un form cu un pageframe, care are doua pagini cu 'jdemii de textboxuri, Form.Objects.Count intoarce 1 (pageframe-ul). Pageframe-ul are si el o proprietate Objects, care contine referinte catre cele doua pagini, care la randul lori au Objects cu referinte catre controalele din ele, evident, cu aceeasi limitare: daca alea sunt si ele containere, va trebui sa scarmeni colectia lor Objects. Si asa mai departe.

Asta se rezolva relativ usor cu o metoda recursiva. Stii care-i treaba cu recursivitatea? O scrii singur, sau astepti pana ajung eu acasa si-ti dau una gata facuta?


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 2/8/2006 5:57:45 PM
User is offlineAdrian Gerlan
608 posts
1st




Re: enable/disable toate obiectele
 (Romania)
Astept. Merci.
AdiG
 2/8/2006 7:25:35 PM
User is offlineanonymous
0 posts


Re: enable/disable toate obiectele
 (N/A)
Poti sa faci:
    THISFORM.SETALL( "Enabled", .F.)
sau
    THISFORM.SETALL( "Enabled", .T.)

 2/8/2006 8:13:43 PM
User is offlineAdrian Gerlan
608 posts
1st




Re: enable/disable toate obiectele
 (Romania)
Suuuper! Multam fain. Este perfect asa.
AdiG
 2/8/2006 11:31:34 PM
User is offlineGrigore Dolghin
4001 posts
www.class-software.ro
1st






Re: enable/disable toate obiectele
 (Romania)

**********************************************************************
* Program....: B-Bizo_BIZOBJ.ScanControls
* Version....:
* Author.....: Grigore Dolghin ::
mailto:gdolghin@yahoo.com
* Date.......: 06 February 06, 11:50:20
* Notice.....: Copyright © 2006, Class Software.
* Compiler...: Visual FoxPro 09.00.0000.3504 for Windows
* Abstract...:
* Changes....: Administrator, Created 06 February 06/11:50:20
* Parameters.:
* Called by..:
* Purpose....: Recursive method - adds all controls used for dataentry
* ...........: in container received as parameter to an array.
* ...........: The array will be used to fill the controls with data.
**********************************************************************
Lparameters
toContainer

Local
;
   oControl As Object
, ;
   
lcControlBaseClass As String


With This
   For Each
oControl In toContainer.
Objects
      
lcControlBaseClass = Upper(oControl.BaseClass
)
      
If InList(lcControlBaseClass, "COLUMN", "COMMANDGROUP", "CONTAINER"
, ;
         
"CUSTOM", "FORM", "GRID", "OPTIONGROUP", "PAGE", "PAGEFRAME", "TOOLBAR"
)
         .
ScanControls(oControl
)
      
Else
         *-- Codul tau aici.
      EndIf
   EndFor
EndWith

Mecanismul e urmatorul: se apeleaza metoda asta pasandu-i ca parametru un container (de exemplu. form-ul insusi). Metoda ia la rand toate controalele de pe form, si daca vreunul dintre ele este container, se apeleaza pe ea insasi, pasand ca parametru containerul respectiv. In felul acesta toate sunt scanate toate containerele de la primul pana la ultimul nivel; daca metoda da peste controale care nu sunt containere, se executa codul din Else (*-- Codul tau aici).

Avantajul acestei abordari fata de SetAll este ca poti face orice, nu doar sa setezi o proprietate.


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 2/9/2006 1:16:00 AM
User is offlinerlutia66
229 posts
4th




Re: enable/disable toate obiectele
 (N/A)
Eh DA! Uite o chestie faina!

Vroiam si eu sa spun ca am avut si eu nevoie de perpetuare in cascada a activarii/dezactivarii controalelor.
De aceea, in baseclass-ul meu, la clasele de containere pe care le-ai enumerat f frumos in cod, Grig, eu am adaugat proprietatea EnabledAll si VisibleAll impreuna cu metodele trap EnabledAll_assign si VisibleAll_assign care transmiteau la pui noile valori pt Enable sau Visible  prin perechea:
    This.SetAll('enabled',newValue)
    This.SetAll('enabledall','newvalue')


Oricum, inteleg ca tu, Adi, nu ai probleme cu containere in form, odata ce ti-ai facut treaba cu simplul SetAll(), dar e bine de stiut.


Rares

Rares LUTIA
Matricia Solutions
 2/9/2006 2:40:32 AM
User is offlineGrigore Dolghin
4001 posts
www.class-software.ro
1st






Re: enable/disable toate obiectele
 (Romania)

Eu prefer metoda asta pentru ca am control asupra operatiunii efectuate asupra controlului.

Da-mi voie sa explic:

Texbox-ul are .Enabled si .ReadOnly. Editbox-ul are .Enabled si .ReadOnly.

ThisForm.SetAll("Enabled",.F.) le dezactiveaza pe amandoua. Problema e ca un editbox inactiv nu raspunde la click-ul pe barele de derulare. Cu alte cuvinte, nu poti sa modifici ce e in el, dar nici nu poti sa-l derulezi ca sa citesti ce scrie, chestie care e cel putin deranjanta, ca sa ma exprim dulce.

Asta inseamna ca SetAll() ar trebui sa faca lucruri diferite, functie de clasa obiectului la care se aplica. Sigur, asta se poate face executand mai multe SetAll(), ca in exemplul urmator:

ThisForm.SetAll("Enabled",.F.,"Textbox")
ThisForm.SetAll("ReadOnly",.T.,"EditBox")

Buuuun. Parametrul al treilea este numele clasei. Well.... eu unul nu folosesc clasa "Textbox", ci A_TextBox, A_NoEntryTextBox, s.a.m.d. Ce fac acuma? Ma apuc sa scriu atatea SetAll()-uri cate clase am eu in classlib? pai... nu stiu daca le folosesc pe toate in form-ul respectiv. Mai mult, nici nu vreau sa stiu. Codul de activare/dezactivare ar trebui sa fie independent de continutul efectiv al formului, ca maine-poimaine mai inventez vreo clasa textbox, o pun pe form, uit sa adaug un SetAll si s-a dus naibii toata mustaria.

Toate textbox-urile au o proprietate care nu se schimba, indiferent de cum le subclasezi: proprietatea .BaseClass, care contine textul "TextBox". Ar fi fost frumos daca as fi putut sa-l conving pe SetAll() sa lucreze cu BaseClass, nu cu Class, dar deh, asta e - nu se poate.

So... back to the roots. Algoritmi :) O metoda recursiva, scaneaza toata povestea si-mi da mie control. Concret, in codul din mesajul meu anterior, partea *-- codul tau aici ar putea arata asa:

Do Case
   Case lcControlBaseClass = "TextBox"
      oControl.Enabled = llEnabled && unde llEnabled contine .T. sau .F., functie de context
   Case lcControlBaseClass = "EditBox"
      oControl.ReadOnly = Not llEnabled && ca readonly e pe "invers" fata de enabled
EndCase

In plus, pot sa fac si alte operatiuni, de exemplu sa apelez o metoda de undeva. Sau orice-mi trece mie prin cap sa fac.


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 2/9/2006 2:52:04 AM
User is offlinerlutia66
229 posts
4th




Re: enable/disable toate obiectele
 (N/A)
Cum spuneam, Grig - e faina treaba!!

Intrebare: cum as putea sa parametrizez si partea *-- codul tau aici ??


Rares

Rares LUTIA
Matricia Solutions
 2/9/2006 3:08:56 AM
User is offlineDaniel Buduru
3525 posts
1st




Re: enable/disable toate obiectele
 (N/A)

Am folosit o vreme in framework metoda recursiva, din aceleasi considerente - editbox, label, etc.

Acum am abordat aceasta problema in clasele de baza. Fiecare clasa are o proprietate EditMode si o proprietate EnabledMode. Unele clase mai au o proprietate DisabledReadOnly.
In EditMode_assign am urmatorul cod:

Lparameters tuNewValue
With This
   
.editmode = tuNewValue
   
If .Style= 0
      
If .lDisabledReadOnly
         
If !.Enabled
            
.Enabled=.T.
         
Endif
         
.ReadOnly=;
            I
case(.EnabledMode=1,!.editmode, ;
                  .EnabledMode=2,.editmode, ;
                  .EnabledMode=3, .T.,;
                  .
ReadOnly)
      
Else
         
.Enabled=;
            
Icase(.EnabledMode=1, .editmode, ;
                  .EnabledMode=2,!.editmode,;
                  .EnabledMode=3, .F.,;
                  .
Enabled)
         
If .Enabled And .ReadOnly
            
.ReadOnly=.F.
         
Endif
      Endif
   Endif
Endwith

EnabledMode=0 - controlul se comporta ca si clasa de baza
EnabledMode=1 - controlul este Enabled in EditMode=.t.
EnabledMode=2 - controlul este Disabled in EditMode=.t.
Daca este setat lDisabledReadOnly, atunci controlul este ReadOnly in loc de Disabled. Util ata pentru scroll in editbox, cat si pentru a putea face select/copy din textbox/editbox .

La controalelele care nu au proprietatea ReadOnly codul din EditMode_Assign este urmatorul:

Lparameters tuNewValue
With This
   
.EditMode = m.tuNewValue
   .
Enabled=Icase(.EnabledMode=1,m.tuNewValue, .EnabledMode=2, !m.tuNewValue, .T.)
Endwith

Metoda asta permite specificarea comportamentului la nivelul fiecarui control in parte si este mai flexibila decat specificarea in cod. Ma refer aici la tratarea exceptiilor, respectiv acele controale care ar trebui sa fei excluse din SetAll.


Daniel Buduru
 2/9/2006 3:11:51 AM
User is offlineGrigore Dolghin
4001 posts
www.class-software.ro
1st






Re: enable/disable toate obiectele
 (Romania)

Hmm... nu sunt sigur ca am inteles intrebarea, dar o sa incerc un raspuns, totusi:

*-- Activez/dezactivez DataEntry pe form, functie de un checkbox:
ThisForm.ScanControls(ThisForm, ThisForm.Checkbox.Value)

*-- Metoda ScanControls:
LParameters toContainer, tlEnable
*--- codul de scanare, pana la locul cu pricina
If lcControlBaseClass = "Textbox"
   oControl.Enabled = tlEnable
Endif


Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 2/9/2006 9:10:50 AM
User is offlinerlutia66
229 posts
4th




Re: enable/disable toate obiectele
 (United Kingdom)
Hehe...
Nu Grig, asta inseamna (daca inteleg bine) sa ma duc la fiecare container sa ii adaug bucatica de cod la design... Nu zic, merge, dar poate merge si mai bine:

Intrebarea era daca se poate, si daca da, cum? sa apelez metoda scancontrols cam in maniera asta:

TEXT TO lcExecuteThis NOSHOW
If lcControlBaseClass = "Textbox"
   oControl.Enabled = tlEnable
Endif

ENDTEXT

ThisForm.ScanControls(ThisForm, &lcExecuteThis)

Nu stiu daca am fost mai clar acum...

Rares

Rares LUTIA
Matricia Solutions
 2/9/2006 9:24:40 AM
User is offlineGrigore Dolghin
4001 posts
www.class-software.ro
1st






Re: enable/disable toate obiectele
 (Romania)

Pai... ai ExecScript(), care o sa execute orbeste ceea ce primeste intr-o variabila. Asta inseamna ca ar trebui sa arate cam asa:

Text To lcExecuteThis NoShow
..... aici e neschimbat
EndText

Metoda .ScanControls:

LParameters toContainer, tcCommandsList
......
If lcContrlBaseClass = "TextBox"
   ExecScript(tcCommandsList)
EndIf

Grigore Dolghin
Visual FoxPro MVP 2006 - 2010
Class Software
My blog
 3/19/2013 9:51:11 PM
User is offlinelmax25
204 posts
4th


Re: enable/disable toate obiectele
 (N/A)
Imi puteti da va rog un exemplu functionabil pentru a afla numele tuturor obiectelor dintr-un form ? (Nu am reusit sa implementez metoda de mai sus) Va multumesc !
 3/20/2013 8:45:35 AM
User is offlinecostin_mentor
748 posts
www.accessoft.ro
1st




Re: enable/disable toate obiectele
 (N/A)
Inainte de If-ul lui Grig: "If InList(lcControlBaseClass, "COLUMN", "COMMANDGROUP", "CONTAINER", ;
         
"CUSTOM", "FORM", "GRID", "OPTIONGROUP", "PAGE", "PAGEFRAME", "TOOLBAR"
)
"
pune:
?oControl.Name
sau
Messagebox(oControl.Name)

  Visual FoxPro  Cod, sintaxa si comenzi  enable/disable ...

Search  Forum Home         

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement