Yep, I think separate frames for each tab are the way to go. It's easiest to hide and view entire fieldsets (and whatever else you use in your tab pages) that way. If anyone has a better way I would love to see it!
You could, for instance, set the handle of the frame of each tab you use in the "Tag" property of the individual tab. Then in the click event of the TabStrip you "immediately" know the handle of the frame and can hide the currently viewed one and view the frame of the tab that has been clicked.
A bit of "dry typing" because I do not have Progress open at the moment so you may have to tinker with it a little:
Code:
DEF VAR lhCurrentFrame AS HANDLE NO-UNDO.
..
..
<All the other code>
..
..
PROCEDURE TabStrip.TabStrip.Click:
DEF VAR lhTab AS HANDLE NO-UNDO.
lhTab = WIDGET-HANDLE(chTabStrip:SelectedItem:Tag) NO-ERROR.
IF NOT VALID-HANDLE(lhTab)
THEN RETURN.
IF VALID-HANDLE(lhCurrentFrame)
THEN lhCurrentFrame:VISIBLE = FALSE.
ASSIGN lhTab:VISIBLE = TRUE
lhCurrentFrame = lhTab.
<do whatever else you want to do on click of the tab>
END PROCEDURE.