如何实现单击构件以外Form上任意区域,释放掉构件?
就像TDateTimePicker一样,单击小三角按钮,弹出日历,如果在Form上其他地方单击鼠标,便会释放日历

解决方案 »

  1.   

    procedure TForm_Login.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    if Image1=nil then
      exit;
    if sender<>Image1 then
      iMage1.Hide;
      freeandnil(iMage1);
    end;
      

  2.   

    如果是form则可以在
    procedure TForm_Login.FormDeactivate(Sender: TObject);
    中实现代码。
      

  3.   

    pukerno3(飞天) 的方法不可行,因为很多控件会拦截MouseDown事件的,form接收不到的(例如Panel)。TDateTimePicker中的小窗体是单独的一个窗口,可以针对这个窗口写代码。例如,OnExit或者拦截失去焦点的消息。不过,有的点击动作是不会引起失去焦点的动作的。因此,也可以在Application.OnMessage里面拦截MouseDown事件,判断窗口句柄,然后采取相应动作。
      

  4.   

    一般情况下,鼠标从一个窗体移动到另外一个窗体的时候,前一个窗体会得到
    一个失去焦点的消息,在这个消息的函数中可以用postmessage函数发送自定义消息个父窗口,父窗口在得到消息后可以free掉这个窗口.
      

  5.   

    http://expert.csdn.net/Expert/topic/1115/1115840.xml?temp=.1489984
      

  6.   

    只要你需要销毁的控件有OnExit事件,那么在相应的事件处理程序中写如下代码就OK:
    Sender.Free;
    很典型的例子就是:DBGrid中的单元格,编辑时是动态创建的编辑器,离开时自动销毁(释放)。
      

  7.   

    在FORM的OnClick中判断是否有相应的窗体存在,如果存在就Hide它不就OK,很简单的技术啊,哪里要去销毁呢,每次都销毁再重建那还不搞死人啊