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

Lau*_*sti 6 delphi components creation

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

控件的布局

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

Fab*_*zio 4

我认为你应该使用以下方法来做到这一点:

  1. OnDblClick事件添加到复合组件。
  2. 添加一个名为FOnInternalDblClick(名称并不重要)的方法,该方法与TNotifyEvent您的复合组件兼容。
  3. 在 内部FOnInternalDblClick,执行复合组件的OnDblClick.
  4. 在复合组件的构造函数中,分配FOnInternalDblClickOnDblClick要管理事件的每个组件的事件。

示例代码:

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;
Run Code Online (Sandbox Code Playgroud)

笔记:

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

procedure TMyCompoundComponent.FOnInternalDblClick(ASender : TObject);
begin
  if(Assigned(FOnDblClick))
  then FOnDblClick(Self);
end;
Run Code Online (Sandbox Code Playgroud)