Delphi 中垂直面板的自动布局

Auto layout of vertical panels in Delphi

我已经离开 Delphi 几年了,做网络应用程序。

我已经习惯了,在 HTML 中,只需声明连续的 <div> ... </div> 并将它们放在彼此下方,间距由 CSS 提供。

我想做一个 Delphi 应用程序,我有 collection 数据,假设它是关于电影的数据。最初,我将为每个 都有一个面板,仅显示标题。如果单击一个,它将展开以显示演员、导演、情节摘要等。单击另一个,第一个将缩小,而新的将展开(最多展开一个;再次单击可缩小它)。

所以,我有两个布局问题:1) 计算每个面板的初始 .top 和 2) 随着单击不同的面板 re-calculate。

当然,我完全有能力手动编写所有这些代码,但这似乎很乏味且容易出错。

是否有公认的方法来做到这一点? Delphi自带的VCL组件?我应该在 https://softwarerecs.stackexchange.com/ 上询问第 3 方 VCL 组件吗?

最接近的 VCL 控件可能是 TCategoryPanelGroup, which is composed of vertically aligned expandable panels (TCategoryPanel)。

该控件没有 'autocollapsepanels' 或 'maxexpandedpanelcount' 属性,但您可以使用一些简单的代码来实现所需的行为。 例如。下面的 OnExpand 事件处理程序,如果附加到组中的所有类别面板,将导致展开的面板关闭其他面板。

procedure TForm1.CategoryPanelExpand(Sender: TObject);
var
  I: Integer;
begin
  if Sender is TCategoryPanel then
    for I := 0 to CategoryPanelGroup1.Panels.Count - 1 do
      if CategoryPanelGroup1.Panels[i] <> Sender then
        TCategoryPanel(CategoryPanelGroup1.Panels[i]).Collapse;
end;


您可以将面板的 AlignWithMargins 属性 设置为 true,然后使用面板的 Margins 属性调整间距。