Metodo o funcion para Habilitar/Deshabilitar Controles en un form

3,062 views
Skip to first unread message

Fox Learner

unread,
Jul 28, 2012, 11:17:48 PM7/28/12
to publice...@googlegroups.com
Mi pregunta es la siguiente:

¿Cuales son las formas recomendadas para habilitar y desabilitar controles en un form?..

He pensado en lo siguiente:

1. Ver si existe un metodo donde esto se pueda hacer e invocarlo sin mas.

Veo que hay un método setAll(), pero no sé si este funcione o sea el indicado con forms.

2. Crear una funcion cuyo alcance sea este formulario. En que método tendría que crear esa funcion?..

Se me ocurre que esa función tenga 2 banderas, algo como si se retorna 0, deshabilite los controles y si se retorna 1, los habilite.

Existe algo ya creado para esto, de tal forma que no esté "inventando la rueda"? jeje

Gracias anticipadas!

Nilton CPM

unread,
Jul 28, 2012, 11:35:40 PM7/28/12
to publice...@googlegroups.com
Tenho uma propriedade do formulário chamada ‘operacao’ essa pode ter os seguintes valores:
I = Inclusão
A = Alteração
E – Exclusão
ou em branco.
 
Depois tenho um metodo chamado Status_Campo, dentro desse metodo vou mudar a propriedade Enabled de cada campo vai ser .T. ou .F. dependendo do conteudo da propriedade ‘operacao’.
--
 
 
 

idalberto

unread,
Jul 29, 2012, 12:02:48 AM7/29/12
to publice...@googlegroups.com
Hola
 
Prueba con algo como esto
 
with thisform
    .setall('enabled',.f.,'textbox')
    .setall('enabled',.f.,'commandbutton')
    .setall('enabled',.f.,'ribbonspinner')
    .setall('enabled',.f.,'ribboncombo')
    .setall('enabled',.f.,'_datepicker')
    .setall('enabled',.f.,'ribbonbuttonv')
    .setall('enabled',.f.,'ribboncombo')
  
endwith
 
Saludos.
Idalberto Gonzalez

Fox Learner

unread,
Jul 29, 2012, 12:07:24 AM7/29/12
to publice...@googlegroups.com
Obrigado amigo Nilton pela sugestão.

Saudações!

Fox Learner

unread,
Jul 29, 2012, 12:55:37 AM7/29/12
to publice...@googlegroups.com
Gracias idalberto, me queda la duda de como volver privada una funcion para que pueda ser llamada dentro del código de cada control del form.

Y si uso metodos en vez de una funcion, qué metodo podría llamar para hacer esa deshabilitacion?  que metodo sería el recomendable para habilitar?..

Activate ? Refresh?

O recomiendas poner 2 banderas en el activate?

Saludos!

idalberto

unread,
Jul 29, 2012, 1:23:57 AM7/29/12
to publice...@googlegroups.com
Hola
Es que segun lo que entiendo que quieres hacer, no es necesario complicarlo con funciones u otras cosas, simplemente habilitas y deshabilitas cuando lo consideres necesario.
 
1.- para deshabilitar, pones en el evento(metodo) que necesites hacerlo algo como lo siguiente:
 
En el init (por ejemplo) del formulario pones
 
with thisform
    .setall('enabled',.f.,'textbox')
    .setall('enabled',.f.,'commandbutton')
    .setall('enabled',.f.,'ribbonspinner')
endwith
 
thisform.refresh()
 
Para habilitar un control deshabilitado de la clase textbox  pones lo siguiente
 
thisform.textbox1.enabled=.T.
thisform.refresh()
 
y se quedan los demas textbox deshabilitados.
 
 
 
2.- para habilitar, pones en el evento(metodo) que necesites hacerlo algo como lo siguiente:
 
En el init (por ejemplo) del formulario pones
 
with thisform
    .setall('enabled',.t.,'textbox')
    .setall('enabled',.t.,'commandbutton')
    .setall('enabled',.t.,'ribbonspinner')
endwith
 
thisform.refresh()
 
Para deshabilitar un control habilitado de la clase textbox  pones lo siguiente
 
thisform.textbox1.enabled=.F.
thisform.refresh()
 
y se quedan los demas textbox habilitados.
 
