如何在Delphi中以编程方式更新不可见控件的对齐方式?

如何在Delphi中以编程方式更新不可见控件的对齐方式?,delphi,animation,alignment,panel,Delphi,Animation,Alignment,Panel,我正在内存中创建一个面板,使用animatewindow方法以动画形式显示。它应该在顶部或底部对齐。 使用以下代码,面板将以动画的形式显示在默认位置,然后对齐 var zp: TPanel; begin zp:= TPanel.Create(self); zp.Visible := False; zp.Parent := Self; zp.Color := clred; zp.Height := 32; zp.Align := alBottom; //zp.

我正在内存中创建一个面板,使用animatewindow方法以动画形式显示。它应该在顶部或底部对齐。 使用以下代码,面板将以动画的形式显示在默认位置,然后对齐

var
  zp: TPanel;
begin
  zp:= TPanel.Create(self);
  zp.Visible := False;
  zp.Parent := Self;

  zp.Color := clred;

  zp.Height := 32;
  zp.Align := alBottom;

  //zp.Visible := True; 
  //zp.Visible := False;


  AnimateWindow(zp.Handle, 200, AW_ACTIVATE or AW_SLIDE or AW_VER_NEGATIVE);
  zp.Visible := True;
我想知道如何使其仅在对齐后显示


注意:正如您所看到的,有一个注释片段使对象在几分之一秒内可见,肉眼无法感知,但这样做似乎不正确。

只有可见控件对齐。不可见控件不参与对齐,因此当设置zp.Align:=alBottom时,直到控件可见后才生效

AnimateWindow函数在窗口的当前坐标处显示窗口。因此,要使控件显示在正确的位置,它需要在调用AnimateWindow之前已经具有正确的坐标。您已经确定了一种简单的方法,即显示然后立即隐藏控件。显示控件将强制Delphi重新对齐控件。然而,我同意你的看法,那并不是一个正确的解决方案

您可以显式地将控件的所需坐标设置为与对齐时相同的坐标。例如:

zp.Left := 0;
zp.Height := 35;
zp.Top := Self.ClientHeight - zp.Height;
zp.Width := Self.ClientWidth;

如果此控件在窗体上有很多同级,特别是那些与窗体两侧对齐的同级,那么上面的代码可能需要更复杂。在某一点上,您可能会认为代码比您愿意继续维护的代码更复杂,并且最好使用简单显示和隐藏控件的欺骗方式。任何人都不应该因为这个决定而责备你。

在设置对齐后,可能会最后设置父级?查看TWinControl.AlignControls和内部过程DoAlignAAlign:TAlign;在Vcl控件中,似乎有必要使控件可见以对齐。这是有道理的。如果您有一个带有alClient的控件和一个带有alLeft的控件,例如,当另一个控件不可见时,您希望与客户端对齐的控件占用所有空间,因此显然不考虑invisiblealLeft控件。是否可以在窗体尚未显示时创建面板,并在设置“父项”和“对齐”时使其不可见?然后稍后对其进行动画制作?是否可以在尚未显示窗体时创建面板,并在设置“父项”和“对齐”时使其不可见?然后以后再制作动画?不,因为它是一个消息组件,所以需要在窗体显示时创建它。我不明白为什么会这样。@kobik它可以工作。