这段代码是完全正确的 就想问 那个动态生成的TBitBtn的生存期难道是整个程序执行过程吗?它不是一个局部的变量吗?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ImgList,Buttons;type
TForm1 = class(TForm)
ImageList1: TImageList;
procedure click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
var i : integer;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var label1 : TLabel;
begin
label1 := TLabel.Create(self);
label1.Left := 50;
label1.Top := 50;
label1.Caption := ' a label';
label1.Parent := self;
label1.Show;
i:=0;
end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var bitbtn1: TBitBtn;begin
if ssleft in Shift then
begin
bitbtn1 := TBitBtn.Create(self);
bitbtn1.Left := X;
bitbtn1.Top := y;
bitbtn1.Caption := 'click me';
bitbtn1.Parent := self;
bitbtn1.Tag := i;
i := i+1;
ImageList1.GetBitmap(1,bitbtn1.Glyph);
bitbtn1.show;
bitbtn1.OnClick := click;
end
end;procedure TForm1.click(Sender : TObject);
var but: TBitBtn;
beginif Sender is TBitBtn then
but := Sender as TBitBtn;
ShowMessage('the tag is'+inttoStr(but.Tag)+'.');
end;
end.
这儿相当于创建了一个TBitBtn 的对象,将这个对象的指针指向到bitbtn1 。
函数FormMouseDown结束后,仅仅是bitbtn1 (这个指针)的空间被释放,这个对象并没有被释放。由于这个对象没有Free释放,因此这个对象在整个程序的执行过程中都是存在的。
procedure TForm1.click(Sender : TObject);
var but: TBitBtn;
begin
if Sender is TBitBtn then
but := Sender as TBitBtn;
ShowMessage('the tag is'+inttoStr(but.Tag)+'.');
end;
end. 它的参数是不是必须要和onclick的ACTION参数一样才可以进行赋值呢?
例外第一个问题,是要看你怎么实例化你的bitbtn控件,如果你是create(nil) 只是需要自己释放的,如果是(self)这是所在的窗口子类。所有的释放任务交给了form,就如设计阶段添加的控件一样