我基于TCustomPanel
创建了一个新的复合组件。
在它上面我有两个标签和一个图像,覆盖所有表面,看到这个布局(下部不那么重要):
我的问题是如何导出任何这些控件的双击功能?是否可以使用新控件的双击(事件)来管理其上的子控件的那些?
答案 0 :(得分:3)
我认为您应该使用以下方法来实现:
OnDblClick
事件。FOnInternalDblClick
的方法(名称并不重要),与您的复合组件TNotifyEvent
兼容。FOnInternalDblClick
内,执行复合组件的OnDblClick
。FOnInternalDblClick
分配给您要为其管理事件的每个组件的OnDblClick
事件。示例代码:
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
参数将是内部组件(Lab1
,Lab2
,Lab3
...)。如果您希望将复合组件本身作为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;
其他解决方案也是可能的。