delphicomponentscreation

How to handle double click from childs in compound component?


I have created a new compound component based on a TCustomPanel. On it I have two labels and one image, covering all the surface, see this layout (the lower part is less important):

Layout of the control

My question is how to export the double click functionality of any of these controls? Is it a possibility to use the double click (event) of the new control to manage those of the child controls on it?


Solution

  • I think you should do it by using the following approach:

    1. Add an OnDblClick event to the compound component.
    2. Add a method called FOnInternalDblClick (The name is not important), compatible with TNotifyEvent to your compound component.
    3. Inside FOnInternalDblClick, execute the compound component's OnDblClick.
    4. In the compound component's constructor, assign FOnInternalDblClick to the OnDblClick event of every component for which you want to manage the event.

    Example code:

    TMyCompoundComponent = class(TCustomPanel)
    protected
      FOnDblClick : TNotifyEvent;
      procedure FOnInternalDblClick(ASender : TObject);
    public
      constructor Create(AOwner : TComponent); override;
    published
      property OnDblClick : TNotifyEvent read FOnDblClick write FOnDblClick;
    end;
    
    constructor TMyCompoundComponent.Create(AOwner : TComponent);
    begin
      inherited;
      //Lab1.OnDblClick := FOnInternalDblClick;
      //Lab2.OnDblClick := FOnInternalDblClick;
      //...
    end;
    
    procedure TMyCompoundComponent.FOnInternalDblClick(ASender : TObject);
    begin
      if(Assigned(FOnDblClick))
      then FOnDblClick(ASender);
    end;
    

    Note:

    In the compound component's OnDblClick event handler, the ASender parameter will be the internal component (Lab1, Lab2, Lab3...). If you prefer to receive the compound component itself as ASender parameter, you could change the FOnInternalDblClick method by passing Self instead of ASender:

    procedure TMyCompoundComponent.FOnInternalDblClick(ASender : TObject);
    begin
      if(Assigned(FOnDblClick))
      then FOnDblClick(Self);
    end;