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 10-05-2013
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Impedir que se pueda salir de un DBGrid con el mouse

Hola a todos los del foro y gracias de antemano

tengo un dbgrid donde se van cargando registros para una factura y la única columna que se puede modificar es la de cantidad de forma que el usuario pueda alterar el valor y yo hago una actualización inmediata del costo y precio y hasta ahí todo perfecto. El problema viene cuando el usuario esta editando una celda para cambiar por ejemplo de 12 a 24 pero antes de validar con enter se va con el mouse a otro edit del formulario (fuera del dbgrid), dejando a la celda con el valor 24 y los datos correspondientes al costo y precio no se actualizan, de forma que lo que necesito es que si el usuario está alterando la cantidad en cualquier celda de la columna de cantidades que no pueda hacer click con el mouse en otro sitio del formulario o que se si se sale del dbgrid de esa manera el sistema lo asuma con si fuera un evento de la tecla escape o #27 con lo cual el sistema coloca de nuevo automaticamente la cantidad 12 que tenía en principio.

Espero haberme explicado bien
Gracias
__________________
Oskar
Responder Con Cita
  #2  
Antiguo 10-05-2013
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.473
Poder: 21
newtron Va camino a la fama
Hola.

Impedir que salga del grid lo veo engorroso. ¿Te has planteado la posibilidad de ir recalculando los demás campos según va escribiendo sin necesidad de pulsar Enter?.
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 10-05-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.291
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Lo de impedirlo me parece difícil.
Prueba con el evento OnExit de DBGrid a ver si puedes detectar la salida y enviar o simular el ESCAPE.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 10-05-2013
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Hola y gracias por responder tanto a Newtron como a naftali, si, ciertamente puede ser muy difícil y no es fundamental que el sistema valide eso.

Explico de todas formas con más detalle lo que sucede.

Un usuario va agregando ítems en un dbgrid que tiene varias columnas, entre ellas, código, descripción, cantidad, precio unit y precio total y lo único que se puede modificar es la columna de cantidad.
Para validar la cantidad el usuario debe presionar enter para que se recalcule la columna de precio total.

Digamos que el usuario ya ha agregado 5 líneas de productos diferentes con sus respectivas cantidades y todo está re calculado sin problema, pero de pronto se da cuenta que en la tercera línea del dbgrid no eran 12 productos sino 24; de forma que va con el Mouse y hace click sobre la celda cantidad y después de escribir 24 no presiona enter para validar sino que con el Mouse vuelve al edit donde se escribe el próximo código que va a ser agregado al dbgrid dejando la celda en el gris con un 24 que no se ha validado y por ende no se ha refrescado la celda de precio global del ítem, de forma que cuando se manda a imprimir la factura, el registro indica 24 pero el cálculo real está basado en 12 productos que era la cifra inicial.

Actualmente bloqueo en las celdas de cantidad cualquier tecla excepto enter, no hay forma de salir de la celda si el usuario no presiona enter para validar o escape con lo cual dejo la cantidad original, pero no logró hacer que se quede la cantidad original si el usuario se sale del dbgrid con Mouse llevando el focos a otro botón o a otro edit.

Como podría validar ese evento o como dejar la cantidad original si se sale del dbgrid con el Mouse y no con enter o con escape como ya está establecido?
__________________
Oskar
Responder Con Cita
  #5  
Antiguo 10-05-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Debes consultar, en todo caso, en el onExit de la celda hacer lo que quieres.

Responder Con Cita
  #6  
Antiguo 10-05-2013
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Casimiro, ya he consultado y he tratado de hacerlo por mi mismo, incluso en el onexit del dbgrid pero no encuentro la manera
__________________
Oskar
Responder Con Cita
  #7  
Antiguo 10-05-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Debes tener eventos para controlar cuando se entra y cuando se sale de cada celda, ¿es el dbgrid estándar?
Responder Con Cita
  #8  
Antiguo 10-05-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Oscar.

¿ Que evento estás utilizando para realizar el cálculo ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 10-05-2013
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
hola, Si, supongo, que es el dbgrid estandard, pero no logro evitar que el mouse me deje modificada la celda con una nueva cantidad sin validar, he trabajado con onmousemove, oncolexit, oncellclik,onexit, aunque claro, a lo mejor no he hecho algo en esos eventos que me haga funcionar lo que necesito, que es que el mouse no me pueda sacarme del dbgrid sin que se haya terminado de validar la cantidad que ingresa el usuario, lo cual debería ser solo con enter y que de hecho funciona así, pero el usuario que le gusta el mouse para trabajar me está dañando las facturas.

Como harían Uds. si tuvieran que validar que el mouse no pudiera modificar el una celda, o tal vez como deshabilitar el mouse mientras que estoy dentro del dbgrid? cualquier solución es válida mientras el mouse no me altere lo que tengo en el dbgrid
__________________
Oskar
Responder Con Cita
  #10  
