我用一个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.
代码如下:
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.
Button.Parent := Self
begin
inherited Create(AOwner); Button := TButton.Create(self);
Button.Parent := Self;
Button.Top := Top;
Button.Left := Left;
Button.Show;
Button.OnClick := ClickButton;
end;
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;
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;
另外你必须加入Destroy ...
destructor Destroy; override;
... destructor TpanelAAA.Destroy;
begin
Button.Free;
...
inherited; //
end;
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;
Button.Free是多余的。
没必要再在析构函数里加Button.Free这行。
Button.Visible := true ;
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。这是为什么。