1、终于添加了 Alignment 属性(taLeftJustify, taRightJustify, taCenter), 可以方便控制文本对齐了;
2、增加了 NumbersOnly 属性(True, False), 控制是否只接受数字;
3、增加了 TextHint 属性, 可以让 TEdit 携带一个辅助文本串(好像是在无焦点时显示的, 但现在有问题).
因为 D2009 中一些控件的 TextHint 属性没有效果, 经跟踪源码发现该属性是通过 API
函数 SendMessage 发送 EM_SETCUEBANNER 消息来实现的. 该消息为 WinXP 中新增消息.
据资料, 要使该消息成功发送的要求是:
1. OS 必须是 WinXP 及更高版本;
2. OS 的主题必须激活.
实现的办法类似下面的函数:
function SetCueBanner(CTRL : THandle; STR : WideString) : Integer;
// The EM_SETCUEBANNER message sets the textual cue, or tip, that is
// displayed by the edit control to prompt the user for information
// Minimum operating systems: Windows XP
const
ECM_FIRST = $1500;
EM_SETCUEBANNER = ECM_FIRST + 1;
begin
Result := SendMessage(CTRL,EM_SETCUEBANNER,0,LParam(PWideChar(STR)));
end;
但是, 在 D2007/D2009 中测试(没有在 D7 中测试), 无论是上面提到的 TextHint 属性
还是 SetCueBanner 函数, 都没有任何效果. 查阅大量资料, 无果. 于是有了下面的代码.
实现原理(要点):
1. 利用 TCanvas 类画出 TEdit 失去焦点且 Text 属性为空时的 TextExHint 属性
(TextHint 属性的加强, 可以设置字体);
2. 从 TEdit 继承, 新增两个属性: TextExHint 和 TextExHintFont, 以及相应的私有变
量: FTextExHint 和 FTextExHintFont. 其中: FTextExHint 设置提示信息,
FTextExHintFont 设置提示信息的字体;
3. 覆盖 Create, Destroy 和 WM_PAINT 方法.
Dggdsm 于 2008.09.03
完整代码如下:
}
unit TextExHintEdit;
interface
uses
SysUtils, Classes, Messages, Controls, StdCtrls, Graphics;
type
TTextExHintEdit = class(TEdit)
private
FTextExHint: string;
FTextExHintFont: TFont;
{ Private declarations }
protected
{ Protected declarations }
FCanvas : TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
public
{ Public declarations }
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property TextExHint: string read FTextExHint write FTextExHint;
property TextExHintFont: TFont read FTextExHintFont write FTextExHintFont;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('DggCtls', [TTextExHintEdit]);
end;
{ TTextExHintEdit }
constructor TTextExHintEdit.Create(AOwner: TComponent);
begin
inherited;
FCanvas := TControlCanvas.Create;
FTextExHintFont := TFont.Create;
FTextExHintFont.Color := clGrayText;
FTextExHintFont.Style := [fsItalic];
TControlCanvas(FCanvas).Control := Self;
end;
destructor TTextExHintEdit.Destroy;
begin
FreeAndNil(FTextExHintFont);
FreeAndNil(FCanvas);
inherited;
end;
procedure TTextExHintEdit.WMPaint(var Message: TWMPaint);
begin
inherited;
if (not Focused) and (Text = '') then
begin
FCanvas.Font := FTextExHintFont;
FCanvas.TextOut(1, 1, FTextExHint);
end;
end;
end.