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

我想当我将鼠标悬停在pagecontrol选项卡上时显示一个提示"Hello",并且 非也。 当我将鼠标悬停在TEdit上时显示提示。

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

TEditshowhint = false, parentshowhint = false, ,而 hint 是空的。

但是,我仍然得到一个"你好"的提示whn我mouseover 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;

如果您没有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));

相反。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top