代码之家  ›  专栏  ›  技术社区  ›  user1651105

如何在滚动框中再次显示滚动条?

  •  3
  • user1651105  · 技术社区  · 14 年前

    我遇到了一个小问题。我正在动态生成一些控件并将它们放在 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 生成包含多个轨迹栏、图像和编辑的面板。

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

    这就是我创建滚动框的方式

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

    我想我知道怎么复制这个。
    在向滚动框中添加新面板时,它似乎不计入该滚动框中已存在的所有控件的总高度。

    举个例子。假设1个面板的高度为200px。
    滚动框高度为300像素。

    因此,在创建两个高达400px的面板后,尽管第二个面板的一半不可见,但scrollbox不会显示滚动条。如果我再添加一个panel=600px,scrollbox将显示滚动条,看起来它只会每2个面板滚动一次,而不是3个。当尝试滚动这样的窗口时,值会重新计算,并且一切都显示得很好。

    所以主要的问题是,如何使一个滚动框显示滚动条“及时”所以没有面板是半切的?

    2 回复  |  直到 14 年前
        1
  •  5
  •   mghie    14 年前

    您可以通过调用 Realign() 它继承自的方法 TWinControl . 要最小化闪烁,您应该在它仍然不可见的情况下执行此操作,如下所示:

    ScrollBox.Visible := False;
    try
      // create your new panel ...
    finally
      ScrollBox.Realign;
      ScrollBox.Visible := True;
    end;
    
        2
  •  0
  •   Andreas Rejbrand    14 年前

    正如我在评论中所说,我无法再现这个问题。如果你分步指导如何重现问题,这会有帮助的。

    但是如果你说如果你调整窗体的大小,问题就解决了,为什么不简单地调整窗体的大小呢?也许您可以尝试使用 SetWindowPos . 你也可以试试 ScrollBox1.Perform(WM_VSCROLL, SB_PAGEUP, 0); .