Обмен опытом: свойство Enabled
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Обмен опытом: свойство Enabled Expand / Collapse
Автор
Сообщение
28.06.2006 11:27


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme 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.
Этот подход хорош по следующим причинам 
    а) нет лишней нагрузки
    б) нет никакой путаницы - для каждого элемента условие в своем месте
 
Так вот собственно и вопрос - как  делаете вы?
Сообщ. #899765
28.06.2006 14:41


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme 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(); }
Сообщ. #899788
28.06.2006 21:30
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme 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.
Сообщ. #899821
28.06.2006 21:38
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme 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'.
Сообщ. #899822
29.06.2006 13:29


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541, Visits: 16 997
Comanche (28.06.2006)
Более правильный (но и более сложный) путь: написать property extender или как оно там называется. Видел, наверное, как MS ToolTip Component сделан: бросаешь его на форму - и у всех контролов появляется дополнительная пропертя. Но это лишь идея...

Ага, я ему вчера под пиво то же самое толкал :)


Сообщ. #899854
29.06.2006 14:09


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Ясненько)

Ну, спасибо за ответы. Будет время - попробую написать экстендер)

Сообщ. #899864
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin

Время GMT +3:00, Сейчас 6:40