delphi访问TControl的受保护属性

时间:2014-11-26 13:47:58

标签: delphi components protected

我正在研究delphi组件。 我一直在尝试访问自定义组件的指定父控件的onClick事件。通过指定,用户可以使用对象检查器作为属性来指定组件的父控件。父控件可以是同一表单上的任何控件组件。但是,因为我所做的所有父控件都是TControl的子类,并且TControl的onClick事件受到保护,所以我无法访问父控件的onclick事件。实际上,自定义组件就像位于父控件旁边的子组件,因此每当用户单击自定义组件时,如果存在click事件,我希望父控件的click事件发生。

当我运行此代码时,会发生类型转换异常。

 procedure TSubCom.SetParentControl(const Value : TControl);
 var
 parentContLeft : Integer;             //parent control's left + width
 parentContTop : Integer;              //parent control's top
 begin
 FParentControl := Value;
 parentContLeft := FParentControl.Left + FParentControl.Width;
 parentContTop := FParentControl.Top;
 Left := parentContLeft - (Width div 2);
 Top := parentContTop - (Height div 2);
 Repaint;
 end;

//TSubCom's onClick event is linked with its parent control's onClick event
procedure TSubCom.Click;
var
Parent: wrapClass;
begin
inherited;
if(FParentControl <> nil) then
begin
  ShowMessage(FPArentControl.Name);
  Parent := FParentControl as wrapClass;
  ShowMessage('1');
  if Assigned(Parent.OnClick) then
  begin
    Parent.OnClick(Self);
  end;
 //    FParentControl as FParentControl.ClassType;
 //    if(FParentControl.OnClick <> nil) then
 //     FParentControl.OnClick;
end;
end;

1 个答案:

答案 0 :(得分:4)

声明一个用于访问受保护成员的类, 对此类的父类进行类型转换,并且不使用OnClick事件,而是使用Click

type
  TControlAccess = class(TControl);

procedure TSubCom.Click;
begin
  inherited Click;
  if ParentControl <> nil then
    TControlAccess(ParentControl).Click;
end;