Delphi XE8: TEdit TextHint接收焦点时消失



基本上,我希望我的TEdits的TextHint在输入第一个字符时消失,而不是当它们收到焦点时消失,就像这个Microsoft页面上的编辑:登录到您的Microsoft帐户。有人能告诉我如何实现这一点吗?

提前感谢。

内置的TEdit行为不允许这样做,但是您可以从TEdit派生一个新的控件并覆盖DoSetTextHint。实现应该类似于内部方法,但是为wParam提供一个值1而不是0。

这是一个使用拦截器类的解决方案:
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 . stdctrl .

之后的接口使用子句中。

基于Uwe Raabe的回答,这里是一个过程(对于Delphi 2007,应该也适用于较新版本的Delphi):

type
  TCueBannerHideEnum = (cbhHideOnFocus, cbhHideOnText);
procedure TEdit_SetCueBanner(_ed: TEdit; const _s: WideString; _WhenToHide: TCueBannerHideEnum = cbhHideOnFocus);
const
  EM_SETCUEBANNER = $1501;
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

我刚刚用一个项目测试了它,我禁用了运行时主题:它不工作。

相关内容

  • 没有找到相关文章

最新更新