Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Evitar modificación en componente (https://www.clubdelphi.com/foros/showthread.php?t=3964)

javiermorales 25-09-2003 22:07:09

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.

roman 25-09-2003 22:31:52

Si, por ejemplo, el control es un TDBEdit, me parece que puedes poner

DBEdit1.Field.ReadOnly := true;

// Saludos

marcoszorrilla 25-09-2003 22:38:10

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.

roman 25-09-2003 23:15:16

Cita:

Posteado originalmente por marcoszorrilla
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.
y por cierto, eso que dije es un poco absurdo ya que TDBEdit tiene la propiedad ReadOnly sin necesidad de aceder al Field.

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

roman 25-09-2003 23:15:59

Cita:

Posteado originalmente por marcoszorrilla
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.
y por cierto, eso que dije es un poco absurdo ya que TDBEdit tiene la propiedad ReadOnly sin necesidad de aceder al Field.

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

javiermorales 25-09-2003 23:45:54

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.

marcoszorrilla 26-09-2003 08:10:49

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.

javiermorales 26-09-2003 08:25:29

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.

roman 26-09-2003 08:28:39

¿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

javiermorales 26-09-2003 08:34:08

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.

roman 26-09-2003 08:57:12

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

javiermorales 26-09-2003 09:13:40

Así lo haré.

Muchas gracias a todos. Un saludo

jacanche 26-09-2003 22:34:23

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

javiermorales 26-09-2003 23:06:47

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.


La franja horaria es GMT +2. Ahora son las 07:35:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi