Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   MouseDown en DbGrid no funciona como espero (https://www.clubdelphi.com/foros/showthread.php?t=73272)

ElDioni 12-04-2011 13:11:20

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.

Casimiro Noteví 12-04-2011 14:01:58

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.

roman 12-04-2011 15:55:24

Vaya, nunca había notado esto, sí que es raro. Responde al MouseUp pero no al MouseDown.

// Saludos

oscarac 12-04-2011 15:58:24

Ghost in the Machine:D:D

roman 12-04-2011 16:19:32

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

ElDioni 12-04-2011 16:50:04

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

roman 12-04-2011 16:53:25

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

ElDioni 12-04-2011 16:59:21

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.

Casimiro Noteví 12-04-2011 17:04:25

Cita:

Empezado por ElDioni (Mensaje 396701)
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 :o

ElDioni 12-04-2011 17:10:01

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.

Caro 12-04-2011 17:10:34

Cita:

Empezado por ElDioni (Mensaje 396701)
................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

roman 12-04-2011 17:15:12

Cita:

Empezado por Caro (Mensaje 396708)
Si me he equivocado, roman nos va a corregir :).

¡Ah! Pero ¿qué fama me hacen! :D

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

// Saludos

ElDioni 12-04-2011 17:28:52

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.

Chris 12-04-2011 17:33:17

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.

ElDioni 12-04-2011 17:40:02

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.

roman 12-04-2011 17:41:40

Cita:

Empezado por Chris (Mensaje 396716)
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

ElDioni 12-04-2011 17:57:22

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.

Chris 12-04-2011 17:58:37

Cita:

Empezado por roman (Mensaje 396720)
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 (Mensaje 396656)
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


roman 12-04-2011 18:32:12

Cita:

Empezado por Chris (Mensaje 396726)
¿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

ElDioni 12-04-2011 18:50:29

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


La franja horaria es GMT +2. Ahora son las 23:01:31.

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