Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Mike Lewis on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

How do I use the StatusBar Active-x Control

Tips -N- Tricks

How do I use the StatusBar Active-x Control

by  DSummZZZ  Posted    (Edited  )
You want more from a status bar than what comes natively with VFP.
There is a status bar Active-x control, but it isn't the most user friendly, nor is the documentation all that swell. Par for the Active-x course. I wanted to use one in an app I'm developing and also, there have been several questions posted in this forum on status bars.

So if you just want to use a status bar on your form, drop one on there, right click and select 'SBarCtrl Properties'. Click on Panels and make your panels look how you like. You can add text, key status (CTRL, CAPS, etc.). ToolTips, pictures and so on.
Fine. That's all well and good, but other than keyboard status, folks usually want different messages displayed, or other GUI things. Programmatically. That's what this FAQ is about.

For a complete demo form with all the graphics and user interface, go here: http://www.davesummers.net/foxprolinks.htm
Scroll down until you get to 'StatusBar Active-x Demo' and download 'StatusBarDemo.zip'
I saved the path names so it will unzip to a folder named C:\vfp_source\statusbar and the graphics will unzip to C:\vfp_source\statusbar\graphics. From the IDE, run either the form or the program code. You will see several buttons, a radio control, a couple spinners, and a text box with the status bar at the bottom.
The buttons run some demo code. The radio control selects the auto-sizing of the panels (play with that a little, you'll see how it works). The first spinner selects which panel to work with and the second adjusts the size of the selected panel. The text box changes the text of the selected panel.

One thing to note on adding the statusbar control, as foxwizard pointed out, is that if the form's windowstate is set to 2, the control will remain at wherever the bottom of the form was at design time. So if the form runs as maximized, the control could be floating somewhere in the middle of the form. To cure that, in the form's Init event, add the following line:
Code:
Thisform.Mystatusbar1.Width = Thisform.Width

Anyway, on to the FAQ:
1- I added a status bar control, I need more panels.
2- I have panels, I need text.
3- Too many panels
4- I have panels, I need pictures.
5- How about a progress bar? (Are you serious?)
6- I need CAPS lock, NUM lock, Date and Time.
7- Resize the panels
8- Text and a picture? No way!

1- I added a status bar control, I need more panels.
This adds a panel to the end of the current panels, and sets its resize property to 200:
Code:
WITH Thisform.Mystatusbar1
   .Panels.Add(Thisform.Mystatusbar1.Panels.Count + 1)
   .Panels(Thisform.Mystatusbar1.Panels.Count).Width = 200
ENDWITH

If you want to insert a panel at a position in between two others, say add panel #3, you can just specify that position as in: Thisform.Mystatusbar1.Panels.Add(3)

2- I have panels, I need text.
This code will set the text of the specified panel:
Code:
ThisForm.mystatusbar1.Panels(2).Text = 'Test text'
Substitute [color blue].spPanelNumber.Value[/color] for a specific panel number if you wish.
Here's another example using RECNO():
Code:
WITH ThisForm
   .mystatusbar1.Panels(.spPanelNumber.Value).Text = ;
      Alltrim(str(RECNO())) + ' of ' + Alltrim(str(reccount()))
ENDWITH

3- Too many panels
To remove a panel, either specify which panel to remove by idnex number. In this example I use the 'count' property to remove the last in line:
Code:
With Thisform.Mystatusbar1
   .Panels.Remove(.Panels.Count)
Endwith
Of course you can once again, use the index number: Thisform.Mystatusbar1.Panels.Remove(3)

4- I have panels, I need pictures.
After you have created the handle to the picture object using:
Code:
	STORE LOADPICTURE(Home() + 'Graphics\TRFFC10A.ICO') TO oGreenLight
You can use that handle to display the picture on the statusbar using:
Code:
	Thisform.Mystatusbar1.panels(1).Picture = oGreenLight

5- How about a progress bar? (Are you serious?)
For a progress bar, I made 13 little bitmaps with progressively longer coloring. All you do is set the picture to each one of these, and it looks like a real progress bar. Since I can't post them here for you to use, make your own or use the link to download mine. I made them about 15 pixels high by about 150 wide. In the form's Init method, you first create a handle to each of the picture objects:
Code:
FOR zzz = 0 TO 12
   STORE 'oBar' + Alltrim(Str(zzz)) TO cNewVar
   PUBLIC (cNewVar)
   STORE LOADPICTURE('Graphics\' + Substr(cNewVar, 2) + '.bmp') TO (cNewVar)
NEXT
Where the files are name bar0.bmp - bar12.bmp

Then elsewhere in code, set them as the picture:
Code:
With Thisform.Mystatusbar1
   .panels(3).Width = 150
   .panels(3).Picture = oBar0
   For zzz = 0 To 12
      obar = 'oBar' + Alltrim(Str(zzz))
      .panels(3).Picture = &obar
      Inkey(.5)
   NEXT
   .panels(3).Picture = .null.   &&... no picture when done
Endwith

6- I need CAPS lock, NUM lock, Date and Time.
These are nothing special to create. The control takes care of the work for you. All you have to do is set the 'Style' property to a value greater than 0 (plain text):
1 = Caps, 2 = Num, 3 = Ins, 4 = Scrl, 5 = Time, 6 = Date

This chunk of code adds the panels and sets their type:
Code:
STORE Thisform.mystatusbar1.Panels.Count TO nHowMany
For zzz = 1 TO 6
   With Thisform.Mystatusbar1
      .Panels.Add(zzz + nHowMany )
      .Panels(zzz + nHowMany ).Width = IIF(zzz > 4, 70, 40) &&... clock and date need to be wider
      .Panels(zzz + nHowMany ).Style = zzz
   Endwith
Next

7- Resize the panels
To resize the panels, you just give the panel the number of pixels wide you want it to be:
Code:
Thisform.Mystatusbar1.Panels(3).Width = 150

Or you can use a textbox or spinner control to resize a panel:
Code:
Thisform.Mystatusbar1.Panels(3).Width = Thisform.Text1.value
-or-
Thisform.Mystatusbar1.Panels(3).Width = Thisform.Spinner1.value

8- Text and a picture? No way!
Now just for kicks, let's add text to the picture panel.
After you have created the handle to the picture object using:
Code:
	STORE LOADPICTURE(Home() + 'Graphics\TRFFC10A.ICO') TO oGreenLight

You can do this:
Code:
Thisform.Mystatusbar1.Panels(1).Width = 300
Thisform.Mystatusbar1.panels(1).Picture = oGreenLight
Thisform.Mystatusbar1.panels(1).Text = "This is the green light"

Again, download the file mentioned above for a full demo and full code, and even better documentation.
Hey, it could be fun!
Register to rate this FAQ  : BAD 1 2 3 4 5 6 7 8 9 10 GOOD
Please Note: 1 is Bad, 10 is Good :-)

Part and Inventory Search

Back
Top