Delphi XE8:TEdit TextHint 在获得焦点时消失
Delphi XE8: TEdit TextHint Disappears When Receiving Focus
基本上,我希望我的 TEdits 的 TextHint 在输入第一个字符时消失,而不是在它们获得焦点时消失,就像这个 Microsoft 页面上的编辑:Sign in to your Microsoft account。有人可以告诉我如何实现这一目标吗?
提前致谢。
内置 TEdit
行为不允许这样做,但您可以从 TEdit
派生新控件并覆盖 DoSetTextHint
。实现应该类似于内部方法,但为 wParam
提供值 1 而不是 0.
这是一个使用 interceptor class:
的解决方案
unit EditInterceptor;
uses
Vcl.StdCtrls, System.SysUtils, Winapi.Messages, Windows;
type
TEdit = class(Vcl.StdCtrls.TEdit)
protected
procedure DoSetTextHint(const Value: string); override;
end;
implementation
uses
Vcl.Themes, Winapi.CommCtrl;
procedure TEdit.DoSetTextHint(const Value: string);
begin
if CheckWin32Version(5, 1) and StyleServices.Enabled and HandleAllocated then
SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value);
end;
end.
确保将此单元放在接口使用子句中 Vcl.StdCtrls.
之后
根据 Uwe Raabe 的回答,这里有一个程序(适用于 Delphi 2007,应该也适用于更新版本的 Delphi):
type
TCueBannerHideEnum = (cbhHideOnFocus, cbhHideOnText);
procedure TEdit_SetCueBanner(_ed: TEdit; const _s: WideString; _WhenToHide: TCueBannerHideEnum = cbhHideOnFocus);
const
EM_SETCUEBANNER = 01;
var
wParam: Integer;
begin
case _WhenToHide of
cbhHideOnText: wParam := 1;
else // cbhHideOnFocus: ;
wParam := 0;
end;
SendMessage(_ed.Handle, EM_SETCUEBANNER, wParam, Integer(PWideChar(_s)));
end;
你这样称呼它:
constructor TForm1.Create(_Owner: TComponent);
begin
inherited;
TEdit_SetCueBanner(ed_HideOnFocus, 'hide on focus', cbhHideOnFocus);
TEdit_SetCueBanner(ed_HideOnText, 'hide on text', cbhHideOnText);
end;
虽然它不检查 Windows 版本,但您可能想要添加 Uwe 提供的 if 语句:
if CheckWin32Version(5, 1) and StyleServices.Enabled and _ed.HandleAllocated then
我刚刚在禁用运行时主题的项目中对其进行了测试:它不起作用。
基本上,我希望我的 TEdits 的 TextHint 在输入第一个字符时消失,而不是在它们获得焦点时消失,就像这个 Microsoft 页面上的编辑:Sign in to your Microsoft account。有人可以告诉我如何实现这一目标吗?
提前致谢。
内置 TEdit
行为不允许这样做,但您可以从 TEdit
派生新控件并覆盖 DoSetTextHint
。实现应该类似于内部方法,但为 wParam
提供值 1 而不是 0.
这是一个使用 interceptor class:
的解决方案unit EditInterceptor;
uses
Vcl.StdCtrls, System.SysUtils, Winapi.Messages, Windows;
type
TEdit = class(Vcl.StdCtrls.TEdit)
protected
procedure DoSetTextHint(const Value: string); override;
end;
implementation
uses
Vcl.Themes, Winapi.CommCtrl;
procedure TEdit.DoSetTextHint(const Value: string);
begin
if CheckWin32Version(5, 1) and StyleServices.Enabled and HandleAllocated then
SendTextMessage(Handle, EM_SETCUEBANNER, WPARAM(1), Value);
end;
end.
确保将此单元放在接口使用子句中 Vcl.StdCtrls.
之后根据 Uwe Raabe 的回答,这里有一个程序(适用于 Delphi 2007,应该也适用于更新版本的 Delphi):
type
TCueBannerHideEnum = (cbhHideOnFocus, cbhHideOnText);
procedure TEdit_SetCueBanner(_ed: TEdit; const _s: WideString; _WhenToHide: TCueBannerHideEnum = cbhHideOnFocus);
const
EM_SETCUEBANNER = 01;
var
wParam: Integer;
begin
case _WhenToHide of
cbhHideOnText: wParam := 1;
else // cbhHideOnFocus: ;
wParam := 0;
end;
SendMessage(_ed.Handle, EM_SETCUEBANNER, wParam, Integer(PWideChar(_s)));
end;
你这样称呼它:
constructor TForm1.Create(_Owner: TComponent);
begin
inherited;
TEdit_SetCueBanner(ed_HideOnFocus, 'hide on focus', cbhHideOnFocus);
TEdit_SetCueBanner(ed_HideOnText, 'hide on text', cbhHideOnText);
end;
虽然它不检查 Windows 版本,但您可能想要添加 Uwe 提供的 if 语句:
if CheckWin32Version(5, 1) and StyleServices.Enabled and _ed.HandleAllocated then
我刚刚在禁用运行时主题的项目中对其进行了测试:它不起作用。