[VCL]控件对齐方式增强函数

VCL 的 TAlign 的功能比较弱,有时候,无法满足我们对齐的需要,所以这里提供了一个额外的 CustomAlign 函数来实现更多的对齐方式。当然,如果你是用 FMX 的话,这些对齐方式已经有了,你可以忽略这篇文章。

type
  TCustomAlign = (caNone, caTop, caLeft, caRight, caBottom, caClient, caCenter,
    caVertCenter, caHorzCenter, caHorizontal, caVertical);
procedure CustomAlign(ACtrl: TControl; ALayout: TCustomAlign);

implementation

procedure CustomAlign(ACtrl: TControl; ALayout: TCustomAlign);
var
  R: TRect;
begin
  if ALayout <> caNone then
  begin
    if ACtrl is TCustomForm then
      R := (ACtrl as TCustomForm).Monitor.BoundsRect
    else
      R := ACtrl.Parent.ClientRect;
    ACtrl.Align:=alNone;
    case ALayout of
      caTop:
        ACtrl.SetBounds(R.Left, R.Top, R.Width, ACtrl.Height);
      caLeft:
        ACtrl.SetBounds(R.Left, R.Top, ACtrl.Width, R.Height);
      caRight:
        ACtrl.SetBounds(R.Right - ACtrl.Width, R.Top, ACtrl.Width, R.Height);
      caBottom:
        ACtrl.SetBounds(R.Left, R.Bottom - ACtrl.Height, R.Width, ACtrl.Height);
      caClient:
        ACtrl.SetBounds(R.Left, R.Top, R.Width, R.Height);
      caCenter:
        ACtrl.SetBounds(R.Left + (R.Width - ACtrl.Width) div 2,
          R.Top + (R.Height - ACtrl.Height) div 2, ACtrl.Width, ACtrl.Height);
      caVertCenter:
        ACtrl.SetBounds(ACtrl.Left, R.Top + (R.Height - ACtrl.Height) div 2,
          ACtrl.Width, ACtrl.Height);
      caHorzCenter:
        ACtrl.SetBounds(ACtrl.Left + (R.Width - ACtrl.Width) div 2, ACtrl.Top,
          ACtrl.Width, ACtrl.Height);
      caHorizontal:
        ACtrl.SetBounds(R.Left, ACtrl.Top, R.Width, ACtrl.Height);
      caVertical:
        ACtrl.SetBounds(ACtrl.Left, R.Top, ACtrl.Width, R.Height);
    end;
  end;
end;

当然,如果想要达到FMX的对齐方式的效果,从 TControl 级别直接实现当然是最好的,不过这里明显有点难度。

分享到: