Página 1 de 1

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

Publicado: Mar Mar 10, 2015 7:11 pm
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 ???

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

Publicado: Mar Mar 10, 2015 8:04 pm
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

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

Publicado: Mar Mar 17, 2015 10:31 am
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

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

Publicado: Mar Mar 17, 2015 1:04 pm
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

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

Publicado: Mar Mar 17, 2015 5:41 pm
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

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

Publicado: Mar Mar 17, 2015 8:35 pm
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

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

Publicado: Mié Mar 18, 2015 8:02 am
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.

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

Publicado: Mié Mar 18, 2015 9:15 am
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

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

Publicado: Mié Mar 18, 2015 9:47 am
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

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

Publicado: Mié Mar 18, 2015 11:35 am
por ignacio
lEditable sólo se tiene en cuenta antes de entrar en edición. Prueba con TDataControl:Lock()
Saludos

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

Publicado: Mar Mar 24, 2015 9:50 am
por bingen
Si señor muy ilustrativo José, me recuerda a barrio Sesamo....

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

Publicado: Mar Mar 24, 2015 10:13 am
por bingen
Muchas gracias Ignacio con TDataControl:Lock() ha funcionado perfectamente, cuanto se aprende de vosotros en un momento.
Salu2.