Assume you have 6 different methods acting on a datawindow or multiple datawindows on a userobject, and these methods can be called in multiple combinations, singly or in combination.
They involve sorting/filtering or some other visual change that you don't want the user to see until all of the processing is complete.
Each method therefore has a setredraw false/true at the beginning and ending of the method.
Now suppose Method1 wraps all of the other methods as seen below, your goal is to prevent any flickering/intermediate processing from being seen.
Method1 SetRedraw(False)
Method2 SetRedraw(False)
Method3 SetRedraw(False)
Method4 SetRedraw(False)
Method4 SetRedraw(True) //1,2,3 still want it false
Method3 SetRedraw(True) //1,2 still want it false
Method2 SetRedraw(True) //1 still wants it false
Method5 SetRedraw(False)
Method6 SetRedraw(False)
Method6 SetRedraw(True) //1,5 still want it false
Method5 SetRedraw(True) //1 still wants it false
Method1 SetRedraw(True) //OK to show now
The following approach appears to resolve the problem, by removing the SetRedraw(True) at the end of each method,
and replacing it with a POST SetRedraw(True) at each SetRedraw(False)
Method1 SetRedraw(False); POST Setredraw(True)
Method2 SetRedraw(False); POST Setredraw(True)
Method3SetRedraw(False); POST Setredraw(True)
Method4 SetRedraw(False); POST Setredraw(True)
// Method4 SetRedraw(True)
// Method3 SetRedraw(True)
//Method2 SetRedraw(True)
Method5 SetRedraw(False); POST Setredraw(True)
Method6 SetRedraw(False); POST Setredraw(True)
// Method6 SetRedraw(True)
//Method5 SetRedraw(True)
//Method1 SetRedraw(True)
All POSTs execute here
You could also add a boolean instance variable to keep track of the False/True state, and instead of calling SetRedraw directly,
Call of_SetRedraw that will evaluate the instance variable and only execute the SetRedraw when the passed in state is different than the current state. The first false will execute, then all of the nested falses get ignored, and the first posted true gets executed, with the remaining posted trues being ignored. The boolean gets flipped when the Setredraw actually executes inside of_SetRedraw. (This is what we are currently doing, and where we previously had many SetRedraws executing, we now only have 2, 1 false and 1 true.)
This seems to be working well for us so far where we have implemented it, we are applying the setredraw to a tab page userobject that has multiple datawindows and a second set of smaller tabs with their own datawindows on them. All of the flickering we were seeing is gone.
Has anyone else ever tried this approach, or see any potential problems with it?