|
|
|
Supreme Being
      
модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833,
Visits: 16 863
|
|
Приветствую. Хотел бы обменяться опытом. Так вот. Представьте себе стандартную форму с большим количеством полей и тулбаром. Понятно, что некоторые кнопки доступны (Enabled) только в определенных условиях (т.е., скажем, выделен какой-то айтем, стоит флажок и т.д.). Так вот, вопрос в том, каким образом вы регулируете enabled элементов? Я знаю три вида: 1) Самый простой, но неудобный. Проверять по какому-либо действию. Т.е., к примеру, после удаления какого-то айтема, я проверяю, доступна ли будет эта кнопка или нет. Он неудобен тем, что проверки надо делать во многих местах для одного и того же айтема (т.е. кнопка может быть доступна когда есть айтем, когда включен флажок и когда в текстбокс введено определенное число). Получается, что в каждом из этих случаев надо делать ссылку на процедуру проверки. 2) Таймер. Значительно удобнее, но минусы: а) срабатывание с небольшой задержкой (скажем, 100мс, что почти не заметно); б) дополнительная постоянная нагрузка (пусть и почти незаметная, но все-таки есть); в) все в одном месте (конечно, можно разнести по разным процедурам, но это опять же не очень удобно). Нет необходимости после каждого действия ставить вызов процедуры проверки. Все удобно и просто. 3) Action в Delphi. Это, на мой взгляд, самый удобный способ. Узнал о нем, когда работал в Delphi. Action - невизуальный объект, привязывается к другим элементам (к примеру, к кнопкам). Притом у него есть свойство Enabled, от которого зависит также родительский объект (т.е. если у Action Enabled=False, то и у кнопки, к которой он привязан, Enabled=False). На один Action моно вешать несколько ЭУ. У каждого Action есть событие Update. Оно срабатывает при каких-либо изменениях на форме. Т.е. не по таймеру, а именно в зависимости от других событий. Так вот, в этом событии Update помещается код на проверку свойства Enabled текущего Action. Этот подход хорош по следующим причинам а) нет лишней нагрузки б) нет никакой путаницы - для каждого элемента условие в своем месте Так вот собственно и вопрос - как делаете вы?
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 13.12.2007 18:51
Сообщ.: 3 047,
Visits: 33 391
|
|
| Я предпочитаю способ №1, поскольку по ряду соображений не могу использовать ничего, что навешивается на форму в design mode. Если точнее, то я использую MVC Pattern (классический), и всё, что требуется от формы, - это реализовать заданный интерфейс. В итоге, напрямую с контролами формы никакой работы не предполагается: всё делается в коде (в коде контроллера) и на уровне членов интерфейса. Способ №2 - suxx, как и всё, что связано с таймерами :) и вообще - первый раз слышу о таком подходе... Т.к. речь идёт о дотнете, тебе ничего не стоит реализовать способ №3 своими силами: - Лёгкий путь (но с зашивкой на типы контролов): на старте формы подписаться на события контролов (перебирая эти контролы). Т.е. для текстбокса - на Change, для чекбокса - на CheckedChange, etc. Ну и реагируешь на эти события - в едином обработчике и единым образом. - Более правильный (но и более сложный) путь: написать property extender или как оно там называется. Видел, наверное, как MS ToolTip Component сделан: бросаешь его на форму - и у всех контролов появляется дополнительная пропертя. Но это лишь идея...
While (!Life.EOF) { You.Money ++; You.Girls.Add(new Girl(90,60,90)); BeHappy(); }
|
|
|
|
|
Supreme Being
      
непров.участник
Last Login: 09.11.2007 21:16
Сообщ.: 1 131,
Visits: 8 865
|
|
| Ya realizuyu 1-j variant, no soglasen s Comanche vo vsem. Esche chto mozhno predlozhit': ya delal odin universal'nij blok proverki na vse i vizival ego v cobitiii nazhatiya knopki, visvechivaya nepravil'nie znacheniya polej. No eto uzhe v dopolnenie.
|
|
|
|
|
Supreme Being
      
непров.участник
Last Login: 09.11.2007 21:16
Сообщ.: 1 131,
Visits: 8 865
|
|
| A kasatel'no poslednego predlozheniya Comanche: mozhno poprobovat' dlya etogo ErrorProvider kontrol'.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541,
Visits: 16 997
|
|
Comanche (28.06.2006) Более правильный (но и более сложный) путь: написать property extender или как оно там называется. Видел, наверное, как MS ToolTip Component сделан: бросаешь его на форму - и у всех контролов появляется дополнительная пропертя. Но это лишь идея...Ага, я ему вчера под пиво то же самое толкал :)
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833,
Visits: 16 863
|
|
| Ясненько) Ну, спасибо за ответы. Будет время - попробую написать экстендер)
|
|
|
|