这段代码是完全正确的  就想问 那个动态生成的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.

解决方案 »

  1.   

    var bitbtn1: TBitBtn;bitbtn1是一个局部变量。因此在函数FormMouseDown之外是不能访问bitbtn1的。但是,由于bitbtn1 := TBitBtn.Create(self);
    这儿相当于创建了一个TBitBtn 的对象,将这个对象的指针指向到bitbtn1 。
    函数FormMouseDown结束后,仅仅是bitbtn1 (这个指针)的空间被释放,这个对象并没有被释放。由于这个对象没有Free释放,因此这个对象在整个程序的执行过程中都是存在的。
      

  2.   

    还有个问题就是这个click函数
    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参数一样才可以进行赋值呢?
      

  3.   

    先回答你第2个问题:是的参数是要保持一致的,sender as object
    例外第一个问题,是要看你怎么实例化你的bitbtn控件,如果你是create(nil) 只是需要自己释放的,如果是(self)这是所在的窗口子类。所有的释放任务交给了form,就如设计阶段添加的控件一样