Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > PageControl и hint закладки


Автор: zhefran 29.12.2009, 19:32
У меня проблемы с отображением всплывающих подсказок для конкретной вкладки при наведении на ее имя.
Программа типа браузера с закладками.
Для отображения подсказок использовал такое:
1. Код предложенный ama kid:
Код

procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
 i:integer;
 CurPage:integer;
 pt:TPoint;
begin
 // Проверяем, что у всех табов выставлен ShowHint=true и Hint'ы - присвоены...
 CurPage:=-1;
 for i:=0 to PageControl1.PageCount-1 do
  if PtInRect(PageControl1.TabRect(i),Point(X,Y)) then
   begin
    CurPage := i;
    break;
   end;
 PageControl1.Hint:=PageControl1.Pages[CurPage].Hint;
 pt:=PageControl1.ClientToScreen(Point(X,Y));
 Application.ActivateHint(pt);
end;
 
2. Нашел в интернете:
Код

procedure TForm.PageControlMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  tabindex: Integer;
begin
  tabindex := PageControl.IndexOfTabAt( X, Y );
  if tabindex >= 0 then
     PageControl.Hint:=PageControl.Pages[tabindex].hint;
end;


В первом случае при переходе с вкладки на вкладку затирается область EmbeddedWB1 и не отображается текст подсказки, а область под нее выделяется. Отображается только  тогда, когда мышка находиться ниже закладки.
Во втором случае - подсказка не отображается при прямом переходе с tabsheet на tabsheet.

Автор: artsb 29.12.2009, 20:20
Код

  if (tabindex >= 0) begin
     PageControl.Hint=PageControl.Pages[tabindex].Hint;
     Application.ActivateHint(Point(X,Y));
  end;


Добавлено @ 20:21
Работает на BCB 6.

Добавлено @ 20:25
Можно сделать так, чтобы хинт обновлялся только при наведении на другую вкладку:
Код

  if (tabindex >= 0 && tabindex <> PageControl.Tag) begin
     PageControl.Tag := tabindex; 
     PageControl.Hint=PageControl.Pages[tabindex].Hint;
     Application.ActivateHint(Point(X,Y));
  end;


Не забудьте изначально поставить Tag = -1.

Автор: zhefran 30.12.2009, 13:21
artsb, спасибо за ответ, но при передвижении мышки на прямую с вкладки на вкладку хинт отображаться не хочет.

В первом варианте с 1 поста все работает идеально пока в Webbrowser не подгружена страничка!  

Автор: volvo877 30.12.2009, 14:07
Цитата(zhefran @  30.12.2009,  12:21 Найти цитируемый пост)
при передвижении мышки на прямую с вкладки на вкладку хинт отображаться не хочет.
Вот это как себя ведет:
Код
procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  tabindex: Integer;
  PC: TPageControl;
begin
  PC := Sender as TPageControl;
  tabindex := PC.IndexOfTabAt(X, Y);
  if ((tabindex >= 0) and (tabindex <> PC.Tag)) then
  begin
    PC.Tag := tabindex;
    Application.HideHint; // <--- Добавь эту строку
    PC.Hint := PC.Pages[tabindex].Hint;
    Application.ActivateHint(Point(X,Y));
  end;
end;
?

Причин не работать не вижу...

Автор: zhefran 30.12.2009, 14:50
Цитата(volvo877 @ 30.12.2009,  14:07)
Цитата(zhefran @  30.12.2009,  12:21 Найти цитируемый пост)
при передвижении мышки на прямую с вкладки на вкладку хинт отображаться не хочет.
Вот это как себя ведет:
Код

    Application.HideHint; // <--- Добавь эту строку
?

Причин не работать не вижу...

Вместо HideHint написал CancelHint и все прекрасно заработало! Огромное спасибо!
Вот код с правкой:
Код

procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  tabindex: Integer;
  PC: TPageControl;
begin
  PC := Sender as TPageControl;
  tabindex := PC.IndexOfTabAt(X, Y);
  if ((tabindex >= 0) and (tabindex <> PC.Tag)) then
  begin
    PC.Tag := tabindex;
//    Application.HideHint; // <--- Добавь эту строку
    Application.CancelHint //<--- Вот так работает!
    PC.Hint := PC.Pages[tabindex].Hint;
    Application.ActivateHint(Point(X,Y));
  end;
end;


Автор: artsb 30.12.2009, 17:53
Цитата(zhefran @  30.12.2009,  13:21 Найти цитируемый пост)
спасибо за ответ, но при передвижении мышки на прямую с вкладки на вкладку хинт отображаться не хочет.

как не работает? Сейчас проверил на Delphi 2010. Всё работает:
Код

procedure TForm1.PageControlMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  tabindex: Integer;
begin
  tabindex := PageControl.IndexOfTabAt( X, Y );
  if ((tabindex >= 0) and (tabindex <> PageControl.Tag)) then
  begin
     PageControl.Tag := tabindex;
     PageControl.Hint := PageControl.Pages[tabindex].Hint;
     Application.ActivateHint(Point(X,Y));
  end;
end;


Добавлено через 2 минуты и 42 секунды
Я просто малость с синтаксисом ошибся smile

Автор: zhefran 30.12.2009, 18:00
Цитата(artsb @  30.12.2009,  17:53 Найти цитируемый пост)
Я просто малость с синтаксисом ошибся smile 

Синтаксис я исправил сам! У меня Делфи 7 - не захотело! Позже перепроверю! Но мне кажется, что и с вашим кодом будет работать ели добавить:
Код

Application.CancelHint //<--- Вот так работает!


Автор: artsb 30.12.2009, 18:11
Цитата(zhefran @  30.12.2009,  18:00 Найти цитируемый пост)
У меня Делфи 7

Я проверил на BCB 6 и Delphi 2010. Всё отлично работает и без "Application.CancelHint". ;)

Автор: zhefran 30.12.2009, 18:29
Цитата(artsb @  30.12.2009,  18:11 Найти цитируемый пост)
Я проверил на BCB 6 и Delphi 2010. Всё отлично работает и без "Application.CancelHint". ;) 

А у меня не работает! И с HideHint тоже! Работает только когда добавляю  "Application.CancelHint"!

Автор: artsb 30.12.2009, 21:29
Странно...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)