Не могат да се уловят всички кликвания при използване на събития 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