Antiguo 10-05-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Oscar Guzmán Ver Mensaje
...
Como harían Uds. si tuvieran que validar que el mouse no pudiera modificar el una celda, o tal vez como deshabilitar el mouse mientras que estoy dentro del dbgrid? cualquier solución es válida mientras el mouse no me altere lo que tengo en el dbgrid
Hola Oscar.

Un modo puede ser usar el evento OnSetText del campo en cuestión.

Un ejemplo rápido, supongamos que tenemos cuatro campos: Descripcion, Precio, Cantidad y Subtotal.
Y en el TDBGrid las columnas relacionadas a Descripcion, Precio y Subtotal con su propiedad ReadOly = True, de modo que sólo sea posible ingresar datos en la columna asociada al campo Cantidad.

Si nos interesara que el campo Subtotal sea igual a Cantidad * Precio luego de ingresada la cantidad, podemos hacer:
Código Delphi [-]
...
implementation

// Esto lo podes realizar desde el Object Inspector
// si has creado los campos persistentes en el TDataSet
procedure TForm1.DataSetCantidadSetText(Sender: TField;
  const Text: String);
begin
  with DataSet do
  begin
    FieldByName('Cantidad').AsFloat := StrToFloat(Text);
    FieldByName('Subtotal').AsFloat := FieldByName('Cantidad').AsFloat *
      FieldByName('Precio').AsFloat;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  // Siguiente línea innecesaria si el evento fue asignado desde el Object Inspector
  DataSet.FieldByName('Cantidad').OnSetText := DataSetCantidadSetText;
  ...
end;

...
De este modo cuando se abandone una celda de la columna "cantidad" por el motivo que sea, se realizará el cálculo.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 11-05-2013
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Ecfisa muchas gracias por responder, me parece excelente el código que me indicas aquí pero lo que necesito precisamente es que no se recalcule si una celda es abandonada, a menos que sea a través de enter, lo cual ya hace a la perfección, pero lo que me está descuadrando las facturas son los movimientos del mouse, ya que el usuario hace click en la celda de "cantidad" y coloca un número diferente al que estaba previamente digamos que si estaba 12 y el usuario hace click en esa celda para colocar 24, que cuando vaya a hacer click en otra celda o fuera del grid, la celda vuelva a quedar en 12 ya que la validación solo procede cuando se hace con enter, pero no encuentro ni la manera de deshabilitar el mouse en el dbgrid, ni de que se quede la cantidad anterior si el usuario sale del grid sin validar con enter.

Gracias por tu ayuda Ecfisa, no sé si tengas una idea diferente
__________________
Oskar
Responder Con Cita
  #12  
Antiguo 11-05-2013
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
Sobre el Grid

No se si te sirva la idea pero en el componente datasource existen unos eventos cuando uno cambia de registro
Responder Con Cita
  #13  
Antiguo 13-05-2013
Oscar Guzmán Oscar Guzmán is offline
Miembro
 
Registrado: oct 2008
Ubicación: Caracas-Venezuela
Posts: 79
Poder: 16
Oscar Guzmán Va por buen camino
Thumbs up

Hola a todos de nuevo.

Solo escribo para decirles que finalmente lo pude solucionar, tomando en cuenta la posición que tenía en el dbgrid justo antes de que sacara el focus del dbgrid con el mouse en el evento OnExit de la siguiente manera

Código Delphi [-]
procedure TTForm_ventas.DBGrid1Exit(Sender: TObject);
Var Key: Char;
begin
  If (DBGrid1.SelectedIndex = 4) and (DBgrid1.FieldCount>0)  then begin
    if Key <>#13 then begin
      DetTempVenta.Close;
      DetTempVenta.Open;
// a Continuació es opcional, solo por si quieren que el focus se quede en el grid justo donde estaba antes, pero al final yo no lo usé.
   (*   DBGrid1.SelectedIndex:=4;
      DBGrid1.SetFocus;*)

Quiero agradecer a los que me ofrecieron alguna clase de solución que aunque no fue lo más adecuado igual valoro sus respuestas y su tiempo

Saludos
__________________
Oskar
Responder Con Cita
  #14  
Antiguo 13-05-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Oscar.

Y también gracias a vos por publicar como lo solucionaste

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mouse en Celda de DBgrid angelholberg Gráficos 1 06-02-2009 03:10:24
No permitir seleccion con el mouse (dbGrid) Caro OOP 2 11-07-2006 17:32:34
Impedir salir de un DBEdit si el valor no es válido gluglu Varios 3 17-01-2005 17:35:33
Marcar un Registro al salir de DBGrid gluglu Conexión con bases de datos 2 09-10-2004 01:54:23
Salir del DBgrid con el teclado oneromm Varios 1 16-03-2004 23:23:24


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


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