2010-08-23 35 views
1

D6教授德尔福:如何让我自己的提示窗口?

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

这个主题的问题是HintWindow工作不正常,或者与正常的“提示”一样。

普通提示正在出现,并且它们正在消失在这些情况下: - 提示表示时间ellapsed - 的活性形式被去激活 - 一种新的形式示出 - 应用被另一任务(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周期性出现,dissappears

所以:我们需要知道我们是如何作出这样的工作在相同的方法类似应用HintWindow“提示“,但只限于这个网格 它必须关闭“任务更改”,“更改格式”。怎么做?

感谢您的帮助: DD

回答

2

你最好使用提供机制,显示提示整个应用程序,通过更换传递给应用程序的OnShowHint事件HintInfo参数HintWindowClass每当你需要显示定制提示。也许你会在下面找到一些有用的实现细节。

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

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

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

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

我不知道,如果想形容它像这样可以帮上什么忙,但这里正试图...

+0

唉唉......我忘了说,这个控制是一个虚拟的网格,不是基于在VCL网格上 - 它基于自定义控件。 所以提示来自这个班级。 但是:我不想使用任何控件时可见的“正常”提示。我想让这些细胞给出信息。所以我需要抓住光标移动。 – durumdara 2010-08-23 09:52:09

+0

@durumdara - >“需要捕捉游标移动” - 传递给'OnShowHint'事件的'HintInfo'已经有了游标位置,我描述的实现使用它来定位'提示'将会在哪个单元格上。我现在也提供了一些指向文档的链接。读一下他们... – 2010-08-23 10:08:50