你的话中有很多错误。
首先,释放窗体(包括释放其他东西)不能直接对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的值的
首先,释放窗体(包括释放其他东西)不能直接对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的值的
Form2.free; 或
Tform(sender).free;
而不是将一个空指针赋值给sender对象.
另外, 不要在窗体的事件或方法中直接引用外部窗体变量
比如你上面的写法form2:=nil, 如果外部不是使用Form2 := TForm2.Create(....);而使用 aForm := TForm2.Create(...)等方法来创建窗体时,程序会出访问非法地址错误
Action := caFree;//此处只释放窗体和它拥有的控件,并没有置空变量
此外,我们为了只让窗体创建一个实例,我们通常会有下列代码:
if not Assigned(Form1) then
Form1 := TForm1.Create(Application);
Form1.Show;
在这种情况下我们通常会在Destroy事件有下列代码,以置空变量Form1
Form1 := nil;
否则在if语句判断就会出错!
Tform(sender).free;
并不能够将Form2的指针附为空。
除非过程(函数)参数用
XXX(var sender);来表示。var是表示传地址
sender与form都是指向同一个地址 procedure f(Value:integer);
begin
Value:= Value+1;
end;
procedure f(Value:TObject);
beginend;
这两个参数是完全不同的,一个是值参,另一个类似变参。
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);
才是传递变参。
begin
Tbutton(sender).free;
end;如何解释 ?
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;
它是一种什么技术?
因为sender是一个指针,其效果跟变参是一样的
但是由于它是一个指针
可以通过修改它指向的值。
我手上没有DELPHI,我用BCB试过,
Sender = NULL;
Button1的值没有改变。
试过呀。
procedure TForm1.a(var Sender: Tobject);
begin
Sender:=nil;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
a(Tobject(button1));
button1.free;
end;
button1不会释放掉,因为这个指针已经置空了。
当Sender被定义为变参,当然Button1也被同时修改了。