如何处理复合组件中子项的双击?

时间:2016-11-18 10:09:31

标签: delphi components creation

我基于TCustomPanel创建了一个新的复合组件。 在它上面我有两个标签和一个图像,覆盖所有表面,看到这个布局(下部不那么重要):

Layout of the control

我的问题是如何导出任何这些控件的双击功能?是否可以使用新控件的双击(事件)来管理其上的子控件的那些?

2 个答案:

答案 0 :(得分:3)

我认为您应该使用以下方法来实现:

  1. 向复合组件添加OnDblClick事件。
  2. 添加一个名为FOnInternalDblClick的方法(名称并不重要),与您的复合组件TNotifyEvent兼容。
  3. FOnInternalDblClick内,执行复合组件的OnDblClick
  4. 在复合组件的构造函数中,将FOnInternalDblClick分配给您要为其管理事件的每个组件的OnDblClick事件。
  5. 示例代码:

    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(@FOnDblClick <> nil)
      then FOnDblClick(ASender);
    end;
    

    注意:

    在复合组件的OnDblClick事件处理程序中,ASender参数将是内部组件(Lab1Lab2Lab3 ...)。如果您希望将复合组件本身作为ASender参数接收,则可以通过传递FOnInternalDblClick而不是Self来更改ASender方法:

    procedure TMyCompoundComponent.FOnInternalDblClick(ASender : TObject);
    begin
      if(@FOnDblClick <> nil)
      then FOnDblClick(Self);
    end;
    

答案 1 :(得分:2)

您的要求都是可能的。这取决于你想做什么。如果您希望能够为每个子项分别在程序中编写代码,则需要创建组件的三个额外发布属性并将它们映射到相应的子组件属性。像这样(只显示一个子组件 - 重复另一个2):

type
  TMyPanelForm1 = class( TPanel )
  private
    fLabel1, fLabel2 : TLabel;
    fImage : TImage;
    procedure SetLabel1DblClick(const Value: TNotifyEvent);
    function GetLabel1DblClick: TNotifyEvent;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property OnLabel1DblClick : TNotifyEvent
             read GetLabel1DblClick write SetLabel1DblClick;
  end;
...
function TMyPanelForm1.GetLabel1DblClick: TNotifyEvent;
begin
  Result := fLabel1.OnDblClick;
end;

procedure TMyPanelForm1.SetLabel1DblClick(const Value: TNotifyEvent);
begin
  fLabel1.OnDblClick := Value;

end;

另一方面,如果您希望控件像统一控件一样运行,那么所有三个子控件都会继承&#39;主要组件双击,你只是涟漪这样的任务:

  TMyPanelForm2 = class( TPanel )
  private
    fLabel1, fLabel2 : TLabel;
    fImage : TImage;
    function GetOnDblClick: TNotifyEvent;
    procedure SetOnDblClick(const Value: TNotifyEvent);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property OnDblClick : TNotifyEvent
             read GetOnDblClick write SetOnDblClick;
  end;
...
function TMyPanelForm2.GetOnDblClick: TNotifyEvent;
begin
  Result := inherited OnDblClick;
end;

procedure TMyPanelForm2.SetOnDblClick(const Value: TNotifyEvent);
begin
  inherited OnDblClick := Value;
  fLabel1.OnDblClick := Value;
  fLabel2.OnDblClick := Value;
  fImage.OnDblClick := Value;
end;

其他解决方案也是可能的。