如何在TScrollBox再次显示后显示滚动条?

时间:2010-04-18 16:30:39

标签: delphi delphi-2009 tscrollbox

我遇到了一个小问题。我正在动态生成一些控件并将它们放在TScrollbox组件上。但我注意到,如果滚动条可见,用户可以清楚地看到正在创建和放置的每个控件。所以看起来很多工作正在进行而且很慢。

我隐藏了滚动条并在其上生成了所有控件,这花费了更少的时间,没有闪烁和相似。但这是问题所在。当我再次显示滚动条时,直到我实际调整表单大小时才会显示其滚动条。 (滚动条的对齐方式为alClient

有关如何解决此问题的任何想法?

尝试重新粉刷,但它没有用。刷新也不起作用。

谢谢

编辑:

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;

上面的代码显示了我如何隐藏和显示滚动框 fNaujasTermas生成一个包含多个跟踪栏,图像和编辑的面板。

我不确定可能会有什么循序渐进的解释。只需创建一个过程,它将生成一些带有许多控件的面板,并将ScrollBox设置为父级。在生成任何内容之前隐藏滚动框,并在完成后取消隐藏它 哦顺便说一下,面板对齐alTop。因此,每次创建新面板并将其放入滚动框时,它将显示在顶部,而所有其他面板将向下移动。

这就是我创建滚动条本身的方式

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

EDIT2:我想我知道如何重现这一点 看起来在向滚动框添加新面板时,它不会将其计入该滚动框中已有的所有控件的总高度。

所以举个例子。让我们说1面板的高度为200px ScrollBox高度为300px。

因此,在创建2个加起来高度为400px的面板后,即使第二个面板的一半不可见,滚动框也不会显示滚动条。如果我再添加一个面板= 600px总计,则滚动条将显示滚动条,看起来它只会滚动每2个面板,而不是3.当尝试滚动此类窗口时,将重新计算值并显示所有内容。

所以主要的问题是,如何使滚动条“及时”显示滚动条,这样就不会将面板切成一半?

2 个答案:

答案 0 :(得分:5)

您可以通过调用从Realign()继承的TWinControl方法,请求滚动条重新计算其滚动条属性。为了尽量减少闪烁,你应该在它仍然不可见时这样做:

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

答案 1 :(得分:0)

正如我在评论中所说,我无法重现这个问题。如果您提供有关如何重现问题的分步说明,将会有所帮助。

但是如果你说如果你调整表格大小问题就会消失,为什么不简单地调整表格大小呢?也许您可以尝试使用SetWindowPos将其调整为0像素。您也可以尝试ScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0);