Controles con lEditable := .F. no hace ni caso
Controles con lEditable := .F. no hace ni caso
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 ???
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
http://www.bisoft.es
- 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
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
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
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
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
http://www.bisoft.es
-
- Mensajes: 291
- Registrado: Jue Ene 31, 2013 1:10 pm
Controles con lEditable := .F. no hace ni caso
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
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
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
//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
http://www.bisoft.es
-
- Mensajes: 291
- Registrado: Jue Ene 31, 2013 1:10 pm
Controles con lEditable := .F. no hace ni caso
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
> 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
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.
Muchas gracias.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es
-
- Mensajes: 291
- Registrado: Jue Ene 31, 2013 1:10 pm
Controles con lEditable := .F. no hace ni caso
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
> 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
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
> 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
- 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
lEditable sólo se tiene en cuenta antes de entrar en edición. Prueba con TDataControl:Lock()
Saludos
Saludos
Controles con lEditable := .F. no hace ni caso
Si señor muy ilustrativo José, me recuerda a barrio Sesamo....
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es
Controles con lEditable := .F. no hace ni caso
Muchas gracias Ignacio con TDataControl:Lock() ha funcionado perfectamente, cuanto se aprende de vosotros en un momento.
Salu2.
Salu2.
BiSoft Desarrollo de software profesional
http://www.bisoft.es
http://www.bisoft.es