Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
19-02-2007 16:03 | Комментарий к предыдущим ответам
>>> Кстати, прием с подменой TPanel, описанный в »вопрос КС №35814« скорее
>>> можно назвать шаманским, т.к. он имеет в качестве побочного эффекта изменение
>>> поведения всех панелей на форме.
Так это иногда даже хорошо.
А если в форме наряду с модифицированной панелью нужна пара обычных панелей? Вводить свойство ThisIsUsualDelphiPanel? (я специально написал подлиннее). Чем плох вариант использования двух обработчиков по одной строке вместо отдельного класса на один единственный случай во всем проекте?
А если таких CheckBox-ов на форме десяток - ко всем применять "ювелирную работу"?! Зачем? Двумя строчками кода можно добавить в компонент полезную, но неучтенную возможность!
А если такой чекбокс нужен один на весь проект?
P.S. Поскольку дискуссия достаточно далеко отклонилась от обсуждения первоначального вопроса, вношу предложение перебраться в ветку об оптимизации кода: »сообщение 391 в теме №356 на БП«
19-02-2007 08:48 | Комментарий к предыдущим ответам
Третий понятие "шаманский способ" считает общепризнанным.
Скорее всего смысл слова "шаманский" в моем понимании и в данном случае несколько отличается от аналогичного в понимании Антона Григорьева. Он у меня не вызывает никакого отторжения, скорее даже наоборот - интересный безопасный способ, а слово "шаманский" подразумевает нестандартный, как бы магический. Обман среды как никак! Надеюсь, на такое определение с моей стороны никто не обиделся. Я и сам люблю такие шаманизмы, можно даже сказать, коллекционирую! :)
Млин, который раз уже это обсуждается на КС! Скоро можно будет не то что статью, книгу писать ;)
PS: А вот еще одна причина, по которой я назвал его "шаманским". Я именно по этому слову и ищу этот вопрос в поиске по КС ;-) Вот и прицепилось...
Кстати, прием с подменой TPanel, описанный в »вопрос КС №35814« скорее можно назвать шаманским, т.к. он имеет в качестве побочного эффекта изменение поведения всех панелей на форме.
Так это иногда даже хорошо. А если таких CheckBox-ов на форме десяток - ко всем применять "ювелирную работу"?! Зачем? Двумя строчками кода можно добавить в компонент полезную, но неучтенную возможность!
Нет, ребята. Лучше не мухлевать, пытаясь изобразить CheckBox комбинацией других компонент. Способ вредный (требует непродуктивных затрат времени) и косячный (на своем компе работает почти как надо, а на другом -- косяки лезут).
Приведенный мной способ может быть удачным или неудачным. Но он не шаманский. Это обычное взаимодействие компонентов. Единстенное отличие состоит в том, что эти компоненты сгруппированы территориально. Я специально сделал оговорку, что этот способ имеет смысл применять, если это одноразовая потребность. Кстати, прием с подменой TPanel, описанный в »вопрос КС №35814« скорее можно назвать шаманским, т.к. он имеет в качестве побочного эффекта изменение поведения всех панелей на форме. А у меня - ювелирная работа "по месту" (тут должно быть смайло).
>>>А вопрос 35814 давно затерялся среди других и его уже вряд ли кто-то найдет...
Ну почему-же? Его здесь уже третий раз упомянают, только ленивый его еще не посмотрел...
19-02-2007 07:53 | Комментарий к предыдущим ответам
>>> Да напишите Вы статью по этой теме уже!!!
Мне просто было неитересно писать статью по вопросу, который уже "облизан" со всех сторон. Но, видимо, придется. Если "редколегия" пропустит ;-0
to Андрей Токинов:
"Там за маской зверя скрывается человек. Здесь за маской человека скрывается зверь" (Стивен Кинг "Вести из мертвой зоны")
Просто это тот случай, когда метод, шаманский по форме, является абсолютно надежным и корректным. Однако оставляет у людей чувство "легкой неправильности" из-за этой своей похожести на шаманизм.
19-02-2007 07:27 | Комментарий к предыдущим ответам
воспользуйтесь шаманским способом от Geo
Один продемонстрировал способ.
Второй бездоказательно назвал его шаманским.
Третий понятие "шаманский способ" считает общепризнанным.
19-02-2007 07:09 | Комментарий к предыдущим ответам
Geo
Да напишите Вы статью по этой теме уже!!! Проблема, как видите актуальна, а решение - оригинально. Многим было бы интересно узнать об этом. А вопрос 35814 давно затерялся среди других и его уже вряд ли кто-то найдет...
Нет, ребята. Лучше не мухлевать, пытаясь изобразить CheckBox комбинацией других компонент. Способ вредный (требует непродуктивных затрат времени) и косячный (на своем компе работает почти как надо, а на другом -- косяки лезут).
Если нужно какое-то свойство, которого нет в стандартном компоненте, то надо этот стандартный компонент переписать под собственные нужды. Нет в этом ничего хитрого, для этого ООП и предназначено. Затраты времени, конечно, тоже есть, но это продуктивные затраты.
Да, вдогонку Ins'у... Разработка нового класса вовсе не требует регистрации его в библиотеке VCL. Особенно, если это небольшое изменение, которое требуется для данной конкретной задачи и только для нее. Builder и VCL -- это инструмент разработки, но они не заменяют собой все программирование.
Если это одноразовая потребность, то можно не плодить наследников, а сделать примерно так:
Помещаем на форму CheckBox, StaticText и Shape.
В инспекторе объектов делаем назначения, аналогичные коду:
19-02-2007 05:22 | Комментарий к предыдущим ответам
>>>Млин, нету его в Д5 =( Только для CustomLabel. Что делать-то? Или я опять торможу?
Нее не тормозишь, просто про версию Delphi я както не подумал у меня D2006.
Обрабатывать OnMeasureItem и OnDrawItem и самому отрисовывать текст. Для вывода текста в несколько строк удобно использовать функцию DrawText и ее же для измерения высоты многострочного текста. Ознакомьтесь с ней сами в SDK. Только учтите, что высота элемента списка не может быть больше 256 пикселей
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.