如何在 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 控件中设置文本对齐的主要内容,如果未能解决你的问题,请参考以下文章