Delphi XE3 Firemonkey自动调整大小/布局问题
使用Firemonkey,我有一个TVertScrollBox,其中包含一个TPanel,该TPanel动态填充了以下TDisplayItem对象 问题是TDisplayItem的大小不正确,因此不同组件上的文本会重叠等 我可以通过获取组件的大小和容器的大小等来修复scrollbox可见区域中的项目。我尝试了刷新和application.ProcessMessages以调整所有内容的大小以及各种对齐和扭曲选项,但没有效果 希望我错过了其中的一个关键因素,也没有发现Firemonkey的局限性 干杯 马丁Delphi XE3 Firemonkey自动调整大小/布局问题,delphi,firemonkey,autosize,Delphi,Firemonkey,Autosize,使用Firemonkey,我有一个TVertScrollBox,其中包含一个TPanel,该TPanel动态填充了以下TDisplayItem对象 问题是TDisplayItem的大小不正确,因此不同组件上的文本会重叠等 我可以通过获取组件的大小和容器的大小等来修复scrollbox可见区域中的项目。我尝试了刷新和application.ProcessMessages以调整所有内容的大小以及各种对齐和扭曲选项,但没有效果 希望我错过了其中的一个关键因素,也没有发现Firemonkey的局限性 干
Constructor TDisplayItem.Create(owner : TComponent);
begin
inherited Create(owner);
Align := TAlignLayout.alTop;
pnlLabels := TPanel.Create(nil);
pnlLabels.Align := TAlignLayout.alTop;
pnlLabels.Height := 50;
pnlLabels.Parent := self;
lblICAO := TLabel.Create(nil);
lblICAO.Parent := pnlLabels;
with lblICAO do
begin
text := 'ICAO';
Height := 30;
Position.X := 10;
align := TAlignLayout.alTop;
TextAlign := TTextAlign.taCenter;
Font.Size := 18;
FontColor := $FF00D000 ;
Visible := False;
StyledSettings := [TStyledSetting.ssFamily];//, TStyledSetting.ssFontColor];
end;
lblFrom := TLabel.Create(nil);
lblFrom.Parent := pnlLabels;
with lblFrom do
begin
text := 'From : ';
Height := 30;
Position.X := 10;
Position.y := 2;
width := 150;
FontColor := $FFFF0000 ;
StyledSettings := [TStyledSetting.ssFamily];//, TStyledSetting.ssFontColor];
end;
lblTo := TLabel.Create(nil);
lblTo.Parent := pnlLabels;
with lblTo do
begin
text := 'To : ';
Height := 30;
Position.X := 170;
Position.y := 2;
width := 150;
FontColor := $FFFF0000 ;
StyledSettings := [TStyledSetting.ssFamily];//, TStyledSetting.ssFontColor];
end;
lblStatus := TLabel.Create(nil);
lblStatus.Parent := pnlLabels;
with lblStatus do
begin
text := 'Status : ';
Height := 30;
Position.X := 330;
Position.y := 2;
width := 100;
Font.Size := 10;
FontColor := $FFFF0000 ;
StyledSettings := [TStyledSetting.ssFamily];//, TStyledSetting.ssFontColor];
end;
lblNonGeog := TLabel.Create(nil);
with lblNonGeog do
begin
text := 'Non-Geog : ';
Height := 30;
Position.X := 440;
Position.y := 2;
width := 150;
Font.Size := 10;
FontColor := $FFFF0000 ;
StyledSettings := [TStyledSetting.ssFamily];//, TStyledSetting.ssFontColor];
end;
lblNonGeog.Parent := pnlLabels;
memItem := TLabel.Create(nil);
memItem.Parent := self;
with memItemE do
begin
Align := TAlignLayout.alTop;
DisableFocusEffect := False;
AutoSize := True;
WordWrap := True;
end;
好了,终于解决了。我当时认为这是一个绘图问题——当其中一个标签的文本被更改时,需要一个label.dopaint。然后,即使标签不在显示区域中,也会更新标签的高度。然后,Parent TPanel可以通过将子组件的高度相加来正确设置其高度。您是否在任意点(在组件中或创建时)设置TDisplayItems的大小?TDisplayItem的父项是什么?父项设置为可视包含它们的TPanel。通过迭代获取每个控件的高度并将每个父控件的高度设置为子控件高度的总和来设置大小。对不起,我指的是父类,而不是父控件。如果类为TPanel,则可以将每个标签设置为直接子标签,并避免使用额外的面板。然后您控制的高度将是具有最大位置的子级。Y+高度。我建议在display item类中这样做。谢谢Mike,这是一个TPanel,需要它,因为有多个子控件,我需要轻松处理布局。问题似乎是,如果它不在屏幕的可见区域,它就不会被绘制,也没有默认高度以外的其他高度-因此,当它被滚动时,显示的显示项的大小/绘制不正确。