![]() |
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. |
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.
|
Vaya, nunca había notado esto, sí que es raro. Responde al MouseUp pero no al MouseDown.
// Saludos |
Ghost in the Machine:D:D
|
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 |
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 |
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 |
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. |
Cita:
|
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" :D, por lo que volví al DBGrid.
Saludos. |
Cita:
Si me he equivocado, roman nos va a corregir :). Saluditos |
Cita:
Claro que no te voy a corregir, lo que has puesto es perfecto :) // Saludos |
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. |
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.
|
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. |
Cita:
// Saludos |
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: ¿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. |
Cita:
Cita:
|
Cita:
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
están bajo algunos condicionales, a diferencia de MouseUp, donde la llamada a
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 |
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 |
He estado probando lo que les he comentado ahora mismo y al compilar me sale un mensaje diciendo que el DbGridOrdenes debería ser del tipo TDBGrid pero que es del tipo TDBGridMio y me dice que si lo quiero corregir, le digo que no pero me sigue sin funcionar el código del MouseDown.
Ahora no puedo seguir con el tema, mañana la daré otra vuelta a ver si le saco punta. Hasta mañana y gracias por sus respuestas. Saludos. |
El método que propuso Caro, servirá sólo para el Grid donde hayas puesto el código. Si quieres usarlo para otros grids entonces lo imejor sería hacer un nuevo componente que redefina el método tal como lo expone Caro, instalarlo en la paleta de componentes y utilizarlo en lugar del estándar.
// Saludos |
Buenos días,
roman se me tiene que estar pasando algo porque si yo pongo el código tal cual me lo puso Caro me afecta a todos los DBGrids que tengo creados en el formulario, no tengo, ni siquiera, que ponerles código en el evento MouseDown, directamente al hacer MouseDown se lanza el código que me puso Caro:
|
El código de Caro no afectará a DBGrids en otros formularios pero sí a todos los que haya en ese formulario.
Lo que puedes hacer es usar el método redefinido, no para ejecutar tu código, sino para lanzar el evento:
Así, sólo los DBGrid a los que asignes el evento OnMouseDown ejecutarán el código que desees. // Saludos |
Buenos días,
muchas gracias, de esta forma que me comentas si que funciona solo en el dbgrid que le pongo el código, pero lo he tenido que poner así
Si yo ponía en el mousedown de mi dbgrid el siguiente código me mostraba el nº de orden en el que estaba y no en el que había hecho el mousedown al ponerlo como te comento si me lo hace bien. De nuevo gracias a todos por su tiempo me han ayudado mucho. Saludos. |
| La franja horaria es GMT +2. Ahora son las 23:19:01. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi