2009-08-10 5 views
6

Я хочу, чтобы TPageControl и некоторые TTabSheets, с подсказками подсказок подсказок «за вкладку», когда я наводил курсор на каждую вкладку по очереди.TTabSheet подсказки в Delphi

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

+2

Firefox также делает это –

ответ

6

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

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, когда мышь перемещается непосредственно из вкладки на вкладку, чтобы подсказка была перерисована немедленно. (The «уродливая» часть решения переходит к 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; 
+0

TabAtPos не существует, вы имели в виду IndexOfTabAt (x, Y). Это * так * почти работает правильно. За исключением того, что при переходе с одной вкладки на другую подсказка не обновляется и не отображается повторно. – Roddy

+0

Извинения; Я использовал TRzTabSheet (Raize Components), который обладает свойством TabAtPos и ​​работает хорошо. Вы можете просто программно показать подсказку об изменении tabindex, используя класс THintWindow. Задайте свойство Show Hint для параметра «Контроль страницы» равным false и создайте свой собственный. – Gerard

1

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

2 - Присвоить это событие обработчик события OnChange в PageControl в:

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

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

+0

Я думаю, что вопрос состоял в том, чтобы показывать подсказки для страниц без изменения активной страницы. – Wolf

5

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

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

+2

+1 - Вложение в компоненты Raize стоит того. Поддержка - это класс мирового уровня, и параметры визуального стиля могут действительно отличать ваше приложение от других с помощью стандартных элементов управления. – skamradt

+0

Согласовано. Мы используем Raize почти исключительно для всех дизайнерских работ в пользовательском интерфейсе.Отличные компоненты и хорошая поддержка. – Gerard