首页 > 解决方案 > 如何在 OnHint 事件处理程序中检测提示发送者控制?

问题描述

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

procedure TForm1.ApplicationEvents1Hint(Sender: TObject);
begin
  statMain.SimpleText := Application.Hint;
end;

但是,我想添加一些包含特定运行时数据的特定文本,具体取决于哪个控件发送提示。

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

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

标签: delphidelphi-10.3-riohints

解决方案


OnHint事件不提供对有关显示提示的控件的任何信息的访问。

但是,OnShowHint事件确实如此,您可以在该事件中完全自定义提示:

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string;
  var CanShow: boolean; var HintInfo: THintInfo);
begin
  if HintInfo.HintControl = DesiredControl then
  begin
    // customize HintStr, and/or HintInfo fields, as needed...
  end;
end;

procedure TForm1.ApplicationEvents1Hint(Sender: TObject);
begin
  statMain.SimpleText := Application.Hint;
end;

提供有关您可以自定义的提示的HintInfo各种信息:

HintControl 正在进行
提示处理的控件的名称。

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

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

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

HintColor
提示窗口的背景颜色。

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

CursorPos
鼠标指针在控件内的位置。

ReshowTimeout
提示系统在再次询问提示状态之前应该等待多长时间。默认情况下,该字段为零,表示提示状态不会改变。将其设置为非零值将导致提示在请求的毫秒数过去后采取行动,就好像用户将鼠标移出提示矩形并重新移入一样。这可用于推迟提示处理一段时间时间,或允许定期更新提示。

HideTimeout
显示提示的毫秒数。默认情况下,它设置为 Application 变量的 HintHidePause 属性的值。

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

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

另外,仅供参考,您不需要使用TApplication(Event).OnHint事件来TApplication.Hint显示TStatusBar. 如果将 StatusBar 的AutoHint属性设置为 true,则 StatusBar 可以TApplication.Hint自动显示更新。您只需要确保您没有OnHint分配处理程序,否则AutoHint将无法工作(OnShowHint虽然很好)。


推荐阅读