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