Delphi: предотвратить подсказку TPageControl от отображения на содержащихся элементах
Вопрос
У меня есть форма со следующими компонентами: генеракодицетагкод, содержащий один генеракодицетагкод, содержащий генеракодицетагкод.
Я хочу подсказку «Hello», отображаемый, когда я мышь на вкладке PageControl, и NO подсказка, отображаемая, когда я наведите курс на TEDIT.
Генеракодицетагкод имеет генеракодицетагкод и генеракодицетагкод.Это работает как ожидалось.
Генеракодицетагкод имеет генеракодицетагкод, генеракодицетагкод и генеракодицетагкод пуст.
Но я все еще получаю «Привет», подсказку, в котором я не мыши 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
. Решение
Добавить Tapplication Events Control в форму, и используйте событие Onshowhint:
procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string;
var CanShow: Boolean; var HintInfo: THintInfo);
begin
CanShow := HintInfo.HintControl <> Edit1;
end;
.
Если у вас нет объекта TapplicationEvents In (например, если вы используете очень старую версию 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
Если у вас есть несколько TTabsheets в TPageControl, и хотите, чтобы все листы отображали подсказку, но не детские элементы управления, то вы можете сделать
CanShow := not SameStr(HintStr, PageControl1.Hint) or
((HintInfo.HintControl is TTabSheet) and
(TTabSheet(HintInfo.HintControl).PageControl = PageControl1));
.
вместо этого.