请问如何用鼠标点击Dialog以外的区域时,关闭对话框。 ( 积分: 100 )

  • 主题发起人 主题发起人 WangZhaoHui
  • 开始时间 开始时间
我的form2是showmodal的。要是show的就简单多了。<br>我的本意就是showmodal的form2也能象show的form2一样。一点击窗体以外的区域就隐藏或失去焦点了。我原来没考虑太周全。只是简单的按esc关闭。后来发现太麻烦。就问问有没有补救的办法。要是用show就容易多了。
 
刚刚我试了下SetCapture,好像确实不行。大家用过Spy++吧?上面点一个按钮,然后移动鼠标,Spy++能收到消息!我记得以前我在DFW上看到这个解决方案的,可是现在想不起来具体用的那个函数(我印象中好像是SetMouseCapture什么的,可是我找了半天也没找到这个函数),唉。
 
可以参考以下类似 Popupedit 等的控件代码
 
参考dxDBTree(DevExpress)
 
我知道。但没参考明白啊。
 
blue]Beyondbill[/blue]已经说得很明白了.<br><br>实现窗体的OnDeactivate事件<br>示例<br>procedure TfrmTest.FormDeactivate(Sender: TObject);<br>begin<br> &nbsp;Close;<br>end;
 
to gear1023:<br>我的form是showmodal的。没有办法触发FormDeactivate事件的。除非是点按窗体内。我是不能点窗体内的,只能点按窗体外。
 
来自:WangZhaoHui, 时间:2005-12-26 17:25:59, ID:3309196<br>是啊。实在不行我只能用form.show;然后free了。唉。<br>我原来就是想做个类似combox一点下拉出一条条信息。但没有标题栏。我自己想做一个。将form.style 设成bsNone.一点别的地方就关闭了或隐藏了。 <br><br>如果说你只想做一个ComboBox的下拉列表,用Form来封装的话,那就应该用Show,而不是ShowModal。用ShowModal确实用我上面给你的方法不行,用Show没问题的
 
主要是我想这样<br>procedure Tmainform.button1click(sender:tobject);<br>begin<br> &nbsp;if form2.showmodal = mrOK then<br> &nbsp;begin<br> &nbsp; &nbsp;mainform的处理(edit1.text := ***)<br> &nbsp;end;<br>end;<br>如果我用show, 没办法在过程中间停下来啊。只能谁用form2,form2就得use谁,处理在form2里写,通用性太差了。谁还有什么高见吗
 
像这样也不是没办法的,告诉你一种方法,而且可以减低像你这样的高耦合<br>在Form2中设置一个回掉方法方法属性,比如说叫OnMyClose;<br>具体示例如下<br><br>TForm2 = class(TForm)<br>private<br> &nbsp;FOnMyClose : TNotifyEvent;<br>protected<br><br>public<br><br>published<br> &nbsp;Property OnMyClose : TNotifyEvent read FOnMyClose write FOnMyClose;<br>end;<br><br>......省略.....<br><br>procedure TForm2.FormClose(Sender: TObject;<br> &nbsp;var Action: TCloseAction);<br>begin<br> &nbsp;if Assigned(OnMyClose) then<br> &nbsp; OnMyClose(Sender);<br>end;<br><br>在主窗体中<br><br>Tmainform= class(TForm)<br>private<br> &nbsp;form2 : TForm2;<br>protected<br> &nbsp;procedure DoClose(Sender : TObject);<br>public<br><br>published<br><br>end;<br><br>.....省略...<br><br>procedure Tmainform.button1click(sender:tobject);<br>begin <br> &nbsp;form2 := TForm2.Create(sender);<br> &nbsp;form2.OnMyClose := DoClose;<br> &nbsp;form2.Show;<br>end;<br><br>procedure Tmainform.Doclose(Sender : TObject);<br>begin<br> &nbsp;mainform的处理(edit1.text := ***)<br>end;<br><br>通过上面这样一处理,大大降低了窗体间的耦合性,form2不需要知道主窗体的存在
 
谢谢Beyondbill,有完整的例子粘一个吗。
 
多人接受答案了。
 
后退
顶部