Espero haber entendido tu inquietud, sino es asi disculpame y seguimos intentandolo.
Saludos.
Idalberto Gonzalez.
 

Fox Learner

unread,
Jul 29, 2012, 1:36:20 AM7/29/12
to publice...@googlegroups.com
Gracias Idalberto,

Así era, como dices. Solo que acostumbro llamar a un método para evitar poner manualmente las propiedades.

Pero ya lo resolví con 2 simples banderas en un case, aunque pensé que podía llamar al metodo setall así thisform.setall() para que ejecute el código que se halle en ese método, pero no mas no funciona. Si funciona si se hace directo, poniendo manualmente los valores en el metodo, pero no al llamarlo.

Me quedará algo así:

Evento Init del form

Release gcStatus
PUBLIC gcStatus
Store "A" to gcStatus


Evento Activate del form

DO CASE

   CASE gcStatus="A"
 
with thisform
                 .setall('enabled',.f.,'textbox')
                 .setall(Etc)
endwith
    
    CASE gcStatus="B"
    
with thisform
    .setall('enabled',.t.,'textbox')
     .setall(Etc)
endwith
    
ENDCASE


Evento Click del Comand "Modificar Datos"

store "B" to gcStatus
Thisform.Activate()

Como ves, nada mas cambio la bandera a "B" y llamo al metodo Activate y ese metodo aceptará el nuevo valor de la bandera gcStatus

De todos modos, siento que el Activate no es el metodo nativo para hacer eso..

Gracias de nuevo!

Julián W. May D.

unread,
Jul 29, 2012, 5:15:39 AM7/29/12
to publice...@googlegroups.com
Bueno crea un método y tu ahí decides que controles deshabilitaras o habilitaras cuando los necesites 

Método 
 Hd que sería igual a habilitar deshabilitar 

En el método  le pasas un parámetro 
LPARAMETERS tlEstado 
WITH THISFORM 
   .control1.Enabled = tlEstado 
   .control2.Enabled = tlEstado 
   .controln.Enabled = tlEstado 
ENDWITH  


y cuando quiera invocarlo solamente harías 
WITH THISFORM  
  .Hd(.F)   Aquí solo pondrías .T. o .F. en su caso 
ENDWITH  


Saludos :D 

Luis Maria Guayan

unread,
Jul 29, 2012, 8:26:34 AM7/29/12
to publice...@googlegroups.com
Lo puedes hacer de muchas formas de acuerdo a lo que necesites, pero lo mejor es crear un método en tu formulario por ejemplo _EnabledTextBox()

y en el método escribes lo siguiente para el caso de utilizar SetAll()

LPARAMETERS tlEnabled
ThisForm.SetAll("Enabled", tlEnabled, "TextBox")

Cuando quieres habilitar todos los TextBoxes llamas:

ThisForm._EnabledTextBox(.T.)

Cuando quieres deshabilitar todos los TextBoxes invocas:

ThisForm._EnabledTextBox(.F.)



Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 

idalberto

unread,
Jul 29, 2012, 9:52:12 AM7/29/12
to publice...@googlegroups.com
Hola
 
No es recomendable  ponerlo en el activate, crea un metodo nuevo "mimetodo" , escribe en el tu codigo y cada vez que necesites cambiar el estatus de los controles entonces escribe algo como esto:
 
thisform.mimetodo()
 
 
Saludos.
Idalberto Gonzalez.

Carlos Miguel FARIAS

unread,
Jul 29, 2012, 2:20:01 PM7/29/12
to publice...@googlegroups.com
Si en lugar de deshabilitar/habilitar un control, podes usar el metodo when, y cambia como se ve el control.
Saludos: Miguel, La Pampa (RA)

--
 
 
 

Guillermo MDQ

unread,
Jul 29, 2012, 2:28:09 PM7/29/12
to publice...@googlegroups.com
Yo en mis formularios de ingreso de datos tengo una propiedad llamada .pOpcion y un metodo llamad acuerdo consulta.
Despues tengo los  botones basicos que son Ingresar, Modificar, Anular, Buscar y Salir, que estan visibles solo en modo consulta y Grabar y Cancelar visibles en modo edicion.
En el evento click de los botones cambio el valor de la propiedad pOpcion de acuerdo al numero de orden del boton cliqueado y llamo al metodo ActivaControles:
Es muy sencillo el funcionamiento. Espero te sirva la idea.

