相当于代码中的设计者指南

时间:2011-08-03 08:55:51

标签: delphi designer delphi-2007 form-designer

VCL表单设计器提供粉红色指导,用于在各自的文本基线上对齐控件: Guidelines in form designer
但据我所知,这不适用于标签和复选框。 更新:如果您完全放置控件,它适用于标签 ,例如按 Ctrl - arrow 。它适用于复选框 - 见截图。

现在,在某些形式上,我正在代码中创建控件,例如

ed := TEdit.Create(Self);
ed.SetBounds(...);
ed.Parent := SomePanel;

等。如何确保其文本基线对齐?我想将它用于编辑,组合框,标签和复选框。结果应该是这样的(没有红线,当然:-)): base line aligned

修改:我目前的方法是使用

调用AlignTop(8, [Edit1, ComboBox1], [CheckBox1, Label1]);之类的内容
procedure ControlArray_SetTop(const AControls: array of TControl; ATop: Integer);
var
  i: Integer;
begin
  for i := Low(AControls) to High(AControls) do
    AControls[i].Top := ATop;
end;

procedure AlignTop(ATop: Integer; const AControls: array of TControl; const ALabelLikeControls: array of TControl);
begin
  ControlArray_SetTop(AControls, ATop);
  ControlArray_SetTop(ALabelLikeControls, ATop + 3);
end;

我的目标是用更强大,更少黑客的东西取代它。

4 个答案:

答案 0 :(得分:5)

指南在设计时代码中实施,许可证禁止您随应用程序一起提供,因此您只能使用它来从中学习,然后自行重新实现。查找

DesignIntf.TBaseComponentGuidelines
DesignEditors.TComponentGuidelines
VCLEditors.TControlGuidelines

类(在“{RADStudio \ version} \ source \ ToolsAPI目录”中)。也许它归结为简单的事情

Label1.Top := (Edit1.Top + Edit1.Height) - Label1.Height + GetMagicConstant;  

其中GetMagicConstantTControlGuidelines.GetTextBaseline()类似。

答案 1 :(得分:2)

我不认为这个逻辑以任何方式暴露给你在运行时调用。我相信这只是设计时间。

为了解决这个问题,我将在设计器中创建一个虚拟表单,其中包含您使用的每个控件之一。将它们与屏幕截图中的所有方式对齐。在运行时实例化此表单,但不显示它并读出每种控件类型的Top属性。最后,您可以计算出Top属性从每种控件类型到另一种控件类型的垂直偏移量。

答案 2 :(得分:1)

我想将标签对齐到它的编辑框。站在@ ain的肩膀上,我用了这个:

  Label1.Top := edit1.Top + _GetTextBaseline(edit1, tlBottom) - _GetTextBaseline(Label1, tlTop);


  // lifted from TControlGuidelines.GetTextBaseline(AControl: TControl; Align: TTextLayout): Integer;
  function _GetTextBaseline(AControl: TControl; Align: TTextLayout): Integer;
  var
    Canvas: TControlCanvas;
    tm: TTextMetric;
    ClientRect: TRect;
    Ascent, Height: Integer;
  begin
    Canvas := TControlCanvas.Create;
    try
      ClientRect := AControl.ClientRect;
      Canvas.Control := AControl;
      Canvas.Font := TControlFriend(AControl).Font;
      GetTextMetrics(Canvas.Handle, tm);
      Ascent := tm.tmAscent + 1;
      Height := tm.tmHeight;
      case Align of
        tlTop: Result := ClientRect.Top + Ascent;
        tlCenter: Result := (ClientRect.Top + (ClientRect.Bottom - Height) div 2) + Ascent;
        tlBottom: Result := (ClientRect.Bottom - Height) + Ascent;
      else
        Result := 0;
      end;
    finally
      Canvas.Free;
    end;
  end;

答案 3 :(得分:0)

如果您制作两个相同高度的控件,请对齐顶部并垂直对齐文本,即使更改字体大小和字体,基线也会对齐