¿Cómo puedo capturar el evento clic de un botón que tiene un TDBGrid como su padre?

StackOverflow https://stackoverflow.com/questions/748190

  •  09-09-2019
  •  | 
  •  

Pregunta

Tengo un pequeño botón que quiero añadir a la esquina superior izquierda de un componente Delphi TDBGrid (en las celdas de encabezado / título). Soy capaz de colocar el botón fácilmente, pero ahora el evento click no se maneja. Supongo que el evento está siendo capturado por la red. Cualquier forma de que pueda obligar a este evento específico para ir al botón en su lugar? Nota Todavía necesito la red para manejar eventos Click para los botones de título como lo hace actualmente.

procedure TForm38.FormCreate(Sender: TObject);
begin
   button1.Parent := grid;
   button1.Top := 0;
   button1.Left := 0;
   button1.Width := 12;
   button1.Height := 18;
   button1.OnClick := Button1Click;
end;

** Actualización:. ** He descubierto que era capaz de utilizar el evento MouseDown del botón que parece funcionar bien, pero que no podía usar el evento click

procedure TForm38.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if ( Button = mbLeft ) then
      TButton(Sender).Click;
end;
¿Fue útil?

Solución

No estoy seguro de por qué se está comiendo el mensaje clic. En realidad simular el evento de clic a través del controlador de eventos MouseUp.

procedure TForm38.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  ctrl: TButton;
begin
  ctrl := Sender as TButton;
  if (x > 0) and (x < ctrl.Width) and (y > 0) and (y < ctrl.Height)  then
    ctrl.Click;
end;

Si el resultado es un botón normal, se verá que el evento click no sucede hasta que suelte el ratón. Simular un clic en el botón de abajo crea un comportamiento extraño.

Otros consejos

Vaya, esta es una decisión difícil. TDBGrid no tiene un "clic" gestor de eventos genéricos, y la posición del botón hace que sea difícil de fingir. Lo único que puedo pensar es crear su propio componente. Esto no es tan difícil como puede parecer en un principio. Desciende de TDBGrid y reemplazar el método MouseUp. Echar un vistazo a la forma en que se implementa TCustomDBGrid.MouseUp. No he probado esto, pero probablemente podría intentar algo como esto: Después de la sentencia if que comprueba

(cell.x >= FIndicatorOffset)

y dispara eventos de clic, tienen que disparó el TitleClick (cero) o algo si cell.x

Lo que sigue es una solución limpia, intentó con éxito tanto con Delphi 1 y Delphi 2007:

procedure TForm38.FormCreate(Sender: TObject);
begin
   button1.Parent := grid;
   button1.Top := 0;
   button1.Left := 0;
   button1.Width := 12;
   button1.Height := 18;
   button1.OnClick := Button1Click;

   // only add this line
   button1.ControlStyle := button1.ControlStyle + [csClickEvents];

end;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top