procedure TForm1.Label1Click(Sender: TObject);
begin
Sender.Free;
end;procedure TForm1.Label2Click(Sender: TObject);
begin
 Sender.Free;
end;
第一个可以执行,第二个不行;为什么????

解决方案 »

  1.   

    如:
       label1:=nil;
       Sender.Free;
      

  2.   

    在控件产生事件中释放这个控件有时会导致保护错误(Access violation),一般可以PostMessage给Form的Handle,如自定义的WM_FREELABEL2,然后书写消息接管程序,在其中释放。
      

  3.   

    再说两句,Label类别本身不是具备Handle的控件,靠Vcl的事件分派机制重新伪装成有事件接管能力的控件,而VCL是在Form的Controls表中查找Label控件,找到后留下的是个Index,然后调用Label的事件处理程序,之后又用这个Index做后续的一些事情,如果调用label的事件处理程序中释放了这个Label就导致后面使用这个Index出现问题。所以要异步的通过消息机制释放Label。不过我的另外的一个建议是设置Label的Visible属性,不知是否适合你的情况