Delphi: предотвратить подсказку TPageControl от отображения на содержащихся элементах

StackOverflow https://stackoverflow.com/questions/3214359

  •  13-09-2020
  •  | 
  •  

Вопрос

У меня есть форма со следующими компонентами: генеракодицетагкод, содержащий один генеракодицетагкод, содержащий генеракодицетагкод.

Я хочу подсказку «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));
.

вместо этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top