Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 21
javiermorales Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 25-09-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Si, por ejemplo, el control es un TDBEdit, me parece que puedes poner

DBEdit1.Field.ReadOnly := true;

// Saludos
Responder Con Cita
  #3  
Antiguo 25-09-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #4  
Antiguo 25-09-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 25-09-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #6  
Antiguo 25-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 21
javiermorales Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 26-09-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #8  
Antiguo 26-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 21
javiermorales Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 26-09-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿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
Responder Con Cita
  #10  
Antiguo 26-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 21
javiermorales Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 26-09-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #12  
Antiguo 26-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 21
javiermorales Va por buen camino
Así lo haré.

Muchas gracias a todos. Un saludo
Responder Con Cita
  #13  
Antiguo 26-09-2003
jacanche jacanche is offline
Miembro
 
Registrado: may 2003
Ubicación: Campeche,Campeche,Mexico
Posts: 137
Poder: 21
jacanche Va por buen camino
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
Responder Con Cita
  #14  
Antiguo 26-09-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 21
javiermorales Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:07:45.


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
Copyright 1996-2007 Club Delphi