我用一个panel并在上面加一个button做了一个很简单的组件,不知怎的,panel上的button老是在我安装组件后,button总是看不见。
代码如下:
   unit panelActive;interfaceuses
  Windows, Messages, SysUtils, Classes,Variants, Forms, Controls,
  Graphics, Dialogs, ExtCtrls, StdCtrls;type
  TpanelAAA = class(Tpanel)
  private
    Procedure ClickButton(sender : TObject);
    { Private declarations }
  protected
    { Protected declarations }
  public
    a : integer;
    Button : TButton;
    constructor Create(AOwner : TComponent);override;
    { Public declarations }
  published
    { Published declarations }
  end;procedure Register;implementationprocedure Register;
begin
  RegisterComponents('MyConponent', [TpanelAAA]);
end;Procedure TpanelAAA.ClickButton(sender : TObject);
var
  i: integer;
begin
  if (a mod 2) = 0 then
  begin
  for i:= 10 to 100 do
    begin
    Height := i* 2;
    Refresh;
    end;
  end else
  begin
  for i := 100 downto 10 do
  begin
    Height := i* 2;
    Refresh;
  end;
  end;
  a:= a+1;
end;
constructor TpanelAAA.Create(AOwner : TComponent);
begin
  Button := TButton.Create(self);  Button.Top := Top;
  Button.Left := Left;
  Button.Show;
  Button.OnClick := ClickButton;
  inherited Create(AOwner);
end;end.

解决方案 »

  1.   

    在TPanelAAA.Create里加
    Button.Parent := Self
      

  2.   

    xzgyb(老达摩) :为什么在加了Button.Parent := Self;这一句后,安装的组件,不能加载到一个窗体上并提示地址访问错误:Access violition at Address at 00000000,read of address 00000000;这是怎么回事?
      

  3.   

    constructor TpanelAAA.Create(AOwner : TComponent);
    begin
      inherited Create(AOwner);  Button := TButton.Create(self);
      Button.Parent := Self;
      Button.Top := Top;
      Button.Left := Left;
      Button.Show;
      Button.OnClick := ClickButton;
    end;
      

  4.   

    Button.Parent := Self;
    Button.Show;
    都是多余的!constructor TpanelAAA.Create(AOwner : TComponent);
    begin
      inherited Create(AOwner);
      Button := TButton.Create(self);
      Button.Top := Top;
      Button.Left := Left;
      Button.OnClick := ClickButton;
      InsertControl(Button);
    end;
      

  5.   

    同意上面的。
    constructor TpanelAAA.Create(AOwner : TComponent);
    begin
      inherited Create(AOwner);  //
      Button := TButton.Create(self);
      Button.Parent := Self;  //加上
      Button.Top := Top;
      Button.Left := Left;
      Button.Show;
      Button.OnClick := ClickButton;
    //  inherited Create(AOwner);  //移到开头
    end;另外你必须加入Destroy  ...
      
      destructor Destroy; override;
      
      ...  destructor TpanelAAA.Destroy;
      begin
        Button.Free;
        ...
      end;
      

  6.   

    更正:
    另外你必须加入Destroy  ...
      
      destructor Destroy; override;
      
      ...  destructor TpanelAAA.Destroy;
      begin
        Button.Free;
        ...
        inherited;  //
      end;
      

  7.   

    这样写:
    constructor Tpanel1.Create(AOwner : TComponent);
    begin
      inherited Create(AOwner);
      Button := TButton.Create(self);
      Button.Parent:=self;
      Button.Top := Top;
      Button.Left := Left;
      Button.Show;
      Button.BringToFront;
      Button.OnClick := ClickButton;end;
      

  8.   

    指定Button的Owner之后,
    Button.Free是多余的。
    没必要再在析构函数里加Button.Free这行。
      

  9.   

    不指定Button的父窗体,Button是显示不出来的
      

  10.   

    赞成有以下语句:Button.Parent := Self;
    Button.Visible := true ;
      

  11.   

    此代码改为:
    unit panel1;interfaceuses
      Windows, Messages, SysUtils, Classes,Variants, Forms, Controls,
      Graphics, Dialogs, ExtCtrls, StdCtrls;type
      TpanelAAA = class(Tpanel)
      private
        Procedure ClickButton(sender : TObject);
        { Private declarations }
      protected
        { Protected declarations }
      public
        a : integer;
        Button : TButton;
        constructor Create(AOwner : TComponent);override;
        destructor Destroy; override;
        { Public declarations }
      published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('MyConponent', [TpanelAAA]);
    end;Procedure TpanelAAA.ClickButton(sender : TObject);
    var
      i: integer;
    begin
      if (a mod 2) = 0 then
      begin
      for i:= 10 to 100 do
        begin
        Height := i* 2;
        Refresh;
        end;
      end else
      begin
      for i := 100 downto 10 do
      begin
        Height := i* 2;
        Refresh;
      end;
      end;
      a:= a+1;
    end;
    constructor TpanelAAA.Create(AOwner : TComponent);
    begin
      inherited Create(AOwner);
      Button := TButton.Create(aowner);//»òButton:=TButton.Create(TPanel(Self));
      Button.Parent:=tPanel(self);
      Button.Top := Top;
      Button.Left := Left;
      Button.Show;
      Button.OnClick := ClickButton;end;destructor TpanelAAA.Destroy;
    begin
      Button.Free;
    end;end.以上代码在编辑其它程序,使用此组件时,运行会有错误,提示"TButton 没有找到."。如果在程序窗体上加一个Button就可以运行但这时实际在自定义的组件中有2个button。这是为什么。