我的目的很简单,在窗体的OnShow中检测一些条件,如果条件不成立则关闭该窗体。
在OnShow中直接调用Close不行,我使用PostMessage(Self.Handle,WM_Close,0,0);
可以关闭。但有缺陷:
PostMessage后,如果再调用ShowMessage之类的过程,或者发生Exception时
(有出错提示)则PostMessage就无效,也就是说窗体关不掉。
不知道PostMessage的消息是不是被丢掉了。另外把PostMessage换成SendMessage或
self.perform也不行。
有什么方法能够正确关闭窗体呢?各位能给我点提示吗?谢谢!
在OnShow中直接调用Close不行,我使用PostMessage(Self.Handle,WM_Close,0,0);
可以关闭。但有缺陷:
PostMessage后,如果再调用ShowMessage之类的过程,或者发生Exception时
(有出错提示)则PostMessage就无效,也就是说窗体关不掉。
不知道PostMessage的消息是不是被丢掉了。另外把PostMessage换成SendMessage或
self.perform也不行。
有什么方法能够正确关闭窗体呢?各位能给我点提示吗?谢谢!
解决方案 »
- 请问ADOTable1为什么不能保存?
- 数据太长,导出到EXCEL占EXCEL的空间太大
- 如何HOOK子控件的WM_COMMAND消息?
- 请问 DBgrid 的属性dgRowSelect设为true时,无论点击某一列都会跳到首列,如何解决?
- 请问如果在数据集每次open的时间,将当前数据集每条记录前都插入相应的序号?
- 考勤机+中等复杂业务的 人事工资管理系统 一般是什么价位(开发)
- 关于dbgrid的问题!师傅请进!!
- delphi操作Excel,大家来帮忙!
- 请问如何用delphi显示gif格式的图片呢?
- 呵呵,花了三个月业余时间用DELPHI写了一个N层数据库系统,得到RMB1500,各位认为值吗?
- ActiveForm中OnStartPage为何没有反应??请帮忙
- 怎樣在ListView中的焦點單元格中顯示為下拉列表﹖
application.terminate
也别告诉我在外面判断完之后在Show窗体。
利用一个定时器,检测到F_Close=True就Close;
Form1代码:procedure TForm1.Button1Click(Sender: TObject);
var
AFrm : Tform;
begin
AFrm := TForm2.Create(application);
AFrm.Show;
Afrm.free;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage('Hello');
end;Form2代码:
procedure TForm2.FormShow(Sender: TObject);
begin
PostMessage(handle,wm_close,0,0);
end;
你把 showmessage('Hello'); 写到 TForm2.FormClose 事件里试试。
没问题呀
Form2的Close永远不会执行! 它只会执行Destroy.
show只是post了一个paint消息,这个消息只会加到消息队列,不一定会立刻执行,也就是说这时候窗体还不一定画出来,你用close是肯定不行的。
你用PostMessage(Self.Handle,WM_Close,0,0),也只是post了一个close消息,然后排队,他排在了paint的后面,因为paint首先得到处理,然后才处理close,所以你能够关闭。如果发生异常,窗口不会继续porcessmessage,所以你post的close不一定得到处理,就象sleep函数。
如果你是要结束整个应用,可以用application.terminate;
我是个菜鸟,你的问题我再想想
()000o
( )
) /
(__/
我认为设置Timer方法可以实现,但表现上不太好。
最后我的应用还是把判断放在Show之前(经管有两个窗体都要Show同一个form)。
同意movingboy(movingboy)和wengj()的建议,另外特别感谢:lws0472(天外飞仙) 的解释。
虽然结贴,但讨论继续……有更好的方法希望相互交流!
1. 在窗体formX中定义公共方法,如Open
public
procedure Open;procedure formX.Open;
begin
// 进行需要的判断
// ....
if True then Self.Show;
end;
2. 需要formX显示时,调用formX.Open;看懂了吗?
如果需要ShowModal, 将procedure改为function并返回
Result := Self.ShowModal;
万无一失!