如何通过代码发送提示消息?

时间:2016-09-30 14:46:47

标签: delphi hint

如何向应用程序发送提示消息? 我试过一点测试:

{{1}}

观察Memo1的行,似乎每次设置时都会发送一条空的提示消息' Hello'。

enter image description here

在真实场景中,空提示消息会隐藏我的提示消息而我不明白我做错了什么,这是错误的方法吗?

2 个答案:

答案 0 :(得分:4)

您不应该直接设置 main().with( table( tr( td().with( img().withSrc(imagePath+photo) ) td().with( span(name) ), td().with( span(String.valueOf(quantity)) ) 。该框架来自Application.Hint。它是这样的:

TApplication.Idle

这里Control := DoMouseIdle; if FShowHint and (FMouseControl = nil) then CancelHint; Application.Hint := GetLongHint(GetHint(Control)); 是鼠标下的任何控件。由于您尚未为程序中的任何控件指定Control属性,因此无论何时执行此代码,都会将Hint设置为Application.Hint

所以,这是发生的事情:

  • 移动鼠标:
  • 您的鼠标移动处理程序通过设置''来响应。
  • 消息队列已清空,Application.Hint执行。
  • 这会将TApplication.OnIdle更新回Application.Hint

然后你回到起点并来回重复。

所以,是的,这确实是错误的做法。究竟什么是正确的方法,我不能说,因为我不知道你的真正问题。通常,您可以为操作,菜单项,按钮,工具按钮等组件设置''属性。但也许您的需求更具动态性。我无法与他们交谈,但我相信我已经解释了为什么你会观察到这种行为。

我觉得值得做的另一点是提示是非常有趣的野兽。您不会以同步方式显示提示。等到系统决定显示提示,然后以某种方式向其提供提示内容。当应用程序变为空闲时,通常在鼠标停止移动时显示提示。试图强制提示在Hint事件中显示的代码最好被描述为与框架交叉使用的代码。

答案 1 :(得分:4)

我怀疑你真正要做的是在鼠标移动到控件上时调整当前显示的提示。为此,您可以使用TApplication.OnShowHintTApplicationEvents.OnShowHint事件,或者对目标控件进行子类化以处理CM_HINTSHOW消息。其中任何一个都可以访问您可以自定义的THintInfo记录,例如:

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string;
  var CanShow: Boolean; var HintInfo: THintInfo)
begin
  // HintInfo.HintControl is the control that is about to display a hint
  if HintInfo.HintControl = Memo1 then
  begin
    // HintInfo.CursorPos is the current mouse position within the HintControl
    HintStr := Format('Hello, cursor = %d,%d', [HintInfo.CursorPos.X, HintInfo.CursorPos.Y]);

    // the hint will remain active until it times out (see
    // TApplication.HintHidePause and THintInfo.HideTimeout) or
    // the mouse moves outside of the HintInfo.CursorRect.  In
    // the latter case, a new hint will be displayed. This allows
    // you to change the hint for different sections of the
    // HintControl. The CursorRect is set to the HintControl's
    // whole client area by default.

    // In this example, setting the new CursorRect to a 1x1 square
    // around the current CursorPos will display a new hint string
    // on each mouse movement...
    HintInfo.CursorRect := Rect(HintInfo.CursorPos.X, HintInfo.CursorPos.Y, HintInfo.CursorPos.X, HintInfo.CursorPos.Y);
  end;
end;

请注意,只有在显示新的提示弹出窗口时,以这种方式自定义显示的提示才会在每次提示更改时触发TApplication.OnHint / TApplicationEvents.OnHint事件。 OnShowHint / CM_HINTSHOW允许您执行现有提示弹出窗口的实时更新。

hint with live updates