时间限制关闭窗体的几点体会

Posted jankerxp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间限制关闭窗体的几点体会相关的知识,希望对你有一定的参考价值。

一个单据自助录入小项目,界面上的窗体显示有时间限制,一种是强制时间限制关闭,一种是空闲多少时间后关闭。(有点类似ATM机界面,ATM机一般只有一种强制改变的)

关闭后返回的窗体也有2种,一种是上一级窗体,另一种是主窗体。一般强制时间关闭的是返回上一级窗体,空闲时间关闭的窗体关闭后直接返回主窗体(返回窗体可以设置)。

一开始用几个定时器,但是因为又要计时显示,又要中断计时(空闲检测),又要处理自动关闭和手工关闭区别,搞的逻辑好混乱,效果不理想。后来又用线程,消息等等,还是不理想。

经过2天的修修改改,总算达到了比较满意的效果。

注意几点:

1,循环检测状态转移处理的过程,不能在窗体事件中进行,而是要在计时器中处理。比如不能在窗体的OnActivate中或OnShow中处理,而是要通过一个定时器来进行。OnActivate中或OnShow中只是触发定时器运行,这样才能跳出窗体事件(不然手工不能关闭)。

2,空闲检测到后再延时计时改变处理,(比如:检测键盘鼠标空闲30秒后,然后计时显示15秒准备关闭,如果15秒内还是空闲,则关闭窗体;如果15秒内有键盘鼠标动作了,则重新进行30秒的键盘鼠标检测),开始是与2个定时器来检测,一个是30秒的空闲检测,一个是15秒内的键盘鼠标动作检测,总是不行,15秒的准备关闭时间中断不了,原来是不能用2个计算器,只能用一个30秒的检测定时器,15秒的检测处理要放在30秒的检测定时器的循环过程中进行处理,这样才能中断准备关闭状态。

3,不要用线程处理,用线程搞的逻辑很复杂,除非只有一种强制关闭的类型。也不要用消息,MessageManager的机制就是回调,是同步的而不是异步的,和WINDOWS的SendMessage()一样的同步处理,而不是PostMessage()的异步处理,在这种情况下同步机制不好处理,要异步才行。(MessageManager只有SendMessage(),没有PostMessage())

4,还是有不方便的地方,因为是在祖宗窗体中处理这些过程,用到了一个手动关闭的标志,所以继承的子窗体的手动关闭动作中,要设置这个手动关闭标志,目前还没有想到什么好办法来省略设置这个手动关闭标志。

5,目前的窗体只适用于模态窗体,还没有可考虑非模态窗体(项目中使用模态窗体实现)。

注:代码混合了其它的东西,这部分的代码没有抽取出来,以后抽出来了再放上来。

以上是关于时间限制关闭窗体的几点体会的主要内容,如果未能解决你的问题,请参考以下文章

delphi 窗体的创建和释放

C# - Winform: 在窗体加载的过程中截获异常,如何不让窗体显示出来。

创建新的 GUI 时,WPF 是否 Windows 窗体的首选? [关闭]

博客园WPF Application类

为啥 Excel 2010 VBA 用户窗体文本框字体会根据框架的大小而变化?

Winform开发中的窗体重复及灵活切换问题