Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 135

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Что-то не уцямлю, как сделать всплывающую подсказку, вроде все вкладки пересмотрел, но... И связанный с этим вопрос: как сделать кнопку ( чекбокс ) невидимыми, но при наведении на них курсора они становятся видимыми, следовательно, доступными. Понимаю, что нужно отслеживать координаты мыши, но события onMouseИзменила_положение вроде нет. По таймеру ? Как-то неэлегантно.

Яуген Таляныч Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Яуген Таляныч (статус: Посетитель)
Вопрос отправлен: 29 августа 2009, 12:21
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

onMouseИзменила_положение - это TControl.OnMouseMove. Обработчик надо писать для Parent'a невидимого контрола и отслеживать попадание курсора в BoundsRect контрола, который надо сделать видимым.

Occurs when the user moves the mouse pointer while the mouse pointer is over a control.

Delphi syntax:

type TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState; X, Y: Integer) of object;
property OnMouseMove: TMouseMoveEvent;

Description

Use the OnMouseMove event handler to respond when the mouse pointer moves after the control has captured the mouse.

Use the Shift parameter of the OnMouseDown event handler, to determine to the state of the shift keys and mouse buttons. Shift keys are the Shift, Ctrl, and Alt keys or shift key-mouse button combinations. X and Y are pixel coordinates of the new location of the mouse pointer in the client area of the Sender.

Очень интересно, а зачем делать контролы видимыми только при наведении на них курсора?

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 29 августа 2009, 12:34
Оценка за ответ: 5

Комментарий к оценке: Thanks. C моим слабым английским невдомек было, что Hint - это то самое. Prompt - знаю. Хорошо, попробую.
Со скрытым чекбоксом додумался сам.
Правда, удалось поместить его только в левый верхний угол, потому что Form1.Top+Form1.Height - это не правый нижний угол, а координата, в которую курсором не добраться добраться ( по X аналогично ). Я так понимаю : hight,top,left и width относятся ко всей форме, а координаты отсчитываются от ее рабочего поля, исключая бордюр. Но ладно, вопрос снят.
  To Егор : это мне понадобилось, чтобы не смущать потребителя ненужными и непонятными ему деталями. А так пролетел над чеккбоксом, включил отладочную выдаче в Memo, а не над - отключил.
Спасибо всем. Проект движется.

Ответ #2. Отвечает эксперт: Егор

Здравствуйте, Гена Гутницкий!

Насчёт Hint'ов:
- у видимых элементов есть свойство Hint - туда и прописываем текст подсказки
- свойство ShowHint устанавливаем в true (показывать подсказку)

По видимости/невидимости - если компонент невидим, то и передвижение курсора мыши над ним не отслеживается. Поэтому нужно либо сделать сам компонент такого же цвета, что и родитель (форма), чтобы он сливался по цвету, либо отслеживать передвижение мыши над РОДИТЕЛЬСКИМ объектом (например, формой). Если мышь находится над невидимым контролом, делать последний видимым.

И вопрос - зачем делать контролы видимыми только при прохождении над ними мышью? Опишите проблему - наверняка есть намного более правильный вариант, чем играть с видимостью.
Если это делается для того, чтобы было "модно" - кнопка не видна (но текст её есть), а при наведении на текст кнопка проявляется (становится объёмной)? Если так, то лучше использовать компонент SpeedButton (вкладка Additional) - и установить свойство Flat в true.

Ниже привожу код, делающий кнопку Button1 видимой при наведении на неё курсора мыши.

Приложение:
  1. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  2. Y: Integer);
  3. begin
  4. if (X>=Button1.Left) and (X<=(Button1.Left+Button1.Width)) and
  5. (Y>=Button1.Top) and (Y<=(Button1.Top+Button1.Height))
  6. then
  7. Button1.Show
  8. else
  9. Button1.Hide;
  10. end;


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 29 августа 2009, 13:38
Оценка за ответ: 4


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:20
Выполнено за 0.02 сек.