--- ---
I suggest that you write the OnMouseDown event similar to the following:
{ ... } TNewPopupMenu = class(TPopupMenu) private FOnMouseDown: TMouseEvent; protected procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic; procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton; Shift: TShiftState); published property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown; end; procedure TNewPopupMenu.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y); end; procedure TNewPopupMenu.DoMouseDown(var Message: TWMMouse; Button: TMouseButton; Shift: TShiftState); begin with Message do MouseDown(Button, KeysToShiftState(Keys) + Shift, XPos, YPos); end;