![]() |
|
|
![]()
|
|
| mr.Anderson |
|
||||||||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Вот написал класс для замены стандартного свойства Hint у компонентов Билдера. Мне не нравилось то, что нельзя увеличить задержку Hint'а, нельзя настроить его стиль. Поэтому решил написать свой класс для этих целей.
Плюсы: [+] В перспективе - настраиваемая задержка хинта. Пока она не реализована, поэтому хинт отображается бесконечно долго (пока не уберешь мышь с компонента, для которого вызывается хинт). [+] Настраиваемый стиль хинта. [+] Хинт перемещается вслед за указателем мыши. Минусы: [-] Высокая загрузка ЦП ( 40% ) при движении мышью по компоненту. [-] Насильное переопределение виртуального метода AppMsg (нужно для управления перемещением хинта за указателем). Как я понимаю, это помешает юзеру определить собственный метод в программе при использовании данного класса. Вот, собственно, код. С настройкой задержки пока напряг (все, с ней связанное, в коде пока закомментировано). В остальном все сделано и работает (проверено). Хотелось бы услышать ваши комментарии. Можно что-нить предложить, я постараюсь реализовать. Можно критиковать.
Использование класса: 1. Объявляем глобальную переменную класса:
2. Кидаем на форму панель (TPanel). Называем ее (например, PHint). 3. В OnShow формы добавляем инициализирующие операторы:
4. В свойстве OnMouseMove компонента, на котором надо вызывать хинт, пишем:
5. [ необязательно ] В свойстве OnMouseLeave этого же компонента пишем:
Это теоретически необязательно, т.к. в классе метод AppMsg сам, по идее, должен регулировать отображение хинта через анализ типа курсора мыши (но это я не проверял). Вот и все. Буду рад выслушать критику, комментарии и пожелания (только прошу не пинать слишком сильно, это всего второй более-менее объемный класс, который я написал). |
||||||||||
|
|||||||||||
| pandrew |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 27.3.2006 Репутация: 3 Всего: 3 |
А свойство TApplication::HintHidePause не помогало? Что касается стиля, есть хинт-классы сторонних производителей. Я использую TRzBalloonHints достаточно симпатичный компонент. М.б. логичней было выводить свой класс из THintWindow, подменив отрисовку, раз уж так не нравилась. Или хотя бы посмотреть его исходники. И уж точно надо было выводить свой класс хотя бы от TComponent, дабы обеспечить корректность в рамках VCL. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Тут смысл не столько в заменителе (сторонние компоненты всегда можно найти), а в том, что написано своими руками. Практика. Насчет наследования - я подумал, зачем выводить от TComponent, если все равно его свойства я не использую? Добавлено @ 16:35 Кстати, а где этот компонент TRzBalloonHints можно скачать (для билдера), не подскажете? Это сообщение отредактировал(а) mr.Anderson - 5.4.2007, 16:48 |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Так. Вот доработанная версия (огромное спасибо Ctrl_alt_del за большую помощь в доработке).
Изменения: [+] Метод AppMsg больше не используется (вместо него - хук на мышь), так что теперь можно при использовании данного класса определить собственный метод AppMsg. [+] Загрузка процессора при перемещении хинта снижена до 20% (раньше было 40%). [+] ЧАСТИЧНО работает задержка. Задержка работает именно частично. Смысл: хинт через заданное время (метод SetDelay( int ) ) пропадает. Проблема в том, что он заново не появляется, когда требуется. Почему - я до сих пор теряюсь в догадках. Прошу всех, кто сможет, помочь.
|
|||
|
||||
| pandrew |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 27.3.2006 Репутация: 3 Всего: 3 |
Это часть пакета Raize Components v 3.06. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Вопрос в том, что не используете, потому что не знаете как использовать, а не потому что нет необходимости. А тут хотя бы могли ввести проверти. Это первое. Второе. Стиль кодирования выдает сразу Вас как начинающего Четвертое. Ну и зачем Вы во всех сетах возращаете ссылку на this? Необходимости в этом абсолютно никакой. Разве что демонстраций собственных познаний. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| mr.Anderson |
|
||||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Я даже и спорить не стану.
Вот именно поэтому. Но если есть методы, чтобы этого избежать, то я могу убрать это. Хотя, определение собственных перечисляемых типов мне что-то последнее время нравится.
А как же? А если я не буду возвращать, разве можно будет каскадировать вызовы функций? Если можно, то я немедленно уберу возврат, я просто не знал, что можно и без него обойтись... |
||||||
|
|||||||
| Vyacheslav |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Ну хотя бы использование постоянное this внутри методов. Насколько я знаю, это так пишут джависты Ага. То есть Вы в принципе в отличие от остальных не допускаете метод, возвращающий void. Иначе как каскадировать? Типа этого?
Вы считаете, что это удобно и наглядно? Не говоря уже о том, что сеттер обычно возвращает void. Конечно, можно все делать не так как все. Но стоит ли? Это как придумать свой собственный язык. Говорить то на нем, конечно можно. Только с кем? -------------------- С уважением, Вячеслав Ермолаев |
||||
|
|||||
| HappyLife |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 4 Всего: 8 |
Vyacheslav, Возвращать this, очень неплохой прием для создания гусениц.... Типо таких)
|
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Vyacheslav, никогда бы не подумал, что допускать каскадирование в классе - признак дурного тона... Ну, если так, то ладно, можно и убрать. Хотя, я бы оставил. Почему? Не нравится - не пользуйтесь, а вдруг кому захочется?
Насчет this-ов повсюду - почему же это признак начинающего программиста? Я, например, считаю, что с ними просто понятней и наглядней. Понятно, что за переменную используем - класса или определенную внутри функции. Это дело привычки, имхо. И уж точно не признак того, что я "джавист" - на Java не писал никогда. |
|||
|
||||
| codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
||||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
codelord, да я не спорю.
|
|||
|
||||
| Vyacheslav |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
1.Для изменения стиля следовало просто отнаследоваться от THintWindow, тем более он для этого предназначен
Причем от Вас, как от программиста требуется всего лишь отнаследовать новый класс и его тип присвоить глобальной переменной HintWindowClass. И все.
Я Вам назвал. Просто ощущение субъективно, но для меня очевидно. Вплоть до подхода Делать фичи на всякий случай , "вдруг кому захочется" - это кстати один из таких признаков. Все очень просто: возьмите код любой из открытых библиотек. Есть такое понятие - стиль кодирование. Посмотрите, как пишут профессионалы и копируйте. Кстати виртуальный деструктор во втором варианте из той же оперы? "Вдруг кому захочется" отнаследоваться и воспользоваться принципом полиморфизма? И это с учетом того, что виртуальных функций я не вижу( может просмотрел) -------------------- С уважением, Вячеслав Ермолаев |
||||||
|
|||||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 3 Всего: 128 |
Насчет виртуальных методов - я его сделал виртуальным, т.к. раньше там был виртуальный переопределенный метод AppMsg.
Насчет возврата this-ов - их рекомендуется возвращать для реализации возможности каскадирования по учебнику Дейтелов. Я ж должен следовать какому-то пособию. Вот более новый код:
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |