John W. Colby
jwcolby at colbyconsulting.com
Sat Jan 17 19:26:10 CST 2004
Per Michaels suggestion I added the ability of clsWakeup to actually execute
the process name as a program. I also added a boolean to the init
parameters to allow telling clsWakeup whether or not to execute this as a
windows command (program). This required also adding a boolean parameter to
the Supervisor function that creates the clsWakeup instance. And finally, I
added a checkbox to the form to allow the user to select whether the process
name being added is a windows program or not.
The modified demo can be found on my site.
The new code now looks like:
Option Compare Database
Option Explicit
'
'This class holds information about a single wakeup
'
Private mdteLastRan As Date 'The last date a wakeup was done
Private mdteTimeToRun As Date 'The time to say wakeup
Private mstrProcessName As String 'The process name needing woken up
Private mblnRunCommand As Boolean 'True means class instance will run the
process as a command (windows program)
Private Declare Function WinExec Lib "kernel32" _
(ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
'
'The class_Initialize is similar to Form_Open in that it always runs ONE
time as a class opens
'Use this to initialize the LastDateRan variable
'
Private Sub Class_Initialize()
mdteLastRan = Date - 1
End Sub
'
'Each instance of this class will hold a time to run (wakeup)
'And a process to wakeup
'
Function Init(ldteTimeToRun As Date, lstrProcessName As String, _
Optional lblnRunCommand As Boolean = False)
mdteTimeToRun = ldteTimeToRun
mstrProcessName = lstrProcessName
mblnRunCommand = lblnRunCommand
End Function
'
'This function checks whether the process has run in the last 24 hours
'If so it returns true and passes back the process name in a string variable
'passed in
'
Function Run(lstrProcessName) As Boolean
Dim lngProc As Long
'Hasn't run today so check if the time is > mdetTimeToRun
If Time() > mdteTimeToRun Then
If Date > mdteLastRan Then
'Mark mdteLastRun = Now()
mdteLastRan = Date
'
If mblnRunCommand Then
lngProc = WinExec(mstrProcessName, 1)
End If
'and return true
lstrProcessName = mstrProcessName
Run = True
End If
End If
End Function
*********
Option Compare Database
Option Explicit
'A collection to hold instances of clsWakeup
Private colClsWakeup As Collection
'An event to raise if a clsWakeup instance says its time to wakeup
Public Event ProcessTime(lstrProcessName As String)
'
'The class_Initialize is similar to Form_Open in that it always runs ONE
time as a class opens
'Use this to create the collection to hold the wakeup classes
'
Private Sub Class_Initialize()
Set colClsWakeup = New Collection
End Sub
'
'Class_Terminate is similar to Form_Close and always runs ONCE as the class
terminates
'Use it to unload all the clsWakeup instances in the collection
'
Private Sub Class_Terminate()
term
End Sub
'
'As the supervisor class closes, it must unload all the clsWakeup instances
in its collection
'
Function term()
On Error Resume Next
While colClsWakeup.Count > 0
colClsWakeup.Remove (1)
Wend
End Function
'
'This function is responsible for creating one instance of clsWakeup every
time it is called
'
Function NewWakeup(ldteTimeToRun As Date, lstrProcessName As String, _
Optional blnRunAsCommand As Boolean = False)
Dim lclsWakeup As clsWakeup
Set lclsWakeup = New clsWakeup
'It then initializes that instance with the TimeToRun and the
ProcessName
lclsWakeup.Init ldteTimeToRun, lstrProcessName, blnRunAsCommand
'And finally, it saves a pointer to the clsWakeup instance just created
in the collection
colClsWakeup.Add lclsWakeup, lstrProcessName
End Function
'
'CheckWakeup is called by a timer tick on a form. It cycles through all the
instances of clsWakeup
'in its collection asking each instance if it's time for that instance to
run.
'
Function CheckWakeup()
Dim lclsWakeup As clsWakeup
Dim lstrProcessName As String
For Each lclsWakeup In colClsWakeup 'Check each instance of clsWakeup
If lclsWakeup.Run(lstrProcessName) Then 'If time to run then
RaiseEvent ProcessTime(lstrProcessName) 'Raise an event telling
the world
End If
Next lclsWakeup
End Function
******
Option Compare Database
Option Explicit
'
'Dimension a supervisor class Withevents
'
Private WithEvents fclsWakeupSupervisor As clsWakeupSupervisor
'
'When the form closes we need to unload the supervisor class
'
Private Sub Form_Close()
Set fclsWakeupSupervisor = Nothing
End Sub
'
'When the form opens we need to create an instance of the supervisor class
'
Private Sub Form_Open(Cancel As Integer)
Set fclsWakeupSupervisor = New clsWakeupSupervisor
End Sub
'
'The close button (standard stuff)
'
Private Sub Command6_Click()
On Error GoTo Err_Command6_Click
DoCmd.Close
Exit_Command6_Click:
Exit Sub
Err_Command6_Click:
MsgBox Err.Description
Resume Exit_Command6_Click
End Sub
'
'The form's timer event will be used to call the supervisor class'
CheckWakeup method
'
Private Sub Form_Timer()
'Erase the last value to make clear that it only was set once / 24 hours
txtWakingUp.Value = ""
'And write a status to the status box to make clear that we are calling
this every 10 seconds
txtStatus.Value = "Checked wakeup list at: " & Now
'Then call the supervisor's CheckWakup method
fclsWakeupSupervisor.CheckWakeup
End Sub
'
'This is a very simple way of programming the processes that need to be
wakened every day
'
Private Sub txtProcessName_AfterUpdate()
'pass in the time to do the wakeup and the process name of the process
to wake up
'!!!!notice no error handling such as was anything entered in time!!!!
fclsWakeupSupervisor.NewWakeup txtNewTime.Value, txtProcessName.Value,
chkRunAsCommand.Value
'if the form timer is not initialized, then set the interval to 10
seconds
If Me.TimerInterval = 0 Then
Me.TimerInterval = 10000
End If
End Sub
'
'This is the event from the supervisor that will be raised if any process
needs to be awakened.
'
Private Sub fclsWakeupSupervisor_ProcessTime(lstrProcessName As String)
txtWakingUp.Value = lstrProcessName
End Sub
John W. Colby
www.ColbyConsulting.com
-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com]On Behalf Of Michael R
Mattys
Sent: Saturday, January 17, 2004 2:23 PM
To: Access Developers discussion and problem solving
Subject: Re: [AccessD] C2DbWakeup
John,
I just had a look at your demo and just wanted to offer
that you could put in something like the following
'Module
Public Declare Function WinExec Lib "kernel32" _
(ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
'clsWakeUp
Function Run(lstrProcessName) As Boolean
'Hasn't run today so check if the time is > mdetTimeToRun
If time() > mdteTimeToRun Then
If Date > mdteLastRan Then
Dim lngProc As Long
lngProc = WinExec(mstrProcessName, 1)
'Mark mdteLastRun = Now()
mdteLastRan = Date
'and return true
lstrProcessName = mstrProcessName
Run = True
End If
End If
End Function
Michael R. Mattys
Try MattysMapLib for MapPoint at
www.mattysconsulting.com