delphidelphi-2009tscrollbox

How to show scrollbars in TScrollBox after it has been made visible again?


I've ran into one small problem. I am dynamically generating some controls and place them on a TScrollbox component. But I noticed that if the scrollbox is visible, user can clearly see each of the controls being created and placed. So it looks like lots of work is being done and it is slow.

I hid the scrollbox and generated all the controls on it, which took much less time and no flickering and alike. But here's the problem. When I show the scrollbox again, its' scrollbar doesn't appear until I actually resize the form. (The alignment of scrollbox is alClient)

Any ideas on how to fix this?

Tried repainting, but it didn't work. Refresh didn't work either.

Thank you

EDIT:

TScrollBox(Form1.FindComponent('termai')).Visible:= false;
for I := 0 to mazgas.GrafasPagalVarda(sActiveGrafas).Termai.Count - 1 do
begin
    fNaujasTermas(i,oHook);
end;
TScrollBox(Form1.FindComponent('termai')).Visible := true;

The code above shows how I hide and show the scrollbox.
fNaujasTermas generates a panel with several trackbars, images and edits.

I'm not sure about what step-by-step explanation there might be. Just make a procedure where it would generate some panel with many controls on it and set the ScrollBox as a parent. Hide scrollbox before generating anything and unhide it after all is done.
Oh btw, the panel is aligned alTop. So every time new panel is created and placed into scrollbox, it will appear at the top while all other panels will move down.

This is how I created the scrollbox itself

pTermai := TScrollBox.Create(Self);
pTermai.Parent := pLeft;
pTermai.Align := alClient;
pTermai.Name := 'termai';
pTermai.BorderStyle := bsNone;
pTermai.VertScrollBar.Increment := 40;

EDIT2: I think I know how to reproduce this.
It appears that when adding a new panel to the scrollbox, it does not count it into the total height of all the controls which already are in that scrollbox.

So to give example. Lets say 1 Panel has height of 200px.
ScrollBox height is 300px.

So after creating 2 panels which add up to 400px of height, scrollbox does not show the scrollbars, even though half of the second panel is not visible. If i add one more panel = 600px total, scrollbox will show the scrollbar which looks like it would only scroll per 2 panels, not 3. When trying to scroll such window, values get recalculated and everything is shown nicely.

So the main problem is, how to make a scrollbox show scrollbar "in time" so no panels are half cut?


Solution

  • You can request the scrollbox to recalculate its scrollbar properties by calling the Realign() method it inherits from TWinControl. To minimize flicker you should do this while it's still invisible, like so:

    ScrollBox.Visible := False;
    try
      // create your new panel ...
    finally
      ScrollBox.Realign;
      ScrollBox.Visible := True;
    end;