Cannot catch all clicks when using onmousedown, onmouseup and click events
Asked Answered
H

1

6

I'm trying to create a custom button out of a TPanel component. For this, I have provided an override for the onmousedown and onmouseup events (to do some drawing), and I've used the onclick event to handle the clicks.

Unfortunately, if I rapidly click my panel, every other click is "lost", but I can't figure out why.

Even the easiest of examples fails in this regard. I created a new VCL application, added a listbox, one panel, and implemented the events as follows:

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;

The result is as follows:

mouse down
click
mouse up
mouse down
mouse up

etcetera... Each second click is disregarded, but I have no idea why.

Can anybody explain this please?

Haggi answered 21/11, 2016 at 11:35 Comment(0)
H
9

Your panel is processing double-clicks when you rapidly click on it. use:

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

to map double-clicks into clicks. (in your custom control set ControlStyle in it's constructor).

csDoubleClicks The control can receive and respond to double-click messages. Otherwise, map double-clicks into clicks.

See TControl.ControlStyle

Hammond answered 21/11, 2016 at 11:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.