Не удается перехватить все клики при использовании событий onmousedown, onmouseup и click.

Я пытаюсь создать пользовательскую кнопку из компонента TPanel. Для этого я предоставил переопределение для событий onmousedown и onmouseup (чтобы сделать некоторый рисунок) и использовал событие onclick для обработки кликов.

К сожалению, если я быстро нажимаю на свою панель, каждый второй щелчок «теряется», но я не могу понять, почему.

Даже самый простой пример в этом отношении неверен. Я создал новое приложение VCL, добавил список, одну панель и реализовал события следующим образом:

procedure TForm1.Panel1Click(Sender: TObject);
begin
  listbox1.Items.Add('click');
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  listbox1.Items.Add('mouse down');
end;

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  listbox1.Items.Add('mouse up');
end;

Результат выглядит следующим образом:

mouse down
click
mouse up
mouse down
mouse up

и так далее... Каждый второй щелчок игнорируется, но я понятия не имею, почему.

Кто-нибудь может объяснить это, пожалуйста?


person Joe    schedule 21.11.2016    source источник


Ответы (1)


Ваша панель обрабатывает двойные щелчки, когда вы быстро нажимаете на нее. использовать:

Panel1.ControlStyle := Panel1.ControlStyle - [csDoubleClicks]

чтобы преобразовать двойные щелчки в клики. (в вашем пользовательском элементе управления установите ControlStyle в его конструкторе).

csDoubleClicks Элемент управления может получать сообщения о двойном щелчке и отвечать на них. В противном случае сопоставьте двойные щелчки с кликами.

См. TControl.ControlStyle.

person kobik    schedule 21.11.2016