FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Evitar modificación en componente
Hola a todos/as, tengo asociados componentes DBLookup y de otros tipos en un formulario a campos de una tabla, como es normal. La cuestión es, ¿como se puede evitar que el usuario modifique los datos que refleja ese componente?. Resulta sencillo evitar la modificación de todos los datos, en el evento OnStateChange del DataSource, pero lo que quiero hacer es evitar que modifique determinados campos, no todos.
No veo en determinados componentes, el evento OnChange y por eso mi duda. Gracias. Un saludo. |
#2
|
||||
|
||||
Si, por ejemplo, el control es un TDBEdit, me parece que puedes poner
DBEdit1.Field.ReadOnly := true; // Saludos |
#3
|
||||
|
||||
Otra solución, puede ser poner dichos componentes, los que se pretende inhabilitar sobre un panel y poner éste enabled a False, de esta manera no se podría acceder a dichos componentes, amén de lo dicho por Román, que quizás tiene un pequeño problema estético y es que te permite entrar en el campo pero no escribir.
Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
|
#4
|
||||
|
||||
Cita:
En realidad estaba pensando en como hacer readonly un campo independientemente del control y supongo que sería mejor agregar los campos en el editro de campos del dataset y ahí fijar a true la propiedad ReadOnly. Por otro lado no me queda claro eso de la estética (claro que en gustos se rompen generos Aún con el panel, el usuario tendrá la impresión (cosa que no me parece grave) de que, siendo una caja de texto puede entrar y editar. Finalmente, muchas veces me he encontrado con formularios que tienen campos ReadOnly y que sin embargo resulta cómodo poder copiar su dato para pegarlo en alguna otra parte, cosa que no podrá hacerse con el panel o deshabilitando el control. // Saludos |
#5
|
||||
|
||||
Cita:
En realidad estaba pensando en como hacer readonly un campo independientemente del control y supongo que sería mejor agregar los campos en el editro de campos del dataset y ahí fijar a true la propiedad ReadOnly. Por otro lado no me queda claro eso de la estética (claro que en gustos se rompen generos Aún con el panel, el usuario tendrá la impresión (cosa que no me parece grave) de que, siendo una caja de texto puede entrar y editar. Finalmente, muchas veces me he encontrado con formularios que tienen campos ReadOnly y que sin embargo resulta cómodo poder copiar su dato para pegarlo en alguna otra parte, cosa que no podrá hacerse con el panel o deshabilitando el control. // Saludos |
#6
|
||||
|
||||
El problema radica en que no puedo poner el campo en readonly, ni poner un panel para inhabilitarlo ya que normalmente esos campos podrán modificarse, solo deberían no poder modificarse si existe un registro relacionado en otra tabla que no interviene en el formulario, y que puede estar siendo modificado por otro usuario, por lo tanto debo lanzar una sql para saber si existe dicho registro,lo que me lleva a tomar la decisión cuando llega el momento de postearlo y no se que campos se han modificado en ese momento.
Gracias por las respuestas, si se me ocurre algo,os lo comunicaré y si se os ocurre algo, por favor comentármelo. Un saludo. |
#7
|
||||
|
||||
El panel no es para inhabilitarlo, sino para cambiar su propiedad Enabled cuando convenga.
If LoQueSea then MiPanel.Enabled = False; Esta era la idea. Un saludo.
__________________
Guía de Estilo de los Foros Cita:
|
#8
|
||||
|
||||
Hola Marcos, utilizo amenudo paneles para en tiempo de ejecución habilitarlos y deshabilitarlos. Lo que no quería erá utilizar esa técnica y poder en cada campo decirle al usuario que situación provoca la negativa de actualización.
Gracias. Un saludo. |
#9
|
||||
|
||||
¿Y por qué no verificas la condición en el evento OnBeforePost del dataset y mandas un aviso indicando que no se puede realizar la modificación?
// Saludos |
#10
|
||||
|
||||
Por que no son todos los campos los que no se pueden editar y no sé como saber que campos ha modificado cuando llego a ese evento.
|
#11
|
||||
|
||||
Si pones la tabla con CachedUpdates en true, en el evento OnBeforePost puedes detectar si el campo ha cambiado comparando Table.FieldByName('tu campo').Value con Table.FieldByName('tu campo').OldValue y entonces evitar el post o bien asignar Table.FieldByName('tu campo').OldValue a Table.FieldByName('tu campo').NewValue para hacer el post pero revirtiendo el valor original del campo específico.
// Saludos |
#12
|
||||
|
||||
Así lo haré.
Muchas gracias a todos. Un saludo |
#13
|
|||
|
|||
Hola,
Otra opcion es utilizar el evento OnValidate del TField, ese evento te puede ser util por que se dispara despues que modifiques la informacion del campo, en ese momento realizas tus validaciones y si no es valido el dato, lo puedes rechazar sin modificar el valor original del campo. Saludos Alfredo |
#14
|
||||
|
||||
Gracias a todos por vuestras respuestas, al final he optado por colocar un nuevo panel, dentro del que ya tenía y que contiene solo los campos que no se pueden modificar.
En el evento OnStateChange del DataSource en el formulario, verifico si el DataSource.State es dsEdit, si es así y el segundo panel esta con el foco (Panel2.Focused), lo que hago es cancelar la edición (DataSource.Dataset.Cancel), lo que restaura el valor modificado de los campos no modificables y pongo la disponibilidad del panel a false (Panel2.Enabled := false), lo que hace que no se pueda acceder y pasa al foco al siguiente campo del Panel padre. Gracias de nuevo a todos. Un saludo. |
|
|
|