德尔菲 :防止TPageControl提示显示在包含的项目上
题
我有一个包含以下组件的表单:A TPageControl
包含单个 TTabSheet
, ,包含一个 TEdit
.
我想当我将鼠标悬停在pagecontrol选项卡上时显示一个提示"Hello",并且 非也。 当我将鼠标悬停在TEdit上时显示提示。
该 PageControl
有一个 hint= "Hello"
, ,而 showhint = true
.这按预期工作。
该 TEdit
有 showhint = 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));
相反。
不隶属于 StackOverflow