谢谢老汉与我分享的趣味作品,周末外出了,今天才拜读,将列表框的属性rowsource用的极妙,很受启发。
在我的实际使用中,逻辑性要求比作品严密,窗体的关闭次序上需要进一步控制,作品中非活动窗体的关闭是先到设定闲置时间的先关,实用中逻辑性往往是后打开的先关,关闭窗体时对前一级的窗体有相关操作指令,如果前面的窗体先关闭了,会导致程序错乱。另外如果某指令打开的是主副两个窗体,附属窗体始终处于非活动窗体状态,那就取不到窗体数据,当然这个可以在主窗体关闭事件中连带关闭。用遍历已开启窗体的当前活动属性记录窗体的最后使用时间,于我的要求还是存在逻辑漏洞的,我只需要第一次开启的时间,后面的时间刷新不需要。
我猜想应该有内置的函数方法一直在记录每个窗体的开启和关闭,活动或非活动,从底层支持系统的正常运行,但是不一定开放给用户。我在系统自带表里找了找,没发现有这方面的记录,难道在ldb文件里?
反复考虑下来,我的方案是这样的,每个窗体中原来都已调用了一个共用的初始化函数,在这个函数中加入对窗体的开启时间的记录,在Time事件里用老汉的办法遍历窗体更新rowsource,剔除已关闭的窗体。将列表框值绑定为时间值(列表框的值列表能否直接排序?暂时没思路),赋给数组后降序排列,再按次序关闭窗体。另外的方法还是建表记录窗体开启时间,关闭则删除记录,这样可以调用域聚合函数DMAX,DLOOKUP直接操作,,后面操作比较方便。
好了,具体方案也有了,没老汉的启发,想法不会落地,谢谢老汉!结贴!
附:分享一下我用的一组API函数,用来侦测系统闲置时间比较方便。第一个获得最后的操作时间值,另一个获得系统运行时间值,差值就是闲置时间。
Private Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As Boolean
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Type LASTINPUTINFO
cbSize As Long
dwTime As Long
End Type
Dim lii As LASTINPUTINFO
‘---------------------------------------------------------------------------------------------------------------
If GetLastInputInfo(lii) Then
If (GetTickCount - lii.dwTime) / 60000 >= 3 Then
DoCmd.Quit
'Shell "shutdown.exe -s -t 180" '启动系统关机程序,3分钟倒计时!类似于下载程序完成后自动关机。
'If MsgBox("由于本机3分钟没有操作,系统将退出用户登录", vbYesNo + vbExclamation + vbDefaultButton2, "提示") Then
’。。。。。。。。。
’End If
End If
End If