Подсказки TTabSheet в Delphi

Я хочу TPageControl и некоторые TTabSheets, с подсказками подсказки "на tabsheet", видимыми при наведении курсора на каждую вкладку по очереди.

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

5 ответов


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

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, когда мышь перемещается непосредственно с вкладки на вкладку, так что подсказка немедленно переиграли. ("Уродливая" часть решения переходит к приложению.Вызов 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;

на Компоненты Raize, это может быть достигнуто путем установки trzpagecontrol.tabhints свойство true. Хорошие компоненты могут сэкономить вам много времени (поэтому деньги).

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


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

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

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

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


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

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

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


первоначально работал над C++ Builder 6 (!) проект (поэтому, пожалуйста, простите любую опечатку в этой стенограмме), я начал с ответ Жерара[1] и уменьшил код как можно больше. Чтобы лучше контролировать вызовы Application.CancelHint, Я представил , он должен быть инициализирован с -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] мой ответ не содержит много нового, но я найти весь код и текст слишком отвлекает.