【问题标题】:Delphi : Prevent TPageControl Hint from showing on contained itemsDelphi:防止 TPageControl 提示显示在包含的项目上
【发布时间】:2010-07-09 15:56:44
【问题描述】:

我有一个包含以下组件的表单:一个 TPageControl 包含一个 TTabSheet,包含一个 TEdit

我希望当我将鼠标悬停在 pagecontrol 选项卡上时显示“Hello”提示,而当我将鼠标悬停在 TEdit 上时显示 no 提示。

PageControl 有一个hint= "Hello"showhint = true。这按预期工作。

TEditshowhint = falseparentshowhint = false,而hint 为空。

但是,当我将鼠标悬停在 TEdit 上时,我仍然会收到“Hello”提示。我怎样才能阻止这种情况?

这是 .dfm,如果您有兴趣。

object Form65: TForm65
  Left = 0
  Top = 0
  Caption = 'Form65'
  ClientHeight = 258
  ClientWidth = 290
  OldCreateOrder = False
  ShowHint = True
  TextHeight = 13
  object PageControl1: TPageControl
    Left = 0
    Top = 0
    Width = 290
    Height = 258
    Hint = 'Bar'
    ActivePage = TabSheet1
    Align = alClient
    TabOrder = 0
    object TabSheet1: TTabSheet
      Caption = 'TabSheet1'
      object Edit3: TEdit
        Left = 72
        Top = 67
        Width = 121
        Height = 21
        ParentShowHint = False
        ShowHint = False
        TabOrder = 0
        Text = 'tab1'
      end
    end
  end
end

【问题讨论】:

    标签: delphi vcl hints


    【解决方案1】:

    在表单中添加一个 TApplicationEvents 控件,并使用 OnShowHint 事件:

    procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string;
      var CanShow: Boolean; var HintInfo: THintInfo);
    begin
      CanShow := HintInfo.HintControl <> Edit1;
    end;
    

    如果您没有 TApplicationEvents 对象(例如,如果您使用的是非常旧的 Delphi 版本),那么您可以使用(例如在 FormCreate 中)

    Application.OnShowHint := ApplicationEvents1ShowHint
    

    手动设置事件处理程序。

    更新

    如果您在 TTabSheet 中有多个控件,那么您可能对它们都有相同的问题。那么你可能会感兴趣

    procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string;
      var CanShow: Boolean; var HintInfo: THintInfo);
    begin
      CanShow := not SameStr(HintStr, PageControl1.Hint) or (HintInfo.HintControl = TabSheet1);
    end;
    

    更新 2

    如果您在 TPageControl 中有多个 TTabSheets,并且希望所有工作表都显示提示,但不显示子控件,那么您可以这样做

      CanShow := not SameStr(HintStr, PageControl1.Hint) or
        ((HintInfo.HintControl is TTabSheet) and
          (TTabSheet(HintInfo.HintControl).PageControl = PageControl1));
    

    改为。

    【讨论】:

    • 谢谢。我希望有一个“刚刚设置属性 X=false”的解决方案,但这会很好!
    • 也许这行得通?:CanShow := HintInfo.HintControl.ShowHint
    • @mjustin:不,这不起作用。 (你自己试试吧!)如果ShowHint = false,那么这个过程永远不会用这个控件作为HintControl调用。
    • 好的,也许是这个:CanShow := HintInfo.HintControl.Tag = MY_MAGIC_SHOWHINT_VALUE
    • @mjustin:当然,如果所有控件都有ShowHint = true,并且所有要显示提示的控件都有这个标签。
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多