Подсказки 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
смотрите здесь:
первоначально работал над 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] мой ответ не содержит много нового, но я найти весь код и текст слишком отвлекает.