FlowPanel 如何包装每个给定数量的组件?

FlowPanel how to Wrap every given number of components?

有什么方法可以不那么复杂地包装 FlowPanel 的组件,例如每 3 个组件?

因为它与 属性 自动换行一起工作,但受给定数量的控制。

提前致谢。

您没有确定实际的图像尺寸,所以这里是一些您必须根据自己的喜好采用的示例尺寸的总体思路。我用按钮做了一些初步测试(正常宽度 = 75),所以我将 TFlowPanel 调整为 235 像素宽。

想法是 TFlowPanel 具有固定宽度 (Constraints.MaxWidth = 235; Constraints.MinWidth = 235;) 但 AutoSize=True 以便它可以向下增长。如果您添加例如75px 宽的组件,其中 3 个完全适合一排。如果更宽,则只有 2 个甚至只有 1 个适合一排。随心所欲。但如果宽度只有 56px(平均值)或更小,组件的数量将是四个或更多。

我建议一个解决方案,将这样一个较小的组件放置在它自己的面板上,宽度为 75px,并将该面板放在 TFlowPanel 上。因此,一行中最多只能容纳三个组件。

这是用于在 TFlowPanel 上放置多个按钮的代码。

procedure TForm3.Button1Click(Sender: TObject);
var
  btn: TButton;
  pan: TPanel;
begin
  inc(count);
  btn := TButton.Create(self);
  btn.Width := random(60)+35;
  if btn.Width < 75 then
  begin
    pan := TPanel.Create(self);
    pan.Width := 75;
    pan.Height := 30;
    pan.BevelOuter := bvNone;
    btn.Parent := pan;
    pan.Parent := FlowPanel1;
  end
  else
  begin
    btn.Parent := FlowPanel1;
  end;
  btn.Caption := IntToStr(count);
end;

最终结果


备选方案

另一种解决方案(因为您提到了 TImages)是始终创建 TImages,其 宽度至少为 75px。如果您愿意,图片(如果小于该图片)可以在 TImage 中居中。这是基于图像不会影响 TImage 控件的大小这一事实(除非您希望如此)。

此外,如果您不是真的绝对需要以完整的实际大小显示图像,您可以设置 Proportional 属性 true。来自文档:

When Proportional is true, images that are too large to fit in the image control are scaled down (while maintaining the same aspect ratio) until they fit in the image control.