你的话中有很多错误。
首先,释放窗体(包括释放其他东西)不能直接对Tform(Sender):=nil或者form2:=nil
这样只能把form2指针设置为NIL,而没有释放内存。
而应该用form.Free;来释放。其次,不应该在form的Close事件中来释放本窗体。
应该这样做:
form2:= TForm2.Create(NIL);
form2.ShowModal;
form2.Free; //应该这样释放最后,在close事件中
Sender是一个指针参数
Sender := NIL;
是把该参数设置为NIL,和form2完全没有关系。
好比说procedure f(Value:integer);
begin
  Value:= Value+1;
end;
f(i); //这样是不能改变i的值的

解决方案 »

  1.   

    Close中的Sender对象是Form2,正如"windindance(风舞轻扬)"所说的那样,如你想释放掉窗口,你应该使用如下语句:
     Form2.free; 或
     Tform(sender).free;
    而不是将一个空指针赋值给sender对象.
      

  2.   

    呵呵,可以在OnClose中写Action := caFree;这样当窗体关闭时将自动释放
    另外, 不要在窗体的事件或方法中直接引用外部窗体变量
    比如你上面的写法form2:=nil, 如果外部不是使用Form2 := TForm2.Create(....);而使用 aForm := TForm2.Create(...)等方法来创建窗体时,程序会出访问非法地址错误
      

  3.   

    通常在OnClose这样写即可释放窗体
    Action := caFree;//此处只释放窗体和它拥有的控件,并没有置空变量
    此外,我们为了只让窗体创建一个实例,我们通常会有下列代码:
    if not Assigned(Form1) then
       Form1 := TForm1.Create(Application);
    Form1.Show;
    在这种情况下我们通常会在Destroy事件有下列代码,以置空变量Form1
    Form1 := nil;
    否则在if语句判断就会出错!
      

  4.   

    sender传的是对象的值。而不是地址。
    Tform(sender).free;
    并不能够将Form2的指针附为空。
    除非过程(函数)参数用
    XXX(var sender);来表示。var是表示传地址
      

  5.   

    to windindance(风舞轻扬) 对象是一个指针 。
    sender与form都是指向同一个地址 procedure f(Value:integer);
    begin
      Value:= Value+1;
    end;
    procedure f(Value:TObject);
    beginend;
    这两个参数是完全不同的,一个是值参,另一个类似变参。
      

  6.   

    to sandahrow(超人狄加)
    sender与form的确都是指向同一个地址。
    但是修改sender,并不代表form被修改。
    procedure f(Value:integer);
    begin
      Value:= Value+1;
    end;
    procedure f(Value:TObject);
    begin
      ...
    end;
    f (some_param);
    两个是相同的,都是值参。
    不过Value:TObject传递的是指针【值】而已。
    Value指向的值被修改,some_param指向的值也被修改。
    但是:
    !Value被修改,some_param并不会被修改!
    只有procedure f(var Value:TObject);
    才是传递变参。
      

  7.   

    to windindance(风舞轻扬) procedure TForm1.Button1Click(Sender: TObject);
    begin
       Tbutton(sender).free;
    end;如何解释 ?
      

  8.   

    这儿Sender相当于是一个指针
    Tbutton(sender).free;是调用sender指向的对象的free函数,
    析构的是Sender指向的对象,而非Sender
    Sender = NIL;是将Sender设置为NIL,而非Sender指向的对象你可以实际试一试。
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    //   Sender := NIL; //不会影响实际的Button1.
    //   Button1 := NIL; //问题来了:Button1的值被设置为NIL了//   Sender.Free;
    //   Button1.Free; //这两句是一样的,因为都是对Sender/Button1指向的对象操作
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
       Caption := Button1.Caption;//只是一个测试,看Button1的值
    end;
      

  9.   

    另外,你可以在Button1Click事件中设置一个断点,可以看到Sender和Button1的地址是不一样的(注意:值是一样的!)
      

  10.   

    试过,看来sender在某种情况下,有值参的效果,又有变参的效果。
    它是一种什么技术?
      

  11.   

    因为sender和button都是指向同一个地址的指针,所以你用sender:=nil实际是把sender指向的地址置为空,所以对button当然没有影响啦,你仍然可以通过button进行操作,因为它还是可以找到系统为它分配的地址.
    因为sender是一个指针,其效果跟变参是一样的
      

  12.   

    变参的实现方法也是通过指针来实现的,只不过语法上来说参数前面用var保留字来定义。
      

  13.   

    Sender本身是值参
    但是由于它是一个指针
    可以通过修改它指向的值。
      

  14.   

    不过,还是有一点区别,变参在这种情况下sender:=nil,同时也对button指针指向的地址置空。
      

  15.   

    你试过了?
    我手上没有DELPHI,我用BCB试过,
    Sender = NULL;
    Button1的值没有改变。
      

  16.   

    我说的这个sender是在被定义成变参的时候。
    试过呀。
    procedure TForm1.a(var Sender: Tobject);
    begin
      Sender:=nil;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      a(Tobject(button1));
      button1.free;
    end;
    button1不会释放掉,因为这个指针已经置空了。
      

  17.   

    我理解错了
    当Sender被定义为变参,当然Button1也被同时修改了。