TTabSheet подсказывает в Delphi - PullRequest
       17

TTabSheet подсказывает в Delphi

7 голосов
/ 11 августа 2009

Мне нужен TPageControl и некоторые TTabSheets, с подсказками для каждой вкладки, видимыми, когда я поочередно наводю курсор на каждую вкладку.

Есть ли способ получить этот эффект в Delphi 2009?

Ответы [ 5 ]

6 голосов
/ 11 августа 2009

Просто подключите событие перемещения мыши Page Control и используйте свойство TabAtPos, чтобы определить, на какой вкладке находится мышь. Затем назначьте подсказку этой вкладки свойству подсказки Page Control.

procedure TForm.PageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
var
  tabindex: integer;
begin
  tabindex := PageControl.IndexOfTabAt(X, Y);
  if (tabindex >= 0) and (PageControl.Hint <> PageControl.Pages[tabindex].Hint) then
  begin
    Application.CancelHint;
    PageControl.Hint := PageControl.Pages[tabindex].Hint;
    PageControl.ShowHint := true;
  end;
end;

CancelHint / ShowHint позаботится об обновлении окна подсказки, когда мышь перемещается непосредственно с одной вкладки на другую.

Улучшенная, но уродливая версия ниже также временно меняет значение HintPause на 0, когда мышь перемещается непосредственно от вкладки к вкладке, так что подсказка отображается немедленно («Уродливая» часть решения переходит к вызову Application.ProcessMessages, который заставляет сообщения с подсказками обрабатываться до восстановления HintPause.)

procedure TForm.PagesMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
var
  hintPause: integer;
  tabindex: integer;
begin
  tabindex := PageControl.IndexOfTabAt(X, Y);
  if (tabindex >= 0) and (PageControl.Hint <> PageControl.Pages[tabindex].Hint) then
  begin
    hintPause := Application.HintPause;
    try
      if PageControl.Hint <> '' then
        Application.HintPause := 0;
      Application.CancelHint;
      PageControl.Hint := PageControl.Pages[tabindex].Hint;
      PageControl.ShowHint := true;
      Application.ProcessMessages; // force hint to appear
    finally Application.HintPause := hintPause; end;
  end;
end;

Чтобы скрыть подсказку в теле главной страницы, назначьте следующий метод для события OnMouseLeave элемента управления страницы.

procedure TForm.PageMouseLeave(Sender: TObject);
begin
  PageControl.Hint := '';
  PageControl.ShowHint := false;
end;
5 голосов
/ 11 августа 2009

В Raize Components это можно сделать, установив для свойства trzpagecontrol.tabhints значение true. Хорошие компоненты могут сэкономить вам много времени (а значит, и денег).

(просто счастливый клиент, кстати)

1 голос
/ 27 октября 2016

В tPageControl.OnMouseMove найдите TabIndex с помощью Pgctrl.IndexOfTabAt (X, Y) и назначьте подсказку TabSheet для подсказки tPageControl

Смотрите здесь:

http://www.delphigroups.info/2/9/321680.html

1 голос
/ 11 августа 2009

1 - заполните свойство .Hint и установите для свойства .ShowHint значение True для PageControl (при условии, что для каждой вкладки ParentShowHint установлено значение true; в противном случае вам придется настраивать каждую страницу отдельно).

2 - назначить это событие обработчику события OnChange PageControl:

procedure TForm1.PageControl1Change(Sender: TObject);
begin
  PageControl1.Hint := PageControl1.ActivePage.Hint;
end;

После того, как вы это сделаете, подсказка будет такой, какая есть вкладка active . Я не уверен, как заставить его изменить подсказку в зависимости от того, где находится мышь - это интересное явление, которого я никогда раньше не замечал.

0 голосов
/ 19 апреля 2018

Первоначально работая над проектом C ++ Builder 6 (!) (Поэтому, пожалуйста, простите за любую опечатку в этом отчете), я начал с ответа Джерарда [1] и уменьшил код как можно больше. Чтобы лучше контролировать вызовы Application.CancelHint, я ввел член FLastHintTabIndex, его нужно инициализировать с -1.

procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  TabIndex: Integer;
begin
  TabIndex := PageControl1.IndexOfTabAt(X, Y);
  if FLastHintTabIndex <> TabIndex then
      Application.CancelHint;
  if TabIndex <> -1 then
      PageControl1.Hint = PageControl1.Pages[TabIndex].Hint;
  FLastHintTabIndex := TabIndex;
end;

[1] мой ответ не содержит много нового, но я нахожу весь этот код и текст слишком отвлекающим.

...