**ActivaControles

With This
    .Closable=IIF(.pOpcion=0,.T.,.F.)
    .SetAll("Enabled",IIF(.pOpcion=0,.F.,.T.),"TextBox") 
    .SetAll("Enabled",IIF(.pOpcion=0,.F.,.T.),"CheckBox") 
    .SetAll("Enabled",IIF(.pOpcion=0,.F.,.T.),"ComboBox") 

    .cmdIngresar.visible=IIF(.pOpcion=0,.T.,.F.)
    .cmdModificar.visible=IIF(.pOpcion=0,.T.,.F.)
    .cmdAnular.visible=IIF(.pOpcion=0,.T.,.F.)    
    .cmdBuscar.visible=IIF(.pOpcion=0,.T.,.F.)    
    .cmdSalir.visible=IIF(.pOpcion=0,.T.,.F.)    
    .cmdGrabar.visible=IIF(.pOpcion=0,.F.,.T.)    
    .cmdCancelar.visible=IIF(.pOpcion=0,.F.,.T.) 
Endwith

Saludos
Guillermo

Guillermo MDQ

unread,
Jul 29, 2012, 2:32:57 PM7/29/12
to publice...@googlegroups.com
Perdon pero salio mas escrita la primer linea de mi comentario, es asi:

Yo en mis formularios de ingreso de datos tengo una propiedad llamada .pOpcion y un metodo llamado ActivaControles().

Saludos
Guillermo

Fox Learner

unread,
Jul 30, 2012, 9:50:52 AM7/30/12
to publice...@googlegroups.com
Gracias compañeros. Me queda claro que hay mejores opciones como: crear un método, crear una propiedad, y utilizar el metodo when. Saludos!

Claudio Luna

unread,
Jul 30, 2012, 10:05:15 AM7/30/12
to publice...@googlegroups.com
Hola,

Fox Learner,

Particularmente lo que hago para esto es lo siguiente.
Tengo  una propiedad nEstado en mis formularios, la cual tiene un metodo assign
asociado dentro del mismo hago la habilitación/deshabilitación de los controles.
El mismo se ejecuta cada vez que asignas un valor a la propiedad por lo tanto si estoy navegando en mis datos tengo algo como :
do case
case  nEstado = 0
    *deshabilito los controles
case nEstado = 1
    * habilito los controles
endcase
Lo único que tenes que hacer es cambiar la propiedad nestado = el nuevo valor y ahí se va a ejecutar el código que tengas en el metodo assign de dicha propiedad.

Espero que te sirva

Saludos

Claudio


El 30 de julio de 2012 10:50, Fox Learner <thenewin...@gmail.com> escribió:
Gracias compañeros. Me queda claro que hay mejores opciones como: crear un método, crear una propiedad, y utilizar el metodo when. Saludos!

--
 
 
 

Fox Learner

unread,
Jul 30, 2012, 10:40:06 AM7/30/12
to publice...@googlegroups.com
Gracias Ing. Claudio. Muy amable en compartir lo del método assign. Saludos!

Andrés Oscar Gimbatti

unread,
Aug 4, 2012, 8:17:59 AM8/4/12
to publice...@googlegroups.com
yo uso esta forma, te desliga de si es herencia de alguna otra clase o el tipo de control que sea.

PARAMETERS tlEstado

FOR I = 1 TO .CONTROLCOUNT
.CONTROLS(I).ENABLED = tlEstado
ENDFOR

*Aca habilito por ejemplo si tengo una barra de botones de navegacion del form que nunca debe deshabilitarse

Usar en el metodo When de los controles RETURN thisform.estado (donde estado es la propiedad que maneja si habilita o no) esta bueno y sencillo tambien pero tiene el problema de los editbox que no te deja recorrerlos sino se ve todo el texto en pantalla.

Mira el método thisenabled de las clases foxribbon, te va a dar una muy buena idea de como hacerlo.

Saludos

Fox Learner

unread,
Aug 4, 2012, 10:44:50 PM8/4/12
to publice...@googlegroups.com
Interesante! Ahora veo que las opciones abundan. Hay desde las ligas colegiales hasta las ligas mayores jeje

Saludos!
Reply all
Reply to author
Forward
0 new messages