在弹出的那个窗口的public中添加:
procedure WMKillFocus (var message : TWMKillFocus);
message WM_KILLFOCUS;
...
procedure TForm2.WMKillFocus (var message : TWMKillFocus);
begin
  Close ();
end;
...
如果这个窗口是模态的,那么要点击别的程序窗口能关掉;如果是非模态的,那么就完全能满足要求。

解决方案 »

  1.   

    有一个叫做ComboEdit的控件就是这样的,而且做得很好看
    你去搜搜看吧.
      

  2.   

    Form1为调用的窗体.TForm1 = class(TForm)
      procedure Button1Click(Sender: TObject); 
     private  
      procedure CMMouseButton(var Message: TMessage); message WM_LBUTTONDOWN;
      procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
      procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
     end;implementationuses unit2;procedure TForm1.Button1Click(Sender: TObject);
    begin
     with TForm2.Create(Form2) do try
      ShowModal;
     finally
      Free;
     end;
    end;procedure TForm1.CMMouseButton(var Message: TMessage);
    begin
     if (message.WParam = MK_LBUTTON) and inForm then begin
      inMain := true;
      showmessage('老兄,别在窗口外乱点。');
      SetCapture(Application.MainForm.handle);
      inMain := false;
     end;
    end;procedure TForm1.CMMouseEnter(var Message: TMessage);
    begin
     if not assigned(form2) then
      SetCapture(Application.MainForm.handle);
    end;procedure TForm1.CMMouseLeave(var Message: TMessage);
    begin
     ReleaseCapture
    end;
    Form2为ShowModal出的窗体.TForm2 = class(TForm)
     private   
      procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
      procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
     end;var
     Form2: TForm2;
     inForm: boolean = false;
     inMain: boolean =false;implementationprocedure TForm2.CMMouseEnter(var Message: TMessage);
    begin
     ReleaseCapture;
     inForm:=false;
    end;procedure TForm2.CMMouseLeave(var Message: TMessage);
    begin
     if inMain then exit;
     SetCapture(Application.MainForm.handle);
     inForm:=true;
    end;