1

D6 教授

我们有一个带有特殊网格的特殊应用程序。它有一个提示窗口,可以显示其他不能放在单元格中的信息。例如长备忘录。当您将鼠标移动到一个单元格时,它会等待 2 秒,并显示信息。

这个主题的问题是 HintWindow 无法正常工作,或者与正常“提示”的工作方式相同。

出现正常提示,但在以下情况下它们会消失: - 显示时间已过的提示 - 活动表单已停用 - 显示新表单 - 应用程序被另一个任务替换(ALT + TAB)

但是我们的 HintWindow 无法检测到新表单的显示或应用程序的更改——它一直保持在顶部,直到 disapp。时间... :-(

我们使用“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 提示窗口会循环出现和消失。

所以:我们需要知道如何制作一个与应用程序“Hint”以相同方法工作的 HintWindow,但仅限于这个网格。它必须在“任务更改”、“表单更改”时关闭。怎么做?

感谢您的帮助:dd

4

1 回答 1

2

您最好使用提供的在整个应用程序中显示提示的机制,方法是在需要显示自定义提示时替换传递给应用程序事件的HintInfo参数的HintWindowClass 。OnShowHint也许您可能会在下面找到一些有用的实现细节。

旧答案:
在一个较旧的应用程序中,我有一个不同的列表框和网格提示类。行为有点分散,但基本上可以归结为;

应用程序中的所有 DBGrid 都分配了一些识别提示,例如:“MyDBGridHint”。应用程序的OnShowHint事件测试是否通过了 'HintInfo' 'HintControl' 是 'TCustomDBGrid',如果是,则调用传递 'HintInfo' 的过程。

此过程通过使用带有 HintInfo.CursorPos 的 Grid 的 MouseCoord 方法找到提示应位于的单元格,通过临时更改 Grid 的 DataLink 获取单元格的显示文本。然后该过程创建一个 TCanvas 并为其句柄分配一个为网格检索的 DC,将网格的字体分配给 Canvas 并测试网格单元格的边界是否足以显示文本。如果它决定显示提示,则将单元格文本分配给 HintInfo.HintStr 和派生的提示窗口类 to HintInfo.HintWindowClass,计算位置、边界、设置字体等并返回。

然后OnShowHint事件测试以查看 HintStr 是否仍然是网格提示标识符(我在代码中有一条注释为“网格拥有的控件产生这个。”),如果是,则取消提示。

我不确定尝试这样描述它是否有任何帮助,但这里正在尝试......

于 2010-08-23T09:23:36.307 回答