| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Главное меню программы |
| Автор: Serggggg 22.1.2004, 12:14 |
| Доброго времени суток! Прошу совета! Дело вот в чём - в главном меню программы есть куча разных элементов (Item'ов). С прогой будут работать несколько отделов предприятия! Желательно, чтобы тупой юзер из 1-го отдела не влез в таблицу (таблицы), с которой работает 2-й отдел! Всё это можно, конечно, блокировать на уровне самой БД. Однако в самой программе лучший способ, как мне кажется, - это просто скрыть пункты меню, которые вызывают процедуры, не нужные юзеру из 1-го отдела. У пунктов меню есть замечательное свойство - Visible! Стоит сказать, что у разных пунктов разная вложенность. И, в принципе, скрывать придется вложенные и вложенные-вложенные пункты. Собственно, вопрос: можно ли как-то универсально описать эту процедуру (как, например, обработку матрицы)? Потому что с оператором Case (User_ID of) долбаться не хочется. Надеюсь, все (или основное) понятно! Спасибо. С уважением, Serggggg. |
| Автор: Paradox 22.1.2004, 12:32 |
| У нас в системе это функционирует созданием в БД таблицы юзеров и к ним привязаны пункты меню им позвлленные по=моему |
| Автор: P@dla 22.1.2004, 12:48 | ||||
| Сделай несколько вариантов главного меню, один экшэн лист (ActionList) и в каждом главном меню назначь экшены (Action) на соответствующие Items. А после выбора юзверем своего отдела назначай форме соответствующее главное меню... вот пример:
вот форма:
|
| Автор: Serggggg 22.1.2004, 13:30 |
| Paradox, а клиентская прога хватала индексы пунктов меню или названия из таблицы пунктов? |
| Автор: Serggggg 22.1.2004, 13:32 |
| И ещё, можно ли пройтись по всему меню со вложенностью N и за один раз выставить на ВСЕХ пунктах нужный Visible? |
| Автор: Pakshin A. S. 22.1.2004, 20:23 |
| Если меню большая, то долго будет... но это сейчас не актуально. |
| Автор: x77 22.1.2004, 21:37 |
| Serggggg, можно, рекурсией. ещё один вариант: у всех юзверей, видящих определённую таблицу должен быть некий общий признак, X. например, номер отдела. или ещё что-то. если его нет, значит, его надо ввести. после этого делаешь полное меню (на всех), привязываешь его к Action'ам при желании, а потом выставляешь в тегах меню (или экшенов) нужный параметр. если нужен не один, например, один юзверь может видеть некоторые меню другого, то их можно комбинировать (например, как в FileAttr: 1 + 2 + 4 + 8 + 26 + 32 + 64 + ... ) на уровне бита всегда можно определить, входит туда нужный номер или нет. 32 бита тебе, я думаю, хватит. хотя можно и просто вести какую-то линковочную таблицу вида [Х, № меню]). при запуске программы получаешь Х, проходишь в цикле все меню/экшены, и проверяешь, есть ли такой "бит" в теге. если нет - выключаешь. с линковочной таблицей сложнее и медленнее, там всё-таки таблицу сосать из базы придётся. |
| Автор: Medved 23.1.2004, 02:13 |
| TActionList+RTTI; |
| Автор: x77 23.1.2004, 04:50 |
| Pegas, а чем поможет RTTI? 8) |
| Автор: Serggggg 23.1.2004, 14:25 |
| Интересная идея с битами. Благодарю за совет. Надо опробовать. |
| Автор: Medved 26.1.2004, 23:22 | ||
Посмотрите наш FAQ. Там кое-что есть о RTTI. Там Вы найдете ответ на свой вопрос. Если же не найдете, то пишите, отвечу. |