如何向应用程序发送提示消息? 我试过一点测试:
{{1}}
观察Memo1的行,似乎每次设置时都会发送一条空的提示消息' Hello'。
在真实场景中,空提示消息会隐藏我的提示消息而我不明白我做错了什么,这是错误的方法吗?
答案 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.OnShowHint
或TApplicationEvents.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
允许您执行现有提示弹出窗口的实时更新。