根据Firemonkey中的标签数量调整TLayout的大小

时间:2015-02-14 00:00:55

标签: layout resize height firemonkey tpanel

这是我在Firemonkey中的示例代码;

var
   f: integer; 
   Label1: TLabel;
   MyStringArray: TArray<String>;
   Panel1: TPanel;
   Layout1: TLayout;
begin
   Layout1.Align := TAlignLayout.Client;
   MyStringArray := ['aa','bb','cc','dd','ee','ff'];
   f:= 10;
   Layout1.BeginUpdate;
   for i := 0 to length(MyStringArray) - 1 do
   begin
        Label1 := TLabel.Create(Self);
        Label1.Name := 'Label' + i.ToString;
        Label1.Text := 'Label_' + MyStringArray[i];
        Label1.Position.Y := f;
        Label1.Align := TAlignLayout.Top;
        Label1.Parent := Layout1;
        inc(f, 15);
   end;
   Layout1.EndUpdate;
end; 

MyStringArray是一个动态数组,并不总是具有相同数量的元素,因此我根据标签数量调整了TLayout(Layout1)内容的TPanel(Panel1);

Panel1.Height := Layout1.ChildrenRect.Height

当Layout1中的标签数量增加时,此方法正常工作,但当标签数量较少时,Layout1.ChildrenRect.Height无效且不缩小,Layout1的高度始终保持较高的值。

是否有任何解决方案或任何其他替代方法?谢谢 问候。

2 个答案:

答案 0 :(得分:1)

我刚刚提交了以下错误报告。与此同时,我建议你自己计算边界,甚至可以从下面的代码开始:

FMX TControl.ChildrenRect的文档声明:

&#34;指定当前控件的子节点占用的矩形区域。 ChildrenRect是一个矩形,通过在控件的子项占用的矩形之间执行联合操作而获得。&#34; - http://docwiki.embarcadero.com/Libraries/XE7/en/FMX.Controls.TControl.ChildrenRect

但是,代码实际上在计算中包含了它自己的界限:

function TControl.GetChildrenRect: TRectF;
var
  I: Integer;
  Control: TControl;
begin
  Result := AbsoluteRect;  <---*****This line
  { children }
  if not (ClipChildren or SmallSizeControl) and (FControls <> nil) then
    for I := GetFirstVisibleObjectIndex to GetLastVisibleObjectIndex - 1 do
    begin
      Control := FControls[I];
      if Control.Visible then
        Result := UnionRect(Result, Control.GetChildrenRect);
    end
end;

如果这是预期的行为,那么文档需要更新,否则它是实现中的错误。

答案 1 :(得分:1)

我希望这段代码能有所帮助。 我为更多编辑道歉,这是最后一次,但我再次尝试并且代码不完全正确。

type
  TControlHelper = class helper for TControl
  public
    function ChildrenWidth: Single; 
    function ChildrenHeight: Single; 
  end;

function TControlHelper.ChildrenWidth: Single;
var
  VIndex: Integer;
  VControl: TControl;
  VRect: TRectF;
begin
  VRect := TRectF.Empty;
  if not ( ClipChildren or SmallSizeControl ) and ( Controls <> nil ) then
  begin
    for VIndex := GetFirstVisibleObjectIndex to GetLastVisibleObjectIndex - 1 do
    begin
      VControl := Controls[ VIndex ];
      if VControl.Visible then
        VRect := UnionRect( VRect, VControl.Margins.MarginRect( TRectF.Create( VControl.Position.Point, VControl.Width, VControl.Height ) ) );
    end;
    Result := VRect.Width + Padding.Right;
  end;
end;

function TControlHelper.ChildrenHeight: Single;
var
  VIndex: Integer;
  VControl: TControl;
  VRect: TRectF;
begin
  VRect := TRectF.Empty;
  if not ( ClipChildren or SmallSizeControl ) and ( Controls <> nil ) then
  begin
    for VIndex := GetFirstVisibleObjectIndex to GetLastVisibleObjectIndex - 1 do
    begin
      VControl := Controls[ VIndex ];
      if VControl.Visible then
        VRect := UnionRect( VRect, VControl.Margins.MarginRect( TRectF.Create( VControl.Position.Point, VControl.Width, VControl.Height ) ) );
    end;
    Result := VRect.Height + Padding.Bottom;
  end;
end;