The Lost_Focus and Got_Focus events are the most-used events for implementing validation and texthighlighting. Wouldn’t it be nice to respond instantly to these events and to do it from a single routine for allcontrols without the aid of a subclassing control?Here’s the answer. Place a timer control on your form, set its Interval property to 100 and set Enabled =True. Name the control tmrFocusTracking. Code its Timer event alike this:
Private Sub tmrFocusTracking_Timer() Dim strControlName As String Dim strActive As String strControlName = _ Me.ActiveControl.Name Do strActive = Me.ActiveControl.Name If strControlName <> strActive _ Then Print strControlName & _ " - Lost Focus", _ strActive & " - Got Focus" strControlName = strActive End If DoEvents LoopEnd Sub
To implement universal highlighting, replace the Print statement with this code:
Me.Controls(strActive).SelStart = 0Me.Controls(strActive).SelLength = _ Len(Me.Controls(strActive))
To implement validation, replace the Print statement with a call to a validation routine. Use strActive in aSelect Case structure. At the moment where the Print statement would occur, strActive is equal to thecontrol that just Got Focus, and strControlName holds the name of the control that just Lost Focus.Don’t place this routine in anything but a timer; otherwise, your program hangs once the routine is called.Even the timer here never makes it to a second interval. For a given control, don’t write validation code bothin the Got_Focus/Lost_Focus events, and in code called by this routine. Doing so might cause unpredictableresults.