以下是源码,运行后点击按钮会出现message.但我希望组件在放在表单上后,在设计时期还可以为OnBtnClick写代码,请教封装组件的正确写法.谢谢!unit OPEN;interfaceuses
  SysUtils, Classes, Controls, StdCtrls, Messages,ExtCtrls,Dialogs;type
  TOPEN = class(TWinControl)
  private
    FDJNO:TEdit;
    FBtnOpen: TButton;
    { Private declarations }
  protected
    { Protected declarations }
  public
    constructor Create(AOwner:TComponent);override;
    destructor destroy;override;
    { Public declarations }
  published
    procedure OnBtnClick(Sender: TObject);
    { Published declarations }
  end;procedure Register;implementation//--------------------
procedure Register;
begin
  RegisterComponents('MyCls', [TOPEN]);
end;//--------------------
constructor TOPEN.Create(AOwner:TComponent);
begin
  inherited;
  Height:=40;
  width:=157;  FDJNO:=TEdit.Create(nil);
  FDJNO.parent:=self;
  FDJNO.top:=11;
  FDJNO.left:=50;
  FDJNO.width:=58;  FBtnOpen:=TButton.Create(nil);
  FBtnOpen.parent:=self;
  FBtnOpen.top:=11;
  FBtnOpen.left:=111;
  FBtnOpen.width:=32;
  FBtnOpen.caption:='开启';
  FBtnOpen.OnClick := OnBtnClick;
end;//---------
destructor TOPEN.destroy;
begin
  FDJNO.free;
  FBtnOpen.free;
  inherited;
end;//---------
procedure TOPEN.OnBtnClick(Sender: TObject);
begin
  showmessage('btn click');
end;end.

解决方案 »

  1.   

    看看《delphi开发人员指南》,要把事件定义成属性!
      

  2.   

    private
       FOnBtnClick : TNotifyEvent;
    published
     property OnBtnClick: TNotifyEvent read FOnBtnClick write FOnBtnClick;
      

  3.   

    TO tiankj:
    按您讲的做了,下面是全部代码,但关于 TOPEN.FOnBtnClick 的代码无论怎样修改,都说
    [Error] OPEN.pas(69): Declaration of 'FOnBtnClick' differs from previous declaration
    //---------------------------------------
    unit OPEN;interfaceuses
      SysUtils, Classes, Controls, StdCtrls, Messages,ExtCtrls,Dialogs;type
      TOPEN = class(TWinControl)
      private
        FDJNO:TEdit;
        FBtnOpen: TButton;
        FOnBtnClick : TNotifyEvent;
        { Private declarations }
      protected
        { Protected declarations }
      public
        constructor Create(AOwner:TComponent);override;
        destructor destroy;override;
        { Public declarations }
      published
    //    procedure OnBtnClick(Sender: TObject);
        property OnBtnClick: TNotifyEvent read FOnBtnClick write FOnBtnClick;
        { Published declarations }
      end;procedure Register;implementation//--------------------
    procedure Register;
    begin
      RegisterComponents('MyCls', [TOPEN]);
    end;//--------------------
    constructor TOPEN.Create(AOwner:TComponent);
    begin
      inherited;
      Height:=40;
      width:=157;  FDJNO:=TEdit.Create(nil);
      FDJNO.parent:=self;
      FDJNO.top:=11;
      FDJNO.left:=50;
      FDJNO.width:=58;  FBtnOpen:=TButton.Create(nil);
      FBtnOpen.parent:=self;
      FBtnOpen.top:=11;
      FBtnOpen.left:=111;
      FBtnOpen.width:=32;
      FBtnOpen.caption:='开启';
      FBtnOpen.OnClick := FOnBtnClick;
    end;//----------
    destructor TOPEN.destroy;
    begin
      FDJNO.free;
      FBtnOpen.free;
      inherited;
    end;procedure TOPEN.FOnBtnClick;
    //procedure TOPEN.OnBtnClick(Sender: TObject);
    //procedure TOPEN.OnBtnClick(Sender: TObject);TNotifyEvent;
    begin
      showmessage('组件中按了btn ');
    end;end.
      

  4.   

    public 
    procedure OnBtnClick(Sender: TObject);
    procedure TOPEN.OnBtnClick(Sender: TObject);
    begin
      if assinged(FOnBtnClick) then
        OnBtnClick(self)
      showmessage('组件中按了btn ');
    end;
      

  5.   

    TO  tiankj()  :这样会和 published 中的 OnBtnClick 同名,只好把 published 中的改名. 于是可以编译通过,但是点击btn时,没有任何反应.我的最终目的是:对于btn而言,既能把公用的代码写在组件里,又能在设计时期再添加代码. 
    各位能否把一楼的代码复制到您的机器上试试呢?
      

  6.   

    constructor TOPEN.Create(AOwner:TComponent);

    FBtnOpen.OnClick := OnBtnClick;该了吗?
      

  7.   

    调试好的unit OPEN;interfaceuses
      SysUtils, Classes, Controls, StdCtrls, Messages,ExtCtrls,Dialogs;type
      TOPEN = class(TWinControl)
      private
        FDJNO:TEdit;
        FBtnOpen: TButton;
        FOnBtnClick : TNotifyEvent;
        { Private declarations }
      protected
        { Protected declarations }
      public
        constructor Create(AOwner:TComponent);override;
        destructor destroy;override;
        { Public declarations }
      published
        procedure BtnClick(Sender: TObject);
        { Published declarations }
        property OnBtnClick: TNotifyEvent read FOnBtnClick write FOnBtnClick;  end;procedure Register;implementation//--------------------
    procedure Register;
    begin
      RegisterComponents('MyCls', [TOPEN]);
    end;//--------------------
    constructor TOPEN.Create(AOwner:TComponent);
    begin
      inherited;
      Height:=40;
      width:=157;  FDJNO:=TEdit.Create(nil);
      FDJNO.parent:=self;
      FDJNO.top:=11;
      FDJNO.left:=50;
      FDJNO.width:=58;  FBtnOpen:=TButton.Create(nil);
      FBtnOpen.parent:=self;
      FBtnOpen.top:=11;
      FBtnOpen.left:=111;
      FBtnOpen.width:=32;
      FBtnOpen.caption:='开启';
      FBtnOpen.OnClick := BtnClick;
    end;//---------
    destructor TOPEN.destroy;
    begin
      FDJNO.free;
      FBtnOpen.free;
      inherited;
    end;//---------
    procedure TOPEN.BtnClick(Sender: TObject);
    begin
      showmessage('btn click');
      if assigned(FOnBtnClick) then
        OnBtnClick(self);
    end;end.
      

  8.   

    对了对了,就是这个意思. BtnClick 用来写组件中通用的代码,OnBtnClick中写实例中添加的代码.
    谢谢了,接分!