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

Delphi XE8:TEdit TextHint在接收焦点时消失,delphi,focus,delphi-xe8,editcontrol,Delphi,Focus,Delphi Xe8,Editcontrol,基本上,我希望我的TEDIT的文本提示在输入第一个字符时消失,而不是在它们收到焦点时消失,就像Microsoft页面上的编辑一样:。有人能告诉我如何做到这一点吗 提前感谢。内置的TEdit行为不允许这样做,但您可以从TEdit派生一个新控件并覆盖dosetexthint。实现应该类似于内部方法,但为wParam提供值1,而不是0 这是一个使用以下方法的解决方案: 确保将该单元放在Vcl.StdCtrls之后的interface uses子句中。根据Uwe Raabe的回答,以下是一个过程(对于D

基本上,我希望我的TEDIT的文本提示在输入第一个字符时消失,而不是在它们收到焦点时消失,就像Microsoft页面上的编辑一样:。有人能告诉我如何做到这一点吗


提前感谢。

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

这是一个使用以下方法的解决方案:


确保将该单元放在Vcl.StdCtrls之后的interface uses子句中。

根据Uwe Raabe的回答,以下是一个过程(对于Delphi 2007,也适用于较新版本的Delphi):

你这样称呼它:

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

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

关于您对我的答案的编辑:SendMessage不会编译,因为值是字符串。这就是为什么要使用SendTextMessage(至少在D2009+中是这样)。哦,对不起。我查找了SendTextMessage,除了发送短信外,找不到任何其他内容。SendTextMessage在哪里声明?它是RTL函数还是Windows API?自D2009以来,它在(Winapi.)消息中声明,并包装了难看的转换。当LPRAM必须指向字符串时非常方便。非常感谢@Uwe和dummzeuch提交您的答案!我真的很感激。在对创建组件进行了一些研究之后,我终于能够创建我自己的(对不起,我不知道如何突出显示文本)THintEdit和ThintLabeledIt,它们工作得非常好@我还没有测试过,但可能会。你试过了吗?
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