基本上,我希望我的TEdits的TextHint在输入第一个字符时消失,而不是在它们获得焦点时消失,就像这个Microsoft页面上的Edits一样:登录到您的Microsoft帐户。请问有人能够指导我如何实现这个功能吗?
提前感谢您。
提前感谢您。
TEdit
行为不允许此操作,但是您可以从TEdit
派生一个新控件并覆盖DoSetTextHint
。实现方式应该与内部方法类似,但是将wParam
的值更改为1。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.
根据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;
if CheckWin32Version(5, 1) and StyleServices.Enabled and _ed.HandleAllocated then
我刚刚用一个禁用运行时主题的项目进行了测试:它没有起作用。
TComboBox
一起使用吗,dummzeach 和 @UweRaabe? - Reginald Greyling