Delphi 如何在OnHint事件处理程序中检测提示发送方控件?

Delphi 如何在OnHint事件处理程序中检测提示发送方控件?,delphi,delphi-10.3-rio,hints,Delphi,Delphi 10.3 Rio,Hints,在Delphi 10.3.3 Windows VCL应用程序中,在TApplicationEvents组件的OnHint事件处理程序中,我在状态栏中显示当前提示: procedure TForm1.ApplicationEvents1Hint(Sender: TObject); begin statMain.SimpleText := Application.Hint; end; 但是,我想添加一些包含特定运行时数据的特定文本,具体取决于发送提示的控件 不幸的是,Sender参数没有提供该

在Delphi 10.3.3 Windows VCL应用程序中,在
TApplicationEvents
组件的
OnHint
事件处理程序中,我在状态栏中显示当前提示:

procedure TForm1.ApplicationEvents1Hint(Sender: TObject);
begin
  statMain.SimpleText := Application.Hint;
end;
但是,我想添加一些包含特定运行时数据的特定文本,具体取决于发送提示的控件

不幸的是,
Sender
参数没有提供该信息

那么,如何检测哪个控件发送了提示?

该事件不提供对显示提示的控件的任何信息的访问

但是,该事件确实存在,并且您可以在该事件中完全自定义所需的提示:

过程TForm1.ApplicationEvents1ShowHint(var HintStr:string;
变量CanShow:boolean;变量HintInfo:thintifo);
开始
如果HintInfo.HintControl=DesiredControl,则
开始
//根据需要自定义HintStr和/或HintInfo字段。。。
结束;
结束;
程序TForm1.ApplicationEvents1Hint(发送方:ToObject);
开始
statMain.SimpleText:=Application.Hint;
结束;
提供了有关提示的各种信息,您可以自定义这些信息:

hint控制
正在进行提示处理的控件的名称

HintWindowClass
提示窗口控件的类。默认值为THintWindow,但您可以指定从THintWindow派生的任何类。如果要将自定义提示窗口替换为THintWindow,请使用此字段

HintPos
提示窗口左上角屏幕坐标中的默认位置。通过更改此值更改窗口的显示位置

HintMaxWidth
开始换行之前提示窗口的最大宽度。默认情况下,该值是屏幕的宽度(全局屏幕变量的宽度属性)

HintColor
提示窗口的背景色

CursorRect
要显示提示窗口,用户鼠标指针必须位于的矩形中。CursorRect的默认值是控件的客户端矩形。更改此值,以便将单个控件划分为多个提示区域。当用户将鼠标指针移到矩形外时,提示窗口将消失

CursorPos
鼠标指针在控件中的位置

重新显示超时时间
提示系统在再次询问提示状态之前应该等待多长时间。默认情况下,此字段为零,表示提示状态不会更改。将其设置为非零值将导致提示在请求的毫秒后动作,就好像用户将鼠标移到提示矩形外并移回提示矩形一样。这可以用于将提示处理延迟一段时间,或者允许定期更新提示

隐藏超时
显示提示的毫秒数。默认情况下,它设置为应用程序变量的HintHidePause属性的值

HintStr
要在提示窗口中显示的字符串。这允许OnHint事件处理程序在提示显示之前修改其内容。默认情况下,它包含传递应用程序变量的Hint属性值时GetShortHint函数返回的值

HintData
要传递给提示窗口控件的其他数据。将此字段与HintWindowClass结合使用


另外,仅供参考,您不需要使用
TApplication(Event).OnHint
事件,只需在屏幕中显示
TApplication.Hint
文本即可。如果将状态栏的属性设置为true,则状态栏可以显示
TApplication.Hint
自动更新。您只需确保未分配
OnHint
处理程序,否则
AutoHint
将无法工作(
OnShowHint
很好)。

巧妙!最简单的往往是最好的解决方案@雷米利博:我知道showhint的
和它的
HintInfo.HintControl
。我没有提到它的原因是,它似乎只有在控件将
ShowHint
设置为
True
时才会触发(我从来没有这样做过,因为我希望我的提示显示在状态栏中,但不是黄色的弹出窗口),并且它会以通常的弹出提示延迟触发(我希望立即得到提示)。
OnHint
事件没有这些“缺点”。因此,我寻找另一种解决办法。我现在意识到,我仍然可以使用
OnShowHint
抑制提示弹出,并使用
应用程序消除延迟。HintPause
。也许,除了
OnHint
之外,使用
OnShowHint
会使事情变得不必要的复杂。“AutoHint”:我已经尝试过了。但出于某种奇怪的原因,
AutoHint
在我的特定情况下不起作用。因此,要修改提示,我需要使用您的解决方案。@user1580348
TStatusBar.AutoHint
在分配
TApplication(Events).OnHint
处理程序时不起作用。更新
TApplication.Hint
时,如果分配了
TApplication(Events).OnHint
事件,则将触发
THintAction
事件,否则将向所有控件广播
TStatusBar
AutoHint
为真时侦听的内容。因此,如果您想使用
AutoHint
,那么就不要使用
OnHint
OnShowHint
很好)。这很奇怪:有时候,
OnShowHint
事件发生在
OnHint
事件之后!为什么会这样?更奇怪的是:如果我在
OnHint
OnShowHint
事件处理程序中都添加了
CodeSite.Send
调试消息,那么
OnShowHint
事件处理程序中的调试消息不会被发送,只有
OnHint
事件处理程序中的调试消息被发送@雷米利博:据我所知,文件是正确的。它是
True
by