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

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

【问题讨论】:

  • 请注意,turbo c++ explorer是c++builder的免费版本,与旧的turbo-c++无关。

标签: c++ c++builder vcl


【解决方案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,只需在 stackoverflow.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 也可以实现相同的想法,只需在 stackoverflow.com 上搜索 TStringGrid.SetCellsAlignment 或阅读帖子 Delphi: How to make cells' texts in TStringGrid center aligned?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-23
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多