【发布时间】:2022-01-08 06:25:21
【问题描述】:
在状态栏中显示提示的规范方法是通过以下代码:
Constructor TMyForm.Create;
begin
inherited create (nil);
...
Application.OnHint:= MyHint;
...
end;
procedure TMyForm.MyHint (Sender: TObject);
begin
sb.simpletext:= Application.Hint;
end;
procedure TMyForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.OnHint:= nil;
...
end;
当程序由模态形式组成时,上述方法工作得很好,但是当使用非模态形式(不一定是 MDI)时,就会出现问题。在这些情况下,将创建一个非模态表单并将Application.OnHint 分配给非模态表单内的一个过程;状态栏显示来自表单的提示。但是如果创建另一个非模态表单,Application.OnHint 现在被分配给第二个表单中的相同过程。在第一个非活动表单中将鼠标移到带有提示的控件上会导致该提示显示在第二个表单的状态栏中!
如何使每个非模态表单显示仅源自其自身控件的提示?一种可能性是当表单变为非活动状态时从控件中删除提示,并在表单再次变为活动状态时恢复它们,但这是非常不雅的。问题在于Application.OnHint 事件。
【问题讨论】:
-
我所有的应用程序在每个非模态表单中都有一个状态栏(并且可能同时有几个非模态表单可见),有时也是奇怪的模态表单(并且可能原则上是几个层次的模态,虽然非常罕见)。我所有的状态栏都在光标下方显示控件或菜单项的提示。使用
TApplicationEvents拖放到每个具有此类状态栏的表单上(使用组件的OnHint属性),这是微不足道的。但是,如果我理解正确,这对您来说还不够好:您希望表单 X 仅显示来自 X 的提示? -
@AndreasRejbrand:如果您的状态栏在光标下方显示控件的提示,那么可以肯定,这是表单 X 显示来自 X 的提示。这就是我想要的。也许把这个作为答案?
-
如果不涉及菜单,您可以使用 Application.OnShowHint 通过 HintInfo.HintControl 确定生成提示的控件,从而确定承载该控件的表单,例如使用 GetParentForm。当涉及到菜单时更复杂,我浏览了一个早期的应用程序,发现我使用了一个修改过的“forms.pas”来获取菜单项生成的提示激活。
标签: delphi statusbar hints non-modal