D6教授。
我们有一个特殊的网格特殊应用程序。它有一个HintWindow可以显示其他无法放置在单元格中的信息。例如长备忘录。 将鼠标移动到单元格时,它等待2秒,然后显示信息。
这个主题的问题是HintWindow无法正常工作,或者与正常的“提示”相同。
正常提示正在出现,在这些情况下它们正在消失: - 提示显示时间已经消失 - 活动表单已停用 - 显示的新表格 - 由另一个任务(ALT + TAB)替换的应用程序
但是我们的HintWindow无法检测到新的表单显示,或者应用程序已更改 - 它仍保留在顶部,而直到失败。时间......: - (
我们使用“MouseMove”检测鼠标更改的另一个问题 - 启动提示。
如果HintWindow消失,也会发生此事件。所以我需要使用以下代码来防止循环显示:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Caption := INtTOStr(X) + ' ' + IntToStr(Y) + ' ' + IntToStr(GetTickCount);
// If same coordinate I don't show it again
if (LX <> X) or (LY <> Y) then begin
miHint.DoActivateHint(Self, 'Anytext', 2000, 2000);
LX := X; LY := Y;
end;
end;
没有这个LX,LY HintWindow会循环显示并消失。
所以:我们需要知道我们如何使HintWindow在应用程序“Hint”中使用相同的方法,但仅限于此网格。 它必须关闭“任务改变”,“形式改变”。怎么做?
谢谢你的帮助: DD
答案 0 :(得分:2)
您最好使用提供的机制在整个应用程序中显示提示,方法是在需要显示时替换传递给应用程序HintWindowClass事件的HintInfo参数的OnShowHint
定制提示。也许你可能会在下面找到一些有用的实现细节。
旧答案:
在一个较旧的应用程序中,我有一个不同的列表框和网格提示类。行为有点分散,但基本上归结为;
应用程序中的所有DBGrids都分配了一些识别提示,例如:'MyDBGridHint'。应用程序的OnShowHint
事件测试如果传递'HintInfo''HintControl'是'TCustomDBGrid',如果是这样,则调用传递'HintInfo'的过程。
此过程通过使用带有HintInfo.CursorPos的Grid的MouseCoord方法找到提示应该打开的单元格,通过临时更改Grid的DataLink来获取单元格的显示文本。然后,该过程创建一个TCanvas并为其Handle分配一个为Grid检索的DC,将该网格的字体分配给Canvas并测试以查看网格单元的边界是否足以显示该文本。如果它确定将显示提示,则将单元格文本分配给HintInfo.HintStr,并将派生的提示窗口类分配给HintInfo.HintWindowClass
,计算位置,边界,设置字体等等。然后返回。
然后OnShowHint
事件测试以查看HintStr是否仍然是网格提示标识符(我在代码中有一个注释“由网格自己控制产生这个。”)如果是,则取消提示。
我不确定是否试图像这样描述它可以有任何帮助,但这里正在尝试......