As you can see my previous questions were about failure of TypoeOf() function
I used a different way to get specific controls picked from control array without using TypeOf()
Only to pick Datawindow controls and save them in a DataWindow AllDW[] array, i used PowerBuilder's internal Type Casting Operator '=' equal sign.
Declared DataWindow type variable and assigned it each control in a loop
DataWindow TheDW, AllDW[]
But there are only two places in a window where a datawindow control can be found or can be placed.
1- Window itself
2- TabPage of a Tab Control
When i run loop on Windows control array and ignore Tab controls just to pick those datawindows first that are there in window and not on a tab control, the type casting operator ('=' equal sign) works fine. Because we know powerbuilder runtime crashes when statictext control is assigned to a datawindow variable. Which is obvious as default behavior of PB. To avoid crash we use TRY and after TRY if IsValid() function is used to see if DW is a valid datawindow then in case when loop was inspecting statictext in the window control [] array, the DW is not valid and IsValid() function verify that. So this how all other controls are ignored and picked only datawindow controls.
Things are pretty much in good shape so far because loop is ignoring Tab controls.
FOR control_counter = 1 TO UpperBound(TheParentWin.control)
TRY
TheDW = TheParentWin.control[control_counter]
CATCH(RuntimeError RT012)
END TRY
IF IsValid(TheDW) THEN
TheDW
AllDW[UpperBound(AllDW) + 1] = TheDW
Now problem starts when inner loop runs through each control on a tabpage.
The type casting idea with = failed because all of the controls on tabpage were valid as datawindow. What that means is, if there is a static text control on tabpage and i set that to the TheDW variable the assignment becomes valid and IsValid function sees it valid to assign a picture, statictext, groupbox, ole etc. to a datawindow variable.
FOR TabPageChild = 1 TO UpperBound(TheTab.control[Tabpage].control)
TRY
TheDW = TheTab.control[Tabpage].control[TabPageChild]
CATCH(RuntimeError RTE0014)
_errorLog("Crashed In Tab @ " + TheTab.control[Tabpage].control[TabPageChild].ClassName())
END TRY
Note: the CATCH block of code is triggered but assignment is also completed as valid statement.
IF IsValid(TheDW) THEN
AllDW[UpperBound(AllDW) + 1] = TheDW
_errorLog("Valid TABDW :" + TheDw.ClassName())
Output includes both _errorlogs for every picture, text, ole, dw groupbox etc.
"Crashed In Tab @ "
"Valid TABDW :"
That is absolutely wrong and seems tabpage control[] array is handled different way than window control[] array internally. No idea what went wrong where.
The full script:
w_parent TheParentWin
/// the parent is a valid window reference
TheParentWin = Parent
/// variables
Tab TheTab, TheChildTab
Uo_DW TheDW
Integer control_counter
Integer Tabpage, TabPageChild, TabPageOfChildTab
/// just a log of how many controls are there in control array[]
_errorLog("Start : The object " + TheParentWin.ClassName() + " has total " + String(UpperBound(TheParentWin.control)) + " controls")
/// going through window array ( The main outer loop)
FOR control_counter = 1 TO UpperBound(TheParentWin.control)
SetNull(TheDW)
SetNull(TheTab)
/// either one of the following variables will be valid
/// both cannot be valid at the same time TheDW & TheTab
TRY
TheDW = TheParentWin.control[control_counter]
CATCH(RuntimeError RT012)
SetNull(TheDW)
_errorLog("Crashed In Window @ " + TheParentWin.control[control_counter].ClassName())
END TRY
/// Q: What to do when TheDW is valid?
/// A: DataWindow control goes to an array of type datawindow
/// and also log classname and other things.
IF IsValid(TheDW) THEN
_errorLog("Valid DW :" + TheDW.ClassName() )
SetNull(TheTab)
AllDW[UpperBound(AllDW) + 1] = TheDW
/// get next object
Continue
END IF
/// Object if not a DW, could be a Tab control
TRY
TheTab = TheParentWin.control[control_counter]
CATCH(RuntimeError RT014)
SetNull(TheTab)
END TRY
IF IsValid(TheTab) THEN
/// How many tabpages?
FOR Tabpage = 1 TO UpperBound(TheTab.control[])
/// going inside a tabpage
/// how many controls on each tabpage?
FOR TabPageChild = 1 TO UpperBound(TheTab.control[Tabpage].control)
SetNull(TheDW)
TRY
TheDW = TheTab.control[Tabpage].control[TabPageChild]
CATCH(RuntimeError RTE0014)
_errorLog("Crashed In Tab @ " + TheTab.control[Tabpage].control[TabPageChild].ClassName())
END TRY
IF IsValid(TheDW) THEN
_errorLog("Valid TABDW :" + TheDw.ClassName())
AllDW[UpperBound(AllDW) + 1] = TheDW
// END TRY
END IF
NEXT /// TABPage
NEXT ///TAB
END IF
NEXT