Delphi:如何调整TEdit的文本垂直位置

6

TEdit(或TCombo,TButtonedEdit)中的文本始终对齐到顶部。我没有找到任何更改对齐方式的属性。通常情况下这不是问题,除非我想要设置一个更大的高度。

我谷歌了一下。有通过发送Windows消息来调整左右边距的解决方案。但是我不知道如何调整垂直对齐方式。

我不想使用更大的字体。有什么想法吗?


2
你无法影响TEdit垂直绘制文本的方式。唯一的方法是按照这里所解释的方式子类化TEdit控件并重写其Paint方法。https://dev59.com/4WHVa4cB1Zd3GeqPo6vS#9774687 - roumen
1
更容易的方法是派生一个多行子类(如网格的TInplaceEdit),并设置格式化矩形,而不是对其进行绘制。 - Sertac Akyuz
3个回答

3
如果有这样的选项,它将通过样式应用。 EDIT控件样式列表中没有这样的样式,因此可以得出结论,底层控件不提供此功能。
您必须要么创建一个新控件,要么自己接管绘画。两者都不是特别吸引人的选择。

谢谢。我认为接管绘画是一个合理的方式。当我在几天内完成实现后,我会回到一个结论。 - stanleyxu2005
@stanleyxu2005,你找到解决这个问题的方法了吗? - Nickolas de Luca Alberton

0
清理一下一个旧问题...我在一个类似的C++问题中找到了解决方案:https://dev59.com/wUfRa4cB1Zd3GeqP-ZiC#51079348

  • 通过将TEdit的属性BorderStyle设置为bsSingle,文本会自动垂直居中。
  • 这样做的代价是在编辑框周围加上边框。

在Delphi 10.3 Rio中对我有效。


我正在使用Delphi 10.3.3,但我无法确认。它仍然在顶部。有任何想法吗? - Xel Naga

0
... 有什么想法吗?
很不幸,我没有找到一个好的解决方案,所以我在我的项目中使用了一个技巧:这个技巧是,在编辑框下面放置一个形状!
只需将TEdit的AutoSize属性设置为False,根据需要放置和更改TEdit的宽度和高度,然后使用以下过程:
procedure PutShapeUnderEdit(edit: TEdit; padding: Integer);
var
  bmp: TBitmap;
  shape: TShape;
  h: Integer;
begin
  bmp := TBitmap.Create;
  try
    bmp.Canvas.Font.Assign(edit.Font);
    h := bmp.Canvas.TextExtent('Some characters: AÄBCDEgjpqy!"$&/|,').cy;
  finally
    bmp.Free;
  end;
  shape := TShape.Create(nil);
  shape.Parent := edit.Parent;
  shape.Brush.Color := edit.Color;
  shape.Pen.Color := edit.Font.Color;
  shape.Left := edit.Left;
  shape.Top := edit.Top;
  shape.Width := edit.Width;
  shape.Height := edit.Height;
  edit.BorderStyle := bsNone;
  edit.Left := edit.Left + padding;
  edit.Width := edit.Width - 2 * padding;
  edit.Top := edit.Top + padding + (edit.Height - h - 2 * padding) div 2;
  edit.Height := h;
end;

只需在FormCreate中调用该过程一次即可使用:

procedure TForm1.FormCreate(Sender: TObject);
begin
  PutShapeUnderEdit(Edit1, 10);
end;

The output

这对我有效,但您必须考虑项目中的其他参数,不要盲目使用此代码,只需查看该想法是否适用于您。

顺便说一下,我在Delphi 10 Seattle和Windows 10中使用VCL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接