VCL表单设计器提供粉红色指导,用于在各自的文本基线上对齐控件:
但据我所知,这不适用于标签和复选框。 更新:如果您完全放置控件,它适用于标签 ,例如按 Ctrl - arrow 。它适用于复选框 - 见截图。
现在,在某些形式上,我正在代码中创建控件,例如
ed := TEdit.Create(Self);
ed.SetBounds(...);
ed.Parent := SomePanel;
等。如何确保其文本基线对齐?我想将它用于编辑,组合框,标签和复选框。结果应该是这样的(没有红线,当然:-)):
修改:我目前的方法是使用
调用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;
我的目标是用更强大,更少黑客的东西取代它。
答案 0 :(得分:5)
指南在设计时代码中实施,许可证禁止您随应用程序一起提供,因此您只能使用它来从中学习,然后自行重新实现。查找
DesignIntf.TBaseComponentGuidelines
DesignEditors.TComponentGuidelines
VCLEditors.TControlGuidelines
类(在“{RADStudio \ version} \ source \ ToolsAPI目录”中)。也许它归结为简单的事情
Label1.Top := (Edit1.Top + Edit1.Height) - Label1.Height + GetMagicConstant;
其中GetMagicConstant
与TControlGuidelines.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)
如果您制作两个相同高度的控件,请对齐顶部并垂直对齐文本,即使更改字体大小和字体,基线也会对齐