Delphi XE8: текстовая подсказка TEdit исчезает при получении фокуса
По сути, я хочу, чтобы TextHint моих TEdits исчезал при вводе первого символа, а не при получении фокуса, как в случае изменений на этой странице Microsoft: войдите в свою учетную запись Microsoft. Может кто-нибудь рассказать мне, как этого добиться?
Заранее спасибо.
2 ответа
Основываясь на ответе Уве Раабе, вот процедура (для 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, однако, вы можете добавить оператор if, предоставленный Уве:
if CheckWin32Version(5, 1) and StyleServices.Enabled and _ed.HandleAllocated then
Я только что проверил это с проектом, где я отключил тематику выполнения: это не сработало.
Встроенный TEdit
поведение не позволяет этого, но вы можете получить новый контроль от TEdit
и переопределить DoSetTextHint
, Реализация должна быть похожа на внутренний метод, но обеспечить значение 1 для wParam
вместо 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.StdCtrls.