Delphi 如何在OnHint事件处理程序中检测提示发送方控件?
在Delphi 10.3.3 Windows VCL应用程序中,在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参数没有提供该
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
在我的特定情况下不起作用。因此,要修改提示,我需要使用您的解决方案。@user1580348TStatusBar.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