Timed and blinking messages

M

Mats Samson

I found recently a great solution to timed messages at The Xcel Files site,
http://www.xcelfiles.com by Ivan F Moala (Thanks Ivan!). I’ve seen many asked
for it but no good solution has been provided. The example code was about
animated GIF’s but with only a slight modification I changed it to use
whatever objects I like in my Forms. The most obvious usage would be to
display a self-closing message in the form when a certain condition is met,
maybe a warning. Warning messages in the status bar is not very alerting,
they have to appear where the user has his focus! I’ve used labels and they
can stay invisible until they’re needed and you can even set their attributes
to alert the user even more.
Here is a blinking message that automatically disappears after some time:
UserForm_Initialize()
LabelRateWarn1.Visible = False
End Sub

Other TriggerSub ()
.......
If ARate <> BRate Then
Warning
End If
End Sub

Sub Warning()
Dim y As Single, x As Single, z As Single
Dim Start, Delay
For x = 1 To 10
For y = 1 To 5
Start = Timer
Delay = Start + 0.15
Do While Timer < Delay
LabelRateWarn1.Visible = True
DoEvents
Loop
Next y
For z = 1 To 5
Start = Timer
Delay = Start + 0.15
Do While Timer < Delay
LabelRateWarn1.Visible = False
DoEvents
Loop
Next z
Next x
LabelRateWarn1.Visible = False
End Sub
If you don’t want the blinking, remove the loop Z.

Now to my problem!
I’m very fond of reusing code and I have several situations in various
locations of my multipage form where I’d like to display a message to the
user.
How do I declare a LabelName as a variable and transfer the variable between
procedures?
From TriggerSub_1 I would put the variable Mess = LabelRateWarn1
and go to Warning (Mess)
From TriggerSub_2 I would put the variable Mess = LabelPriceWarn2
and go to the same Warning (Mess)
where I have the actions Mess.Visible = True/False.
It could be even more sophisticated if I could send x, y, and z variables
from the Trigger-subs as well. Then I could set speed and length of the
blinking message.

Furthermore I’d like to have a message displayed until a click event! Say
that a
message is displayed at a menu. If the menu is idle, it’ll continue to be
displayed until the user clicks a either a specified button or the eventually
the form itself (non-idle state).

Can anybody help me with these?
 
T

Toppers

Hi,
Example of passing parameters:

Sub Other_TriggerSub()
Arate = 10
Brate = 20
If Arate <> BRate Then
Call Warning("LabelRateWarn1", 0.15)
End If
End Sub

Sub Warning(ByVal Mess As String, ByVal AddTime As Double)
Dim y As Single, x As Single, z As Single
Dim Start, Delay
For x = 1 To 10
For y = 1 To 5
Start = Timer
Delay = Start + AddTime
Do While Timer < Delay
Me.Controls(Mess).Visible = True
DoEvents
Loop
Next y
For z = 1 To 5
Start = Timer
Delay = Start + AddTime
Do While Timer < Delay
Me.Controls(Mess).Visible = False
DoEvents
Loop
Next z
Next x
Me.Controls(Mess).Visible = False
End Sub


HTH
 
M

Mats Samson

Thanks Toppers,
it works great!
Can you also solve the last problem, looping the procedure endlessly if the
computer is idle, i.e. until the user do a OnClick or Click event.

Furthermore I'd like to know if I can run/start a procedure located in a
userform
from a module? It would be convenient if the form is in Hide state while I'm
doing other things when I run Userform.Show vbmodeless, I'd like to run the
below Warning procedure.
 
T

Toppers

Mats,

Something along these lines .....

Variable "End_Pause" is set when Userform is initialised and changed when
Userform is clicked. Until the change, the Warning macro will loop endlessly.

And you cannot call a Userform module from a general module.


Public End_Pause As Boolean

Private Sub UserForm_Click()
End_Pause = True
End Sub
Sub Other_TriggerSub()
Arate = 10
BRate = 20
If Arate <> BRate Then
Call Warning("LabelRateWarn1", 0.15)
End If
End Sub

Sub Warning(ByVal Mess As String, ByVal AddTime As Double)
Dim y As Single, x As Single, z As Single
Dim Start, Delay
Do
For y = 1 To 5
Start = Timer
Delay = Start + AddTime
Do While Timer < Delay
Me.Controls(Mess).Visible = True
DoEvents
Loop
Next y
For z = 1 To 5
Start = Timer
Delay = Start + AddTime
Do While Timer < Delay
Me.Controls(Mess).Visible = False
DoEvents
Loop
Next z
Loop Until End_Pause
End_Pause = False
Me.Controls(Mess).Visible = False
End Sub

Private Sub UserForm_Initialize()
End_Pause = True
End Sub
 
M

Mats Samson

Thanks for the idea with the endless loop, it sounded alright but I forgot
that I also set focus to the textbox that is causing the alert message and
that causes a click event.
Even though the Setfocus line is before the Warning init! Strange!!
Bah! Never mind, the important is that the “popup messaging†is working and
it really does. I even created an animation by using a label with an arrow
picture that is moved slightly during visible=false. Great!

I managed the Userform call too!!!!
From the module (in the same project) and in the procedure that do
UserFrom.Show
I’ve put both the Setfocus.TxtBox101 (in the userform) and the call to the
Warning procedure that is located in the Userform code as well. The trick was
to remove
the parenthesis as I put in the qualifier:

Public Sub TraderView()
Workbooks("Trader").Worksheets("System").Activate
ActiveWindow.WindowState = xlMinimized
Worksheets("System").Activate
Trader.Show vbModeless
If Range("MenuLevel") = "I" Then
Trader.TxB101.SetFocus
Trader.Warning 0.1, "LabelWarn02", False, "LabelPic1RedDArw", True,
"LabelNull01", 0
Else
Trader.ComBu102.SetFocus
Trader.Warning 0.1, "LabelWarn01", False, "LabelNull01", False,
"Red3RArw", 528
End If
End Sub
I even put in three different alerts and the work pretty nice together in
the same procedure. The LabelNull01 is an empty “invisible†label that can be
used when you want to trigger some alerts but not others, as there cannot be
an empty string reference.
Thanks once again!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Top