Recent

Author Topic: [Solved] Form event onMouseDown doesn't trigger for controls  (Read 157 times)

nikel

  • Sr. Member
  • ****
  • Posts: 282
Hello, I created a custom event and want to catch button clicks. Here's my code so far:
Code: Pascal  [Select][+][-]
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   ...
  4.   Self.OnMouseDown:=@MouseDownHandler;
  5. end;
  6.  
  7. procedure TForm1.MouseDownHandler(Sender: TObject;
  8.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  9. var
  10.   Img         : TImage;
  11. begin
  12.   Status_Lbl.Caption:='Hit on a control';
  13.  
  14.   if (TControl(Sender).Name = 'AddUrl_Pnl') then
  15.   begin
  16.     Status_Lbl.Caption:='Hit on panel';
  17.   end;
  18. end;

When I debug, it never reaches Status_Lbl.Caption:='Hit on panel';. Only empty area in form works partially. How can I fix this?
« Last Edit: June 03, 2026, 08:38:25 am by nikel »

dsiders

  • Hero Member
  • *****
  • Posts: 1635
Re: Form event onMouseDown doesn't trigger for controls
« Reply #1 on: June 03, 2026, 07:12:10 am »
Hello, I created a custom event and want to catch button clicks. Here's my code so far:
Code: Pascal  [Select][+][-]
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   ...
  4.   Self.OnMouseDown:=@MouseDownHandler;
  5. end;
  6.  
  7. procedure TForm1.MouseDownHandler(Sender: TObject;
  8.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  9. var
  10.   Img         : TImage;
  11. begin
  12.   Status_Lbl.Caption:='Hit on a control';
  13.  
  14.   if (TControl(Sender).Name = 'AddUrl_Pnl') then
  15.   begin
  16.     Status_Lbl.Caption:='Hit on panel';
  17.   end;
  18. end;

When I debug, it never reaches Status_Lbl.Caption:='Hit on panel';. Only empty area in form works partially. How can I fix this?

Each control has its own OnMouseDown handler. You assigned one to the form, but not the control you're expected to send the notification. You can use OnMouseDown handler for the form as a shared handler. Like:

Code: Pascal  [Select][+][-]
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;
  9.  
  10. type
  11.  
  12.   { TForm1 }
  13.  
  14.   TForm1 = class(TForm)
  15.     Label1: TLabel;
  16.     Panel1: TPanel;
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure HandleMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  19.   private
  20.   public
  21.   end;
  22.  
  23. var
  24.   Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.lfm}
  29.  
  30. { TForm1 }
  31.  
  32. procedure TForm1.HandleMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  33. begin
  34.   Label1.Caption := 'In shared OnMouseDown handler...';
  35.   if (Sender <> Nil) then
  36.     Label1.Caption := TControl(Sender).Name + ' (' + TControl(Sender).ClassName + ') clicked...';
  37. end;
  38.  
  39. procedure TForm1.FormCreate(Sender: TObject);
  40. begin
  41.   OnMouseDown := @HandleMouseDown;
  42.   Panel1.OnMouseDown := @HandleMouseDown;
  43.   Label1.OnMouseDown := @HandleMouseDown;
  44. end;
  45.  
  46. end.
  47.  

nikel

  • Sr. Member
  • ****
  • Posts: 282
Re: Form event onMouseDown doesn't trigger for controls
« Reply #2 on: June 03, 2026, 08:37:25 am »
Thank you for your reply.

 

TinyPortal © 2005-2018