Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    Идите и учите мат часть тогда....
    Protected методы созданы не для того, чтобы вешать на них "предохранители".
    Сделаны они как раз для того, чтобы ТОЛЬКО НАСЛЕДНИКИ могли их переопределять.
    А если уж и делать "предохранитель", то нужно делать их private...
     
    В общем - в школу Вам и не путайте других

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 17:31 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1
    Смысл создания наследника?

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 17:33 06-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    Изменить\добавить поведение "папочки"...
     

    Цитата:
    Я тут не подвизался вас учить. Учеба денег стоит.

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 17:35 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Согласен.
    Для решения данной задачи нужно, чтобы контрол умел себя отрисовывать разными цветами.
    Он это умеет. Значит, его поведение менять не нужно. Нужно научиться им пользоваться в нужное время в нужном месте.
    Создание наследника тут никаким боком.

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 17:38 06-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
     
    После таких вот "советчиков" и говорят потом, что Дельфи для детей и нормальные проги писать нельзя на них...
     
    Бегать по всем контролам и решать, как каждому контролу отрисовываться(Ваше предложение было) - это просто АХТУНГ!!! .
     
    Потом это все разростается в нечитаемый и неподъемный код с кучей if - else. А если нужно на разных формах такое поведение - то вуаля - волшебный копи-паст спасает нас...

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 17:44 06-11-2012 | Исправлено: salexn1, 17:44 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1
    Кажется, понял вашу идею.
    На форме (или что еще хуже - на разных формах) лежат контролы разного типа - для ввода чисел, валюты, календарики и прочее. Для каждого из них переопределяем потомка, в котором прописываем одно и то же. При чем не факт, что переопределяемый метод есть у каждого типа контролов и называется при этом одинаково.
    Видимо, это не подпадает под определение " нечитаемый и неподъемный код" с вашей точки зрения?
    У меня по крайней мере все собрано в одной точке.

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 18:51 06-11-2012
    SevereK20

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    У меня по крайней мере все собрано в одной точке.  

    дык Вы ж сами сказали что в каждом контроле отрисовывать... какая же это одна точка?.

    Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 18:55 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    в процедуре OnTimer цикл пробегает по контролам, в котором case по типам и далее по обстоятельствам
    Причем эту процедуру можно вынести в отдельный юнит и вызывать из разных форм
    Универсальная штука получается
    И если завтра надо будет по одному условию цвет менять, а по другому - мигать, а по третьему - бибикать, у меня есть одно место, где это дописать нужно будет

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 19:04 06-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    А если на одной форме, контролу нужно быть красным при <0, а на другой - синей - у вас это тоже будет предусмотрено...
    if (FormName = 'Krasnaya') then ....
     
    case по типам - это вааще ПЯТЬ балов!!!
     
    В общем, Ваша "архитектура" никуда не годится, так, поделка для первоклассника.
     
    Достаточно сделать контрол TColoredEdit, у которого бы было свойство, как раскрашивать в зависимости от значения и это все было спрятано и на форме лишнего кода не было бы...
     
    ну а вообще, все началось с protected метода и Вы еще раз доказали, что вам пока
    "УЧИТЬ МАТЧАСТЬ"

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 19:27 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1
    Кто предок TColoredEdit?

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 19:28 06-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    В такой реализации не важно: сегодня один предок, завтра при необходимости можно заменить на другой. Правится в одном месте и больше нигде менять не нужно  

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 20:57 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1
    Тупо ходим по кругу - говорю же - у меня на форме УЖЕ есть несколько контролов разных типов - для ввода целых чисел, для ввода дробных чисел с копейками

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 21:08 06-11-2012
    A_V

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    минусы привязки на событиях есть такие - допустим вам надо поставить свой OnChange. Если вы его ставите в дизайнере, еще туда-сюда,  можно запоминать перед присвоением общей процедуры старые обработчики и потом дергать их. Хуже, когда обработчик присваивается в рантайме, особенно если это делает другой программист, к-й не в курсе про автоприсваиваемые обработчики..  
     
    Ну и, как уже писал salexn1, архитектурно подход 'смешать все в кучу' плохой, в случае серьезных изменений начинается совершенно дикий case. Получается не 'универсальная штука', а полное барахло типа кейсов по формам (сиречь сильная связанность), где меняя одно условие, можно легко сломать другое.
     
    Если просто не хочется городить одинаковые проверки для разных контролов - их всего-то нужно вынести в общую ф-ию (класс), и дергать ее из самих контролов. Если контролы в разных формах - зарегать их в дизайнере.
     
    Короче, во варианте с наследником меньше проблем в сопровождении.
     
    зы:ну и насчет protected - не позорьтесь

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 22:21 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    A_V
    Я не против наследников как таковых, вы не дослушали.
    В делфи нет множественного наследования, это значит, следующего хода не будет. У контрола один наследник. Точка. Нужно объединить функциональность двух наследников с добавлением новой - тупик. Ваш подход тупо не рабочий, какая разница, насколько он эстетичен, соответствует вашим представлениям о правильности и т.п.

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 22:27 06-11-2012 | Исправлено: XPerformer, 22:28 06-11-2012
    A_V

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    Нет никаких проблем, вы просто не умеете их готовить
    Несколько разных вариантов поведения - не проблема - контрол перекрывает методы предкп, и дергает, в зависимости от надобности нужные методы внутренних классов.  
    Привидите конкретный пример, который не укладывается в этот подход

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 22:47 06-11-2012 | Исправлено: A_V, 22:47 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я уже приводил.

    Цитата:
     
    у меня на форме УЖЕ есть несколько контролов разных типов - для ввода целых чисел, для ввода дробных чисел с копейками

    Вы порождаете 2 потомка, которые умеют менять цвет по условию. Причем идет пресловутое дублирование кода но это мелочи, я не об этом
    Приходит заказчик и говорит, мне надо чтобы бибикало по другому условию. Ваши действия? Сводный потомок от ваших двух подошел бы, но не в делфи

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 22:56 06-11-2012
    A_V

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    зачем 2 потомка - то? или речь о разных контролах?
    для одного контрола одного потомка достаточно.. со свойством -- как именно менять цвет. у у него может быть даже _отдельное_ событие (но не общее, как на OnChange), если хитро менять цвет нужно по разному у малого кол-ва контролов.
    если бибикать будет хитро - тоже можно отдельно св-во..
    короче, пусть контрол поддерживет все, что к нему конкретно относится, он может например реализовывать разные интерфейсы, и тогда по каждому контролу можно пройтись - и спросить - supports(IBeepable)? - тогда гуди.
    где проблемы-то?

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 23:08 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    я понял - ключевое слово - интерфейсы. То есть будем решать проблемы по мере поступления. Нормально, правда, каша-малаша, отсутствие единой концепции как масштабировать продукт. В принципе, сойдет

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 23:10 06-11-2012
    A_V

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XPerformer
    нифига ты не понял ) пардон за резкий переход ) интерфейсы - это лишний плюс, не более. в данном примере они вообще не нужны. и никакой каши-малаши. проблемы по мере поступления, это да, это нормально, заранее все не предусмотришь. если для многих контролов в проекте вдруг понадобилось бибикать по дабл-клику, появляется новое св-во и все (может быть по дефолту true). тут как-раз масштабируемость и есть. и для крупных проектов обычно и пишутся свои контролы, у которых при необходимости меняется поведение (свои события как пример). а нацепить на каждый кучу своих мега-универсальных обработчиков, к-е потом запаришься менять - вот это как раз то, о чем ты говоришь - каша-мала и немасштабируемость.

    Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 23:25 06-11-2012
    XPerformer



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Исходная задача - есть условие (программист читает - сегодня одно, завтра больше), которое может срабатывать извне. Надо раскрашивать контролы в два цвета (программист читает - реагировать = менять поведение, в том числе визуально перерисовывать контролы). Что тут такого что надо прямо заранее предусмотреть на все случаи жизни? Ну да, правильнее всего через интерфейсы или через сервисы, для тех кто знает с#. Но тот кто знает, тот тут такого уровня вопросы не задает. Мой ответ 1) расчитан на новичка, б) решает задачу, в) решает ее с некоторым запасом, на вырост. Поэтому в данных условиях мой ответ оптимален

    Всего записей: 2536 | Зарегистр. 20-06-2011 | Отправлено: 23:30 06-11-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru