2

TAction 有一个 OnHint 事件,但不幸的是没有 OnHideHint 事件。这有以下缺点:我有 ToolButtons 和其他与操作相关的控件。每当鼠标悬停在这样的控件上时,Action 的提示就会显示在 StatusBar 中;(我已将 StatusBar 的 AutoHint 属性设置为 True)。但是当鼠标离开 ToolButton 时,StatusBar 中先前的自定义文本(不是来自提示)不会自动恢复!现在我可以为表单上的每个控件编写一个 OnMouseLeave 事件处理程序来恢复我在状态栏中的自定义文本,但这会很麻烦!不是有什么东西可以自动恢复状态栏中的先前文本吗?TAction 中的 OnHideHint 事件将是理想的!

4

2 回答 2

2

这是默认行为,当 AutoHint 为 True 时,状态栏会通过在第一个面板中显示提示文本的长版本来自动响应提示操作。

您遇到的问题是,当您用鼠标离开控件时,您基本上是在进入另一个窗口,它是父控件。并且因为该父级没有分配给它的提示字符串值,所以提示动作被更新为一个空字符串。

如果您想在没有提示显示时返回默认值,请在表单上放置一个TApplicationEvents组件并使用 TApplication.OnHint 事件,如下所示:

var
  OriginalPanelText : String = 'BLA';

procedure TForm1.ApplicationEvents1Hint(Sender: TObject);
begin

   if StatusBar1.SimplePanel or (StatusBar1.Panels.Count = 0)
  then
    if Application.Hint <> ''
    then
       StatusBar1.SimpleText := Application.Hint
    else
       StatusBar1.SimpleText := OriginalPanelText
  else
    if Application.Hint <> ''
    then
      StatusBar1.Panels[0].Text := Application.Hint
    else
      StatusBar1.Panels[0].Text := OriginalPanelText;

end;
于 2013-06-10T22:23:00.493 回答
0

魔术AutoHint都发生在TStatusBar.ExecuteAction. 当提示停止显示该代码时,会将状态栏文本设置为空。您可以像这样修改行为:

type
  TStatusBar = class(ComCtrls.TStatusBar)
  private
    FRestoreTextAfterHintAction: string;
  public
    function ExecuteAction(Action: TBasicAction): Boolean; override;
  end;

function TStatusBar.ExecuteAction(Action: TBasicAction): Boolean;
var
  HintText: string;
begin
  if AutoHint and not (csDesigning in ComponentState) and
     (Action is THintAction) and not DoHint then begin
    HintText := THintAction(Action).Hint;
    if SimplePanel or (Panels.Count=0) then begin
      if HintText='' then begin
        SimpleText := FRestoreTextAfterHintAction;
      end else begin
        FRestoreTextAfterHintAction := SimpleText;
        SimpleText := HintText;
      end;
    end else begin
      if HintText='' then begin
        Panels[0].Text := FRestoreTextAfterHintAction;
      end else begin
        FRestoreTextAfterHintAction := Panels[0].Text;
        Panels[0].Text := HintText;
      end;
    end;
    Result := True;
  end else begin
    Result := inherited ExecuteAction(Action);
  end;
end;

我使用了一个相当粗糙的插入器类和一个脆弱的实例变量来存储要恢复的文本。如果你愿意,你可以把它弄得更健壮一些。上面的代码至少向你展示了你需要添加你的钩子的地方。

于 2013-06-11T11:01:53.277 回答