Как мне перехватить событие нажатия кнопки, родительским элементом которой является TDBGrid?

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

  •  09-09-2019
  •  | 
  •  

Вопрос

У меня есть маленькая кнопка, которую я хочу добавить в верхний левый угол компонента TDBGrid на Delphi (в ячейках заголовка).Я могу легко разместить кнопку, но теперь событие click не обрабатывается.Я предполагаю, что событие перехватывается сеткой.Есть какой-нибудь способ, которым я могу заставить это конкретное событие перейти к кнопке вместо этого?Примечание. Мне все еще нужна сетка для обработки событий нажатия на кнопки заголовка, как это происходит в настоящее время.

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;

** Обновление: ** Я обнаружил, что смог использовать событие наведения курсора мыши на кнопку, которое, кажется, работает хорошо, но я не смог использовать событие щелчка.

procedure TForm38.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   if ( Button = mbLeft ) then
      TButton(Sender).Click;
end;
Это было полезно?

Решение

Я не уверен, почему он выдает сообщение о клике.На самом деле вы имитируете событие click с помощью обработчика события 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;

Если вы протестируете обычную кнопку, вы увидите, что событие щелчка не произойдет, пока вы не отпустите мышь.Имитация нажатия на кнопку вниз создает странное поведение.

Другие советы

Ух ты, какой крепкий орешек.TDBGrid не имеет общего обработчика событий "OnClick", а положение вашей кнопки затрудняет ее подделку.Единственное, что я могу придумать, это создать свой собственный компонент.Это не так сложно, как может показаться на первый взгляд.Перейдите из TDBGrid и переопределите метод MouseUp.Взгляните на то, как реализован TCustomDBGrid.MouseUp.Я не тестировал это, но вы, вероятно, могли бы попробовать что-то вроде этого:После инструкции if, которая проверяет на

(cell.x >= FIndicatorOffset)

и запускает события щелчка, пусть он запускает TitleClick (nil) или что-то в этом роде, если cell.x < FIndicatorOffset.Затем прикрепите обработчик события к событию OnTitleClick вашей сетки, которое вызывает Button1.Щелкните, если столбец = nil.(Да, своего рода взлом, но я не могу придумать более простого способа сделать это.На вашем месте я бы сообщил об этом в QC как об ошибке.)

Ниже приведено чистое решение, успешно опробованное как с Delphi 1, так и с 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top