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 12-04-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
MouseDown en DbGrid no funciona como espero

Buenos días gente del foro,

estoy haciendo un programa y me encuentro conque necesito lanzar un código al hacer MouseDown en un DBGrid pero, ponga lo que ponga, no hace nada a no ser que pulse sobre la barra de titulos del DBGrid o en el espacio, a la derecha, dentro de la grilla, que ya no contiene datos de la tabla (la parte que se queda en blando a partir de la última columna de datos de la grilla), no se porque ocurre esto o si hay alguna forma de decirle al DBGrid que actue el MouseDown en cualquier lugar que se pulse.

Espero haberme explicado con suficiente claridad y también que puedan ayudarme con este tema.

Gracias y saludos.
Responder Con Cita
  #2  
Antiguo 12-04-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.067
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Me ha parecido entender que sólo funciona cuando has pinchado en el dbgrid, ocurre porque si el dbgrid no tiene el foco entonces no te hará caso, evidentemente, y estará recogiéndolo el evento del form. Para ello puedes poner en el evento del form que le dé el foco al dbgrid cuando detecte el "mousedonw" del ratón.
Responder Con Cita
  #3  
Antiguo 12-04-2011
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
Vaya, nunca había notado esto, sí que es raro. Responde al MouseUp pero no al MouseDown.

// Saludos
Responder Con Cita
  #4  
Antiguo 12-04-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
Ghost in the Machine
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 12-04-2011
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
Revisando el código de la VCL veo que es el comportamiento por diseño. El método MouseDown de TCustomDBGrid sólo llama al método heredado de TCustomGrid en los casos señalados.

Tendrías que redefiir el método MouseDown para poder acceder al evento.

// Saludos
Responder Con Cita
  #6  
Antiguo 12-04-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Gracias a todos por sus respuestas,
de momento voy a probar con la solución que propone Casimiro y a ver que pasa.
Les mantengo informados, Gracias de nuevo.

Saludos
Responder Con Cita
  #7  
Antiguo 12-04-2011
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
Eso no va a servir, porque quien recibe el evento no es el formulario. No es una cuestión de foco, un MouseDown debe, por si sólo, poner el foco en el control. El punto, como dije, es que, el evento MouseDown del TCustomDBGrid nunca llama al método heredado y, por ende, nunca se llama al evento del usuario.

// Saludos
Responder Con Cita
  #8  
Antiguo 12-04-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Hola otra vez,

efectivamente roman tiene razón, esa solución que proponía Casimiro me ha dejado igual que estaba, no me lanza el código que quería, me gustaría probar con tu solución roman pero en cuanto a redifinir metodos me temo que estoy más verde que la almendra en Junio.
Si te encuentras con animo de echarme una mano te lo agradecería.

Saludos.
Responder Con Cita
  #9  
Antiguo 12-04-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.067
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ElDioni Ver Mensaje
Hola otra vez, efectivamente roman tiene razón, esa solución que proponía Casimiro me ha dejado igual que estaba, no me lanza el código que quería,[..]
quien tiene boca, se equivoca
Responder Con Cita
  #10  
Antiguo 12-04-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
No pasa nada, más que me equivoco yo seguro que no te equivocas tú, por lo menos veo que el DBGrid viene así de serie, quería comentarles que yo tenía un Grid de terceros que se llama SMDBGrid que si que actua bien en el evento MouseDown pero que lo descarté porque, a diferencia del DBGrid normal, no me dejaba seleccionar una parte de un campo de la línea de un registro, por ejemplo, el cliente se llama "pepito el de los palotes" y el dbgrid me deja seleccinar solo "palote" y luego podía hacer un filtro y que me pusiera todos los clientes "Palote" , por lo que volví al DBGrid.

Saludos.
Responder Con Cita
  #11  
Antiguo 12-04-2011
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por ElDioni Ver Mensaje
................me gustaría probar con tu solución roman pero en cuanto a redifinir metodos me temo que estoy más verde que la almendra en Junio.
Hola ElDioni, yo tampoco se mucho de eso, pero creo que tendrías que desprotejer tu dbgrid y hacer esto:

Código Delphi [-]
type
  TDBGrid =  class(DBGrids.TDBGrid)
      procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
  end;

  TForm1 = class(TForm)
  ..................................
  ..................................

procedure TDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Form1.Label1.Caption := 'algo'; //digamos que queremos mostrar algo en un label
  inherited MouseDown(Button, Shift, X, Y);
end;

Si me he equivocado, roman nos va a corregir .

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #12  
Antiguo 12-04-2011
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:
Empezado por Caro Ver Mensaje
Si me he equivocado, roman nos va a corregir .
¡Ah! Pero ¿qué fama me hacen!

Claro que no te voy a corregir, lo que has puesto es perfecto

// Saludos
Responder Con Cita
  #13  
Antiguo 12-04-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Hola, a alguno le suena este mensaje "Failed to load resources from resources file please check your setup" y que luego se te cierre el delphi sin despedirse ni nada.

Saludos.
Responder Con Cita
  #14  
Antiguo 12-04-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Lo raro que me suena es que el evento dispare tu código solo cuando no está sobre la rejilla de datos. La rejilla de datos no es un control, de hecho no es nada más que un lienzo donde se dibujan los datos. Las cabeceras de columnas y las partes en blanco también son parte del mismo lienzo.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #15  
Antiguo 12-04-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Bueno, el error que os ponía antes me lo daba si empezaba a escribir el código que me indicaba Caro a mano, pero si lo copio y pego no me dice nada, sin embargo al compilar no me deja por que me dice que "Method MouseDown not found in base class"
No se que puede estar pasando.

Saludos.
Responder Con Cita
  #16  
Antiguo 12-04-2011
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:
Empezado por Chris Ver Mensaje
Lo raro que me suena es que el evento dispare tu código solo cuando no está sobre la rejilla de datos. La rejilla de datos no es un control, de hecho no es nada más que un lienzo donde se dibujan los datos. Las cabeceras de columnas y las partes en blanco también son parte del mismo lienzo.
A ver. Entendámonos. El control, incluída la zona de las celdas, sí recibe el evento del ratón por parte del sistema operativo. Pero es el manejador de este evento del propio control el que decide no transmitir ese evento.

// Saludos
Responder Con Cita
  #17  
Antiguo 12-04-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Hola, ahora no se muy bien lo que he hecho pero me aparece lo siguiente al compilar: Unsatisfied forward or external declaration:'TDBGrid.MouseDown'.
Voy a preguntar, aunque seguro que ahora me decis: "Pues claro que es por eso, lo tienes que quitar, como no nos lo has dicho antes".
Tenía puesto de un código anterior justo encima del

TForm1 = class(TForm)

la siguiente línea.

THackGrid = class(TDBGrid);

es de un código que saqué del club para hacer lo siguiente:

Código Delphi [-]
procedure TFrmMenuArt.DBGridArticulosExit(Sender: TObject);
begin
//guarda el texto seleccionado de la casilla donde estaba en una variable
//o el texto completo si no había nada seleccionado al salir del grid para
//luego hacer el filtro
try
if THackGrid(DBGridArticulos).InplaceEditor.SelText='' then
  begin
    if dbgridArticulos.Fields[dbgridArticulos.SelectedIndex].AsString<>'' then
      begin
        textofiltro:=dbgridArticulos.Fields[dbgridArticulos.SelectedIndex].AsString;
      end;
  end
else
  begin
    textofiltro:=(THackGrid(DBGridArticulos).InplaceEditor.SelText);
  end;
except
  textofiltro:=dbgridArticulos.fields[dbgridArticulos.selectedIndex].asstring;
end;
CampoFiltro:=dbgridArticulos.Columns[dbgridArticulos.selectedindex].FieldName;
end;
¿es posible que este código que os muestro esté creando conflicto con el nuevo código que me proponía Caro para el tema del MouseDown?
Es que si no es por eso no se porque no me funciona la solución propuesta.

Saludos.
Responder Con Cita
  #18  
Antiguo 12-04-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por roman Ver Mensaje
A ver. Entendámonos. El control, incluída la zona de las celdas, sí recibe el evento del ratón por parte del sistema operativo. Pero es el manejador de este evento del propio control el que decide no transmitir ese evento.

// Saludos
¿Entonces hay un condicional o algo por el estilo, que decide no transmitir el evento cuando el Mouse está sobre las celdas de datos? Esto lo digo por lo que anteriormente ha dicho el compañero
Cita:
Empezado por ElDioni Ver Mensaje
ponga lo que ponga, no hace nada a no ser que pulse sobre la barra de titulos del DBGrid o en el espacio, a la derecha, dentro de la grilla, que ya no contiene datos de la tabla
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #19  
Antiguo 12-04-2011
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:
Empezado por Chris Ver Mensaje
¿Entonces hay un condicional o algo por el estilo, que decide no transmitir el evento cuando el Mouse está sobre las celdas de datos? Esto lo digo por lo que anteriormente ha dicho el compañero
El código del método de MouseDown en TControl es éste:

Código Delphi [-]
procedure TControl.MouseDown(Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;

O sea, que a nivel de TControl, es que se llama al evento definido por el usuario.

Ahora, si pones un punto de ruptura en el código de TCustomDBGrid.MouseDown, notarás que, no importa donde coloques el cursor del ratón sobr el DBGrid, la ejecución se detiene, indicando que el control recibió el evento.

Sin emabargo, si sigues examinando el código, verás que las llamadas a

Código Delphi [-]
inherited MouseDown(...);

están bajo algunos condicionales, a diferencia de MouseUp, donde la llamada a

Código Delphi [-]
inherited MouseUp(...);

ocurre sin ninguna condición.

Al no llamarse al MouseDown de TControl, nunca se llama al evento definidio por el usuario. Y de ahí el comportamiento que describe ElDioni.

// Saludos
Responder Con Cita
  #20  
Antiguo 12-04-2011
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
Bueno, ya he conseguido hacer que funcionara el asunto, ahora corregirme si me equivoco, al poner este código que me ha facilitado Caro, en todos los DbGrids que tengo declarados salta el código que he introducido al hacer el MouseDown, si lo que quiero es que solo afecte a un DbGrid en concreto debería declararlo como TDBGridMio = class(DBGrids.TDBGrid) en lugar de TDBGrid = class(DBGrids.TDBGrid) y declarar mi DBGrid como DBGridOrdenes: TDBGridMio; para que no afecte a los otros DbGrids.
¿es así?.

Saludos
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
Duda con con el evento MouseDown NEG1414 C++ Builder 3 05-10-2008 15:00:40
Espero me ayuden BaRdO JAVA 0 23-08-2007 04:46:31
autorefresh no funciona en query y dbgrid ilichhernandez Conexión con bases de datos 6 08-11-2005 19:32:00
Espero no lleguemos a esto :s __cadetill Humor 7 21-11-2003 11:03:19


La franja horaria es GMT +2. Ahora son las 16:19:47.


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