如何在 TEdit 控件中设置文本对齐

Posted

技术标签:

【中文标题】如何在 TEdit 控件中设置文本对齐【英文标题】:How to set textalignment in TEdit control 【发布时间】:2010-12-15 21:56:35 【问题描述】:

我正在使用 turbo c++ explorer edition(免费版)。有人知道如何设置 TEdit 控件的 textAlignment 吗?

【问题讨论】:

请注意,turbo c++ explorer是c++builder的免费版本,与旧的turbo-c++无关。 【参考方案1】:

您可能会发现这个问题的解决方案很有趣:

http://bcbjournal.com/bcbcaq/?loc=edits&caq=28

它通过为控件启用ES_RIGHT Windows 样式使编辑框右对齐,但是在创建组件时它会这样做。由于历史原因,标准 Windows 编辑控件不支持在创建(正式地)后更改对齐方式,如 this post on The Old New Thing 中所述。但是,从检查各种索赔和 cmets 可以看出,这已经发生了变化,尽管仍然没有记录应该是可能的。

因此,如果您想在不创建自己的组件的情况下执行此操作,您可以像这样使用 Windows API 函数SetWindowLong

DWORD alignment = ES_RIGHT;
DWORD oldStyle = GetWindowLong(Edit1->Handle, GWL_STYLE);
DWORD newStyle = (oldStyle & ~(ES_LEFT | ES_CENTER | ES_RIGHT)) | alignment;
SetWindowLong(Edit1->Handle, GWL_STYLE, newStyle);

请注意,您可能需要致电 SetWindowPos 才能使更改生效,如本文前面链接的帖子中的 cmets 所述。

【讨论】:

SetWindowPos 没有成功,但调用 Edit1->Invalidate 对我有用。正如雷蒙德所说,这是一个不受支持的黑客攻击......【参考方案2】:

在 Delphi 上,我通过重载 TEdit 类型来做到这一点:

在接口部分,在我放置任何 TForm 声明之前:

type
    TEdit=class(StdCtrls.TEdit)
    private
      FAlignment:TAlignment;
      procedure SetAlignment(Value:TAlignment);
    protected
      procedure CreateParams(var Params:TCreateParams);override;
    public
      constructor Create(AOwner:TComponent);override;
    published
      property Alignment:TAlignment read FAlignment write SetAlignment default taLeftJustify;
    end;

在实现部分,我将实现如下:

procedure TEdit.SetAlignment(Value:TAlignment);
begin
     if FAlignment<>Value
     then begin
               FAlignment:=Value;
               RecreateWnd;
          end;
end;

procedure TEdit.CreateParams(var Params:TCreateParams);
const
     Alignments:array[TAlignment] of Cardinal=(ES_LEFT,ES_RIGHT,ES_CENTER);
begin
     inherited CreateParams(Params)
     Params.Style:=Params.Style or Alignments[FAlignment];
end;

constructor TEdit.Create(AOwner:TComponent);
begin
     inherited Create(AOwner);
     FAlignment:=taLeftJustify;
end;

然后在OnCreate 事件的表单上我输入了这样的内容:

MyEditBox.Alignment:=taLeftJustify;
MyEditBox.Alignment:=taCenter;
MyEditBox.Alignment:=taRightJustify;

就是这样。

请注意,它可以改进很多,它只是将它添加到 TEdit 的概念验证,它不是关于创建一个新类(使用其他名称),也不是关于创建一个新组件。

希望这对某人有用。

P.D.:同样的想法也可以用于 TStringGrid,只需在 ***.com 上搜索 CellsAlignment 或阅读帖子 Delphi: How to make cells' texts in TStringGrid center aligned?

【讨论】:

【参考方案3】:

要设置对齐属性 - 显示左对齐、居中或右对齐的文本,您可以设置对齐属性,例如对于名为 Edit1 的编辑控件,它是表单对象的指针成员,要将对齐设置为右对齐,您可以使用:

Edit1->Alignment = taRightJustify;

其他对齐属性是 taLeftJustify 和 taCenter。

这只会影响控件上字符的位置,而不是从右到左或从左到右对齐。这可以通过设置 BiDiMode 属性来调整 - bdLeftToRight、bdRightToLeft(这些在从左到右和从右到左的语言中更重要)

还是我在问题中遗漏了一些明显的东西?

【讨论】:

在 turbo c++ explorer 中,TEdit 组件没有“对齐”属性... 我只是设置一个虚拟机,看看需要什么 找到turbo c++ explorer的demo版并非易事 免费版不再可用:( 旧版本的 VCL 在 TEdit 控件上没有对齐属性。较新的版本可以。【参考方案4】:

我也可以在另一个单独的单元中,所以这里是:

unit AlignedTEdit;

interface

uses Windows,Classes,Controls,StdCtrls;

type
    TEdit=class(StdCtrls.TEdit)
    private
      FAlignment:TAlignment;
      procedure SetAlignment(Value:TAlignment);
    protected
      procedure CreateParams(var Params:TCreateParams);override;
    public
      constructor Create(AOwner:TComponent);override;
    published
      property Alignment:TAlignment read FAlignment write SetAlignment default taLeftJustify;
    end;

implementation

procedure TEdit.SetAlignment(Value:TAlignment);
begin
     if FAlignment<>Value
     then begin
               FAlignment:=Value;
               RecreateWnd;
          end;
end;

procedure TEdit.CreateParams(var Params:TCreateParams);
const
     Alignments:array[TAlignment] of Cardinal=(ES_LEFT,ES_RIGHT,ES_CENTER);
begin
     inherited CreateParams(Params);
     Params.Style:=Params.Style or Alignments[FAlignment];
end;

constructor TEdit.Create(AOwner:TComponent);
begin
     inherited Create(AOwner);
     FAlignment:=taLeftJustify;
end;

end.

这是一个整体,将其保存到一个名为AlignedTEdit.pas的文件中。

然后在任何形式的接口使用子句末尾添加TEdit ,AlignedTEdit

P.D.:TStringGrid 也可以实现相同的想法,只需在 ***.com 上搜索 TStringGrid.SetCellsAlignment 或阅读帖子 Delphi: How to make cells' texts in TStringGrid center aligned?

【讨论】:

以上是关于如何在 TEdit 控件中设置文本对齐的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在TextView中设置文本对齐方式

C#/VB.NET:在 Word 中设置文本对齐方式

如何根据屏幕大小调整按钮的图像和文本大小(自动布局)

◆◆0如何在Smartforms中设置左右对齐

在android的微调器中设置视图文本在中心对齐

如何在WPF PasswordBox中设置一些默认的文本