In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Controles con lEditable := .F. no hace ni caso

Foro de Xailer profesional en español
Responder
Avatar de Usuario
bingen
Mensajes: 565
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por bingen »

Cosa curiosa si pongo controles con lEditable := .F. por código antes de hacer un ShowModal

aControls[ nControl ]:lEditable := .F.
No me hace ni caso siguen siendo editables, pero por ejemplo con
aControls[ nControl ]:lEnabled := .F.
funciona perfectamente.
Que puede ser ???
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9259
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por ignacio »

Buenas tardes,
Acabo de modificar el primer ejemplo de DataControls con el siguiente código:
METHOD FormInitialize( oSender ) CLASS TForm1
SET EPOCH TO 1950
::oDbfDataSet1:AddCalcField( "FIRSTLAST", {|o| FirstLast( o ) } )
::oDBEdit1:lEditable := .f.
RETURN Nil
Y ha funcionado perfectamente.
Espero que puedas decirnos como reproducir el error con ese mismo ejemplo. Gracias de antemano.
Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
bingen
Mensajes: 565
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por bingen »

Gracias Ignacio, es muy fácil de probar. Tengo esta función que te adjunto que es de uso general para cualquier form u otro control contenedor y que hasta ahora he usado siempre con lEnabled:=.F. sin problemas pero algunos clientes no les gusta eso de ver las cosas en gris tenue y lo prefieren más visible pero no editable.
En el form hago
DisableControl( Self )
::ShowModal()
Y esta es la función.
//Desactivar los controles para no poder editarlos/utilizarlos salvo el botón de cancelar
FUNCTION DisableControl( oControl )
LOCAL aControls := oControl:aControls
LOCAL nControl := 0
FOR nControl := 1 TO Len( aControls )
IF Upper( aControls[ nControl ]:ClassName() ) $ "TBTNBMP TBUTTON"
IF aControls[ nControl ]:nModalResult = mrOK
aControls[ nControl ]:lVisible := .F.
ELSEIF aControls[ nControl ]:nModalResult = mrCANCEL
aControls[ nControl ]:lVisible := .T.
ELSE
aControls[ nControl ]:lEnabled := .F.
ENDIF
ENDIF
IF "EDIT" $ Upper( aControls[ nControl ]:ClassName() ) .OR. "COMBOBOX" $ Upper( aControls[ nControl ]:ClassName() ) ;
.OR. "CHECKBOX" $ Upper( aControls[ nControl ]:ClassName() ) .OR. "DATE" $ Upper( aControls[ nControl ]:ClassName() ) ;
.OR. "RADIO" $ Upper( aControls[ nControl ]:ClassName() ) .OR. "MEMO" $ Upper( aControls[ nControl ]:ClassName() ) ;
.OR. "RICH" $ Upper( aControls[ nControl ]:ClassName() ) .OR. "TOOLBAR" $ Upper( aControls[ nControl ]:ClassName() )
Try
aControls[ nControl ]:lEditable := .F.
Catch
aControls[ nControl ]:lEnabled := .F.
End
ELSE
Try
DisableControl( aControls[ nControl ] )
Catch
END
ENDIF
NEXT
RETURN NIL
BiSoft Desarrollo de software profesional
http://www.bisoft.es
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Controles con lEditable := .F. no hace ni caso

Mensaje por joselalinf »

Bingen,
imagina que añades al formulario un control TMyCalendar que desciende de
TEdit. Tendrás que modificar el bucle for..next o no funcionará porque no
tiene "Edit" en el nombre y no lo detectará.
Es mejor hacerlo así­:
FOR EACH oCtl IN aControls
...
IF oCtl:IsKindOf( "TEdit" ) .OR.
oCtl:IsKindOf( "TComboBox" ) ...
...
NEXT
Saludos,
José Lalí­n
Avatar de Usuario
bingen
Mensajes: 565
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por bingen »

Muchas gracias José, con lo que me comentas he mejorado y reducido la función a esto, pero sigue sin hacer correctamente el lEditable:=.F. y en cambio si hace el lEnabled:=.F. Raro no?
//Desactivar los controles para no poder editarlos/utilizarlos salvo el botón de cancelar
FUNCTION DisableControl( oControl )
LOCAL aControls := oControl:aControls, oCtl
FOR EACH oCtl IN aControls
//Ocultar el botón Aceptar y desabilitar el resto salvo Cancelar
IF oCtl:IsKindOf( "TBtnBmp" ) .Or. oCtl:IsKindOf( "TButton" ) .Or. oCtl:IsKindOf( "TFlatBtn" ) .Or. oCtl:IsKindOf( "TGlassBtn" ) .Or. oCtl:IsKindOf( "TSplitButton" )
IF oCtl:nModalResult = mrOK
oCtl:lVisible := .F.
ELSEIF oCtl:nModalResult = mrCANCEL
oCtl:lVisible := .T.
ELSE
oCtl:lEnabled := .F.
ENDIF
Else
Try
If ValType(oCtl:aControls)="A"
DisableControl( oCtl )
Endif
Catch
* Try
* oCtl:lEditable := .F.
* Catch
oCtl:lEnabled := .F.
* End
End

Endif
NEXT
RETURN NIL
BiSoft Desarrollo de software profesional
http://www.bisoft.es
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Controles con lEditable := .F. no hace ni caso

Mensaje por joselalinf »

Bingen,
> Muchas gracias José, con lo que me comentas he mejorado y
> reducido la función a esto, pero sigue sin hacer
> correctamente el lEditable:=.F. y en cambio si hace el
> lEnabled:=.F. Raro no?
Sobre esto no puedo decirte nada porque no tengo mucha experiencia con los
DataControls.
> IF oCtl:IsKindOf( "TBtnBmp" ) .Or. oCtl:IsKindOf(
> "TButton" ) .Or. oCtl:IsKindOf( "TFlatBtn" ) .Or.
> oCtl:IsKindOf( "TGlassBtn" ) .Or. oCtl:IsKindOf(
> "TSplitButton" )
Esto puedes simplificarlo aún más con sólo :isKindOf( "TButton" ) puesto
que los otros botones TBtnbmp, TFlatBtn y TGlassBtn descienden de TButton y
por tanto isKindOf() devolverá .T. para ellos.
Saludos,
José Lalí­n
Avatar de Usuario
bingen
Mensajes: 565
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por bingen »

Muy cierto devuelve .T. para todos ellos, ya sabia que eran herencia pero es curioso que respondan .T. a su propio tipo y al tipo padre, desconocí­a esto.
Muchas gracias.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
joselalinf
Mensajes: 291
Registrado: Jue Ene 31, 2013 1:10 pm

Controles con lEditable := .F. no hace ni caso

Mensaje por joselalinf »

Bingen,
> Muy cierto devuelve .T. para todos ellos, ya sabia que eran
> herencia pero es curioso que respondan .T. a su propio tipo
> y al tipo padre, desconocí­a esto.
es precisamente para estos donde se le saca más partido.
Ayer pensé que quizás el problema que tienes sea por una incorrecta
ejecución del try/catch y quizás deberí­as usar el mismo método para todos
los controles:
IF oCtl:IsKindOf( "TButton" )
...
ELSEIF oCtl:IsKindOf( "TDataControl" )
lEditable := .F.
etc.
Saludos,
José Lalí­n
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5707
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por jfgimenez »

Bingen,
> Muy cierto devuelve .T. para todos ellos, ya sabia que eran
> herencia pero es curioso que respondan .T. a su propio tipo
> y al tipo padre, desconocí­a esto.
mí­ralo de esta forma:
CLASS Animal
CLASS Perro FROM Animal
CLASS Gato FROM Animal
Animal:Tipo -> "Animal"
Perro:Tipo -> "Perro"
Gato:Tipo -> "Gato"
Perro:EsUn( "Animal" ) -> SI
Perro:EsUn( "Perro" ) -> SI
Perro:EsUn( "Gato" ) -> NO
Animal:EsUn( "Animal" ) -> SI
Animal:EsUn( "Perro" ) -> NO
Y ahora cambia :Tipo por :Classname y :EsUn() por :IsKindOf() ;-)
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9259
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por ignacio »

lEditable sólo se tiene en cuenta antes de entrar en edición. Prueba con TDataControl:Lock()
Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
bingen
Mensajes: 565
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por bingen »

Si señor muy ilustrativo José, me recuerda a barrio Sesamo....
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Avatar de Usuario
bingen
Mensajes: 565
Registrado: Lun Jul 07, 2014 8:17 pm
Ubicación: Bilbao
Contactar:

Controles con lEditable := .F. no hace ni caso

Mensaje por bingen »

Muchas gracias Ignacio con TDataControl:Lock() ha funcionado perfectamente, cuanto se aprende de vosotros en un momento.
Salu2.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
Responder