近日学习控件继承关系,由于刚开始学习,所以有些概念和信息不太了解,借一个问题以加强学习。我在学习过程中发现有些控件没有继承基类的某些事件,如OnDblClick。具体情况如下:
   我看的是BSF控件(business Skin Form 即一个皮肤控件 在2ccc.com上下载)他的bsSkinComboBox控件没有OnDblClick事件,他继承的基类是从TControl开始,我现在不明白从TControl开始每个子类没有重载OnDblClick或者其他的特别设置,为什么载bsSkinComboBox控件中无法显示OnDblClick事件。
   我试着建立了一个新单元文件,将TbsSkinComboBox的声明加在里面,并在Published中加入property OnDblClick ,也无法显示、动态生成的控件也无法响应此事件。
   在此希望,大家帮我解答。

解决方案 »

  1.   

    这个事件在Protected里面,所以才无法显示
      

  2.   

    不太明白"我试着建立了一个新单元文件,将TbsSkinComboBox的声明加在里面,并在Published中加入property OnDblClick ,也无法显示、动态生成的控件也无法响应此事件"
       你新的单元文件中的类是继自Tcontrol 还是 TbsSkincombobox, 如果是Tcontrol的话, 你在新类的published中加入property OnDblClick,是可以的
      

  3.   

    bee2518(迷茫ing):你所指的在Protected里面,是值的在那个类中的?我查看了一下,在所有的从Tcontrol到TbsSkinComboBox的继承关系中只有Tcontrol有FOnDblClick ,且在private中;procedure DblClick; dynamic;在protected中;    property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;也在protected中。那我应该怎样才能使TbsSkincombobox支持DblClick事件呢?
           zenwin(zenwin) : 我继承的类是一个中间类TbsSkinCustomComboBox。TbsSkinComboBox 的定义如下:TbsSkinComboBox = class(TbsSkinCustomComboBox)
              published
                ......
                property OnComboBoxDrawItem;
                property OnChange;
                property OnClick;
                .....
              end;
      

  4.   

    我对比了一下TComboBox的从Tcontrol继承过程,同样没有重载及修改或涉及OnDblClick事件的,但TComboBox确可以显示OnDblClick事件。
    希望大家指教。
      

  5.   

    你继承是中间类可能不行, 因为事件在Tcontrol是在protected中, 所以,你应该在直接继承自TControl的那个类中声明该事件才行
      

  6.   

    或许从TControl到TbsSkinCustomComboBox的继承类中有个处理了WndProc函数
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Panel1: TPanel;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TxyButton = class(TButton)
      private
        procedure OnxyDBClick(Sender: TObject);
      public
        constructor Create(AOwner: TComponent);override;
      published
        property OnDBlClick;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TxyButton }constructor TxyButton.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      OnDBlClick := OnxyDBClick;
      ControlStyle := ControlStyle + [csClickEvents];
    end;procedure TxyButton.OnxyDBClick(Sender: TObject);
    begin
      ShowMessage('TxyButton OnxyDBlClick');
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      with TxyButton.Create(Self) do
      begin
        Caption := 'xyButton';
        Left := 100;
        Top := 100;
        Parent := Self;
      end;
    end;end.
      

  8.   

    constructor TButton.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      ControlStyle := [csSetCaption, csDoubleClicks];//注意这里没有csClickEvents
      Width := 75;
      Height := 25;
      TabStop := True;
    end;procedure TControl.WMLButtonDblClk(var Message: TWMLButtonDblClk);
    begin
      SendCancelMode(Self);
      inherited;
      if csCaptureMouse in ControlStyle then MouseCapture := True;
      if csClickEvents in ControlStyle then DblClick;  //还有这里
      DoMouseDown(Message, mbLeft, [ssDouble]);
    end;