有一种情况:动态生成的控件不在Components数组里,何故?(100分)

  • 主题发起人 主题发起人 hwave
  • 开始时间 开始时间
H

hwave

Unregistered / Unconfirmed
GUEST, unregistred user!
各位老师,请看代码:
unit CSBtn; //自定义能够动态生产控件的按钮
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TCSBtn = class(TButton)
private
{ Private declarations }
protected
procedure Click; override;
public
constructor Create(AOwner: TComponent); override; //构建
destructor Destroy; override;
published
{ Published declarations }
end;

procedure Register;

var
MyList: TList;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TCSBtn]);
end;

{ TCSBtn }
constructor TCSBtn.Create(AOwner: TComponent);
begin
inherited;
MyList := TList.Create;
end;

destructor TCSBtn.Destroy;
begin
MYList.Free;
inherited;
end;

procedure TCSBtn.Click;
var
mybutton: tbutton;
temp: integer;
begin
if mylist <> nil then
begin
mybutton := tbutton.create(self);
mybutton.parent := Self.parent;
temp := mylist.add(mybutton);
with mybutton do
begin
top := temp * 25;
left := 0;
caption := inttostr(temp);
end;
end;
end;
end.
//=================================================================

//在新开项目的form上放置数个Button,一个CSBtn
unit csU; //测试单元

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
CSBtn, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
CSBtn1: TCSBtn;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
for I := 0 to ComponentCount - 1 do
begin
if Components is Tbutton then
begin
Tbutton(Components).caption:='0';
end
end;
end;

end.

//=================================================================
单击CSBtn1按钮,动态生成数个Button,再点击Button1,设计时创建的Button的
caption的内容被置为 '0',而动态生成的Button没有变化,动态生成的button不在
Components的数组里,何故?怎样他们才能出现在Components数组中
 

mybutton.parent := Self.parent;
改为
mybutton.parent := Self;
试试。
 
to:ydejun
如果改为
mybutton.parent := Self;
则生成的Button会在csbtn按钮里
 
在Application.Components
 
mybutton := tbutton.create(self);
你这一句大有问题。不过我实在搞不懂你这样做的意义是什么。或许只是为练手吧。呵呵

你上面的一句已经把所有的动态创建的BUTTON的OWNER属性设为了tCSBTN, 当然在FORM1的
Components数组里找不到了,因为他在CSBTN1的Components数组里啊。
你改成这样的,
mybutton := tbutton.create(self.parent);
别的地方不要动, 就行了。
 
确实是为了练习,shangshang判断正确,我够晕的,接受答案
 
后退
顶部