【问题标题】:How to programmatically update the alignment of invisible controls in Delphi?如何以编程方式更新 Delphi 中不可见控件的对齐方式?
【发布时间】:2017-09-20 11:18:11
【问题描述】:

我正在内存中创建一个面板,以使用“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;

我想知道如何让它在对齐后才出现。

注意:如您所见,有一个 sn-p 注释使对象在几分之一秒内可见并且肉眼无法察觉,但是这样做似乎不正确。

【问题讨论】:

  • 也许在设置 Align 之后最后设置 Parent?
  • 查看 TWinControl.AlignControls 和 Vcl.Controls 中的内部 procedure DoAlign(AAlign: TAlign); 似乎有必要使控件可见以对齐。这就说得通了。如果您有一个带有alClient 的控件和一个带有alLeft 的控件,例如您会期望客户端对齐控件在另一个不可见时占用所有空间,因此明显不考虑 invisiblealLeft 控件。您能否在表单尚未显示时创建面板并在设置ParentAlign 时使其不可见?然后再制作动画?
  • “您能否在表单尚未显示时创建面板,并在设置 Parent 和 Align 时使其不可见?然后再对其进行动画处理?” 不能,因为它是一个消息组件,需要在表单显示时创建。
  • 我不明白为什么会这样。
  • @kobik 有效。

标签: delphi animation alignment panel


【解决方案1】:

只有可见的控件才会对齐。不可见控件不参与对齐,所以当你设置zp.Align := alBottom时,直到控件可见之后才生效。

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

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

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

如果此控件在表单上有很多同级,尤其是与表单的对齐的同级,那么上面的代码可能需要更复杂。在某个时候,您可能会认为代码比您愿意继续维护的要复杂,并且最好使用“作弊”的方式来简单地显示和隐藏控件。没有人应该因为这个决定而责怪你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多