繁体   English   中英

Delphi 元素对齐 - 居中

[英]Delphi element alignment - center

似乎有一个非常有效的align属性,但是是否可以对齐元素,以便面板上的所有元素都对齐到彼此底部的中心,如果它们都小于容器的大小? 有点像顶部中心中心。

像这样的东西:

像这样的东西

或者至少在水平和垂直方向上它们可以有 100%。

将元素放入它们自己的容器中,例如TPanelTFrame ,即主容器的子项。 将子容器的Align属性设置为alCustom并使用父容器的OnAlignPosition事件使子容器以自身为中心:

// Panel1 is the Parent container for the child panel...
procedure TMyForm.Panel1AlignPosition(Sender: TWinControl; Control: TControl;
  var NewLeft, NewTop, NewWidth, NewHeight: Integer; var AlignRect: TRect;
  AlignInfo: TAlignInfo);
begin
  if Control = ChildPanel then
  begin
    NewLeft := AlignRect.Left + ((AlignRect.Width - Control.Width) div 2);
    NewTop := AlignRect.Top + ((AlignRect.Height - Control.Height) div 2);
  end;
end;

不需要编码任何东西。 只需以正确的方式放置面板和其他视觉对象,并设置视觉对象的属性,如下所示:

Align: alNone or alCustom
and
Anchors: none (akLeft=False, akTop=False, akRight=False, akBottom=False)

并且一个对象将停留在其相对的水平和垂直位置。 如果你把它放在容器的中间,它会保持居中。

仅将其居中垂直设置

Align: alNone or alCustom
and
Anchors: akTop=True OR akBottom=True

仅将其居中水平设置

Align: alNone or alCustom
and
Anchors: akLeft=True OR akRight=True

您可以使用这个小程序将控件居中

procedure CenterControl( AControl : TControl );
begin
  if Assigned( AControl.Parent )
  then
    begin
      // remove alignment
      AControl.Align := alNone;
      // remove the anchors
      AControl.Anchors := [];
      // center on parent
      AControl.Left := ( AControl.Parent.ClientWidth - AControl.Width ) div 2;
      AControl.Top := ( AControl.Parent.ClientHeight - AControl.Height ) div 2;
    end
  else
    raise Exception.Create( 'Control needs a Parent!' );
end;

如果父级被调整大小,只要您没有更改其大小,控件将始终居中。

在 RAD 10+ 中有控制 TRelativePanel,它具有 AlignVerticalCenterWithPanel 和 AlignHorisontalCenterWithPanel 救生选项(和其他有用的功能)。

您还可以在中心放置不可见的线或点,并使用 TRelativePanel 提供的上/下/等属性围绕它构建其他控件。 值得一提的是,控制是根据顶级 Embarcadero 质量标准进行的(仅在设计模式下崩溃)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM