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: 9256
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: 9256
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