如何在Lazarus中为TCustomControl指定子填充/间距?

时间:2015-11-28 20:08:19

标签: delphi lazarus

在Delphi中,我可以使用Padding来指定任何子控件和我的自定义控件之间的间距。这很有用,例如,如果自定义控件的顶部有一个标题部分,因此任何对齐的子控件都会显示在标题部分下面,这基本上可以确保子控件无法在控件的某些部分定位或重叠希望他们在。

我试图在Lazarus中实现这一点,但由于没有Padding属性,我需要一些其他选择。我找到的最接近的是ChildSizing,但我看不到一种明显的方法来实现它。

见附图:

enter image description here

TMemo是自定义控件的子项,实现间距的方式如下:

constructor TMyControl.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Self.ControlStyle := Self.ControlStyle + [csAcceptsControls];
  Self.BorderStyle  := bsSingle;
  Self.Height       := 210;  
  Self.Width        := 320;
  Self.ChildSizing.TopBottomSpacing := 10; // This line adds the spacing
end;

正如您在附图中看到的那样,控件的顶部和底部有间距,我希望在给定属性名称TopBottomSpacing的情况下发生这种间距。

似乎没有一个明显的属性我可以看到只需在顶部,底部,左侧或右侧单独添加间距:

enter image description here

如何在Lazarus中单独指定子间距?

我只能看到TopBottomSpacingLeftRightSpacing,它们会在相对的两侧添加间距产生不良影响,我只想在顶部添加填充/间距。

1 个答案:

答案 0 :(得分:1)

要指定可以锚定子控件的区域,请覆盖AdjustClientRect方法,如:

procedure TMyControl.AdjustClientRect(var ARect: TRect);
begin
    inherited AdjustClientRect(ARect);
    ARect := Rect(
        ARect.Left, 
        ARect.Top + Canvas.TextHeight('A'), // Make place for control's header
        ARect.Right, 
        ARect.Bottom);
    // Or just:
    // ARect.Top += Canvas.TextHeight('A');
end;

还要记住开发人员的警告:

procedure TWinControl.AdjustClientRect(var ARect: TRect);
begin
  // Can be overriden.
  // It's called often, so don't put expensive code here, or cache the result
end;