Delphi:防止TPageControl提示显示在包含的项上

Delphi:防止TPageControl提示显示在包含的项上,delphi,vcl,hints,Delphi,Vcl,Hints,我有一个包含以下组件的表单:TPageControl包含一个tAbsSheet,包含一个TEdit 我希望鼠标悬停在pagecontrol选项卡上时显示提示“Hello”,鼠标悬停在TEdit上时不显示提示 PageControl有一个hint=“Hello”,和showhint=true。这正如预期的那样有效 TEdit具有showhint=false,parentshowhint=false,并且hint为空 但是,当我把鼠标放在TEdit上时,仍然会得到一个“你好”的提示。我怎样才能阻止这

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

我希望鼠标悬停在pagecontrol选项卡上时显示提示“Hello”,鼠标悬停在TEdit上时不显示提示

PageControl
有一个
hint=“Hello”
,和
showhint=true
。这正如预期的那样有效

TEdit
具有
showhint=false
parentshowhint=false
,并且
hint
为空

但是,当我把鼠标放在TEdit上时,仍然会得到一个“你好”的提示。我怎样才能阻止这一切

这是.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

将TApplicationEvents控件添加到表单中,并使用OnShowHint事件:

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string;
  var CanShow: Boolean; var HintInfo: THintInfo);
begin
  CanShow := HintInfo.HintControl <> Edit1;
end;
手动设置事件处理程序

使现代化 如果在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中有多个TTabsheet,并且希望所有工作表都显示提示,但不显示子控件的提示,则可以这样做

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

相反。

将TApplicationEvents控件添加到表单中,并使用OnShowHint事件:

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string;
  var CanShow: Boolean; var HintInfo: THintInfo);
begin
  CanShow := HintInfo.HintControl <> Edit1;
end;
手动设置事件处理程序

使现代化 如果在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中有多个TTabsheet,并且希望所有工作表都显示提示,但不显示子控件的提示,则可以这样做

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

相反。

谢谢。我希望有一个“just set property X=false”的解决方案,但这很好!也许这样行吗?:
CanShow:=HintInfo.HintControl.ShowHint
@mjustin:不,这样不行。(您自己试试!)如果
ShowHint=false
,则该过程永远不会使用此控件作为
HintControl
调用。好的,也许这样:
可以显示:=HintInfo.HintControl.Tag=MY_MAGIC\u ShowHint\u值
@mjustin:当然,如果所有控件都有
ShowHint=true
,并且所有要显示提示的控件都有此标记。谢谢。我希望有一个“just set property X=false”的解决方案,但这很好!也许这样行吗?:
CanShow:=HintInfo.HintControl.ShowHint
@mjustin:不,这样不行。(你自己试试!)如果
ShowHint=false
,那么这个过程永远不会用这个控件调用为
HintControl
。好吧,也许这个:
CanShow:=HintInfo.HintControl.Tag=MY_MAGIC\u ShowHint\u VALUE
@mjustin:当然,如果所有控件都有
ShowHint=true
,并且所有显示提示的控件都有这个标记。