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

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

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

5 ответов

Решение

Просто подключите событие перемещения мыши 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;

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

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

1 - заполните свойство.Hint и установите для свойства.ShowHint значение True для PageControl (при условии, что для каждой вкладки 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Я представил члена 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] мой ответ не содержит много нового, но я считаю, что весь этот код и текст слишком отвлекают.

Другие вопросы по тегам