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

一个单据自助录入小项目,界面上的窗体显示有时间限制,一种是强制时间限制关闭,一种是空闲多少时间后关闭。(有点类似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,目前的窗体只适用于模态窗体,还没有可考虑非模态窗体(项目中使用模态窗体实现)。

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

原文地址:https://www.cnblogs.com/jankerxp/p/10804199.html