Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229

Отображение вкладок формы навигации в зависимости от полномочий пользователя базы

19.01.2018, 09:13. Показов 3661. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день всем.

Есть база, в ней при открытии запускается главная форма, сделанная в виде формы навигации со вкладками.
Также перед запуском главной формы выдается формочка для определения роли пользователя (менеджер, кладовщик и т.д.) - в зависимости от роли нужно, чтобы отображались или не отображались определенные вкладки главной формы навигации.

Для начала я пошел самым простым путем - забираем роль пользователя в глобальную переменную, и при открытии главной формы проверяем роль и задаем свойство Visible кнопок-вкладок формы навигации. Получилось немного коряво, то есть вкладки-то "прячутся", но на их месте остаются пустоты, выглядит не особо аккуратно, но пойдет.

И вот тут вылезла вторая проблема.

Вкладки располагаются на форме в определенном порядке: первой, допустим, идет вкладка "Заказы", второй - "Материалы" и т.д. И вот если, допустим, задать невидимость кнопки вкладки "Заказы", то получается так, что сама кнопка не отображается, а вот содержимое окна подчиненной формы, которое соответствует именно этому элементу навигации - отображается, то есть пользователь видит перечень заказов, хотя и не должен. А вот если потом перейти на другую вкладку главной формы навигации, то обратно в журнал заказов не вернешься, т.к. правильно, его кнопки нет на экране. Но изначально-то он зачем отображается, этот журнал заказов?.. Как бы так обойти эту ерунду?

Не хотелось бы при этом менять форму навигации на обычную форму со вкладками...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.01.2018, 09:13
Ответы с готовыми решениями:

Обновление/перезагрузка формы в зависимости от привилегий пользователя
Подскажите, пожалуйста! Имеется одна главная форма программы и несколько дочерних, вызываемых главной. На этапе загрузки (событие load)...

Форма навигации: несколько вкладок
Создал форму навигации, в ней несколько вкладок: 1,2,3. Каким образом я могу из вкладки 3 открыть для просмотра вкладку 2 или 1...

Отображение второй формы одновременно с первой в зависимости от значения CheckBox
Есть две формы Форм1 и Форм2. На Форме1 есть чекбокс. Как сделать так что бы если чекбокс нажать то при след. открытии открывалась сразу...

18
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.01.2018, 09:23
К сожалению экспериментировать не на чем. Но исходя из текста Вашего сообщения, можно предложить завести еще одну глобальную переменную, указывающую номер (или название) вкладки, на которую надо переходить при открытии. Номер будет разный для каждого юзера. Тогда, как Вы пишете, если юзеру недоступна вкладка Заказы, он на нее перейти уже не сможет. И при открытии видна будет другая вкладка, не Заказы
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
19.01.2018, 09:27  [ТС]
mobile, Спасибо за идею). А можно глупый вопрос? Как "переходить при открытии" именно в случае с формой навигации?.. Что-то не соображу с утра)
0
Эксперт MS Access
 Аватар для ltv_1953
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
19.01.2018, 09:53
А не проще будет сделать копии "полной" формы навигации (наверное 3-4 будет) , по удалять из них лишнее и открывать, после определения роли пользователя, нужную.
1
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.01.2018, 09:53
Цитата Сообщение от Kkarn Посмотреть сообщение
Как "переходить при открытии" именно в случае с формой навигации?..
Повторюсь, к сожалению, что экспериментировать не на чем. Но предположим, что в элементе навигации есть кнопки с именами. Тогда, задав фокус на нужную кнопку и применяя SendKeys, наверное можно открыть вкладку
Visual Basic
1
2
Me(ПеременнаяНужнаяКнопка).setfocus
SendKeys "{Enter}"
Наверняка есть более удобные методы, но вот сейчас подсказать не могу. Форму навигации пока не использовал, ее свойств не знаю
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
19.01.2018, 09:58  [ТС]
ltv_1953, Спасибо, тоже интересная идея.
mobile, И еще раз спасибо, попробую такой вариант.
0
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.01.2018, 10:05
Лучший ответ Сообщение было отмечено Kkarn как решение

Решение

И еще. Вместо переменных лучше в спец.таблице, соединенной с таблицей ролей юзеров завести поля имен вкладок и номера кнопки открытия. Ведь есть немалая вероятность появления новых ролей или перемены их прав. Вместо того, чтобы править код, гораздо проще и надежней поправить таблицу.
2
296 / 257 / 68
Регистрация: 18.06.2015
Сообщений: 570
19.01.2018, 11:17
И еще я бы предложил не скрывать, а деактивировать кнопки, которые недоступны текущему пользователю. Так не будет ни пробелов, и кнопки не будут "скакать", что может быть не удобно пользователям - привыкают.

Ну и навигационная форма - не лучшее решение, я бы его избегал - при переключении каждая форма грузится заново, много других мелких проблем, подобной этой. Переделка на обычные табы займет не так много времени, я бы переделал.
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
19.01.2018, 12:30  [ТС]
MrShin, Спасибо, попробую предложить и такой вариант (с деактивированными кнопками).
А я как-то привык к навигационным формам, а в том, что при переключении формы грузятся заново - есть и свой плюс. Хотя да, и минусы в них тоже есть, сталкивался...
0
2 / 2 / 0
Регистрация: 21.03.2017
Сообщений: 74
19.01.2018, 15:16
Visual Basic
1
2
3
If [полепользователя] = кладовщик Then
[вкладкаАдминистратор].Visible=False
Else [вкладкаАдминистратор].Visible=True
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
25.01.2018, 09:08  [ТС]
На всякий случай отвечу тут сам себе).
Оптимальным вариантом оказалось задание свойства SourceObject у подчиненной формы навигации. То есть при открытии формы навигации сначала анализируем, какие кнопки вкладок отображать, и попутно, если кнопка заблокирована, то прописываем что-то вроде

Visual Basic
1
Me.ПодчиненнаяФормаНавигации.SourceObject = "ИмяФормыИзСледующейВкладки".
И тогда при открытии формы все работает правильно, то есть пользователю отображаются только доступные ему кнопки вкладок, и соответствующее содержимое первой из доступных ему вкладок.
1
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
26.01.2018, 02:49
Цитата Сообщение от MrShin Посмотреть сообщение
Так не будет ни пробелов, и кнопки не будут "скакать", что может быть не удобно пользователям - привыкают.
Но ведь у каждого пользователя свой набор кнопок, других же пользователей он не видит. Почему же тогда будут скакать кнопки? У меня вот на одной форме всегда ряд кнопок, которые выстраиваются и визибл в зависимости от пользователя. Сантехник заместо сварщика у нас не работает :
2
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
03.02.2018, 20:56  [ТС]
Возвращаюсь в эту тему с близким вопросом.

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

Visual Basic
1
2
3
4
5
6
7
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim intAltDown As Integer
intAltDown = (Shift And acAltMask) > 0
 
If intAltDown And KeyCode = 81 Then
    Me.ПодчиненнаяФормаНавигации.SourceObject = "ФрмЗакупки"
End If
То есть это обозначает, что по нажатию сочетания клавиш Alt + Q будет открываться вкладка "Закупки".

И оно работает, в подформе навигации отображается содержимое именно этой вкладки, НО. Как сделать так, чтобы заодно и кнопка этой вкладки отображалась НАЖАТОЙ, то есть меняла свой цвет на форме?... А то получается ерунда: в подформе отображается содержимое вкладки "Закупки", а нажатой, например, наверху формы выглядит кнопка "Заказы"... Визуально получается ерунда, хотелось бы довести до ума ситуацию...
То есть по сути вопрос такой: как заставить кнопку формы навигации выглядеть нажатой, то есть поменять цвет, визуальное оформление и т.д.?

Может, я подхожу к вопросу не с той стороны, конечно.
Я пробовал уже сделать так, как советовал выше mobile, то есть
Me(ПеременнаяНужнаяКнопка).setfocus
SendKeys "{Enter}"
Так не работает. Точнее, кнопка визуально получает пунктирное выделение по краю (как выделенная), но передача нажатия энтера не срабатывает, потому и решил прописать так, как описал выше, т.е. путем замены соурсобъекта подформы навигации.
0
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.02.2018, 12:29
Лучший ответ Сообщение было отмечено Kkarn как решение

Решение

Цитата Сообщение от Kkarn Посмотреть сообщение
Как сделать так, чтобы заодно и кнопка этой вкладки отображалась НАЖАТОЙ, то есть меняла свой цвет на форме?
Надо в цикле задать всем контролам навигации цвет (BackColor) неактивной кнопки. Затем задать фокус нужной кнопке и дать ей цвет активной.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim intAltDown As Integer
intAltDown = (Shift And acAltMask) > 0
 
'В цикле обходим контролы навигации
For i = 0 To Me.ПодчиненнаяФормаНавигации.Controls.Count - 1
    Me.ПодчиненнаяФормаНавигации.Controls(i).BackColor = цвет_НЕ_активной_кнопки
Next
 
If intAltDown And KeyCode = 81 Then
    Me.ПодчиненнаяФормаНавигации.SourceObject = "ФрмЗакупки"
    'Делаем нужную кнопку активной и задаем ей цвет активной кнопки
    Me.КнопкаНавигации1.SetFocus
    Me.КнопкаНавигации1.BackColor = цвет_Активной_кнопки
End If
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
04.02.2018, 15:07  [ТС]
mobile, спасибо, направление мысли понял.
Я тут ещё подумал, что в моём случае лучше будет задействовать макрос autokeys (само собой, он будет вызывать функции, описанные выше). Но обнаружил, что в нем почему-то невозможно задать сочетания клавиш с Alt. То есть я нашел в описании sendkeys, что альт обозначается как %, соответственно написал в autokeys имя встроенного макроса %Q, но при нажатии комбинации ругается на неприемлемое имя и отсылает к хелпу по sendkeys, откуда собственно я это и взял...
0
Эксперт MS Access
26827 / 14507 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.02.2018, 15:28
Насколько я помню (давно не использовал) в autokeys можно применять только сочетания только с CTRL. С некоторыми исключениями для Shift. ALT вроде бы запрещен для AutoKeys. Во всяком случае с буквами и цифрами применим только CTRL.
1
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
04.02.2018, 15:36  [ТС]
Понятно. Очень жаль... Просто если пользоваться захватом нажатия клавиш для главной формы навигации, то там можно использовать альт, но зато если пользователь кликнет в подчиненной форме, то горячие клавиши уже не работают... То есть можно, конечно, прописать захват ещё и в каждой из возможных подчиненных форм, но это уже как-то не то, т.к. там есть варианты с другими вложенными формами и т.д. Ладно, ещё раз большое спасибо, суть я понял, буду думать.
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
05.02.2018, 14:08  [ТС]
Я здесь набросал базу-пример.
В ней - форма навигации, на которой три "вкладки". При этом заказчик настаивает на дурацкой (на мой взгляд) раскрашенности каждой вкладки в свой цвет, а выбранная в данный момент вкладка выдяляется более темным цветом и белым шрифтом.
Так вот, нужно сделать, чтобы по сочетанию клавиш Ctrl + 1, Ctrl + 2 и Ctrl + 3 открывалась соответственно первая, вторая или третья вкладка. Это я решил путем замены соурсобъекта подчиненной формы, оно работает. Но вопрос о том, как сменить цветовое оформление "нажатой" вкладки - остается открытым.
Я пробовал играться со свойствами BackColor и ForeColor. В принципе, смог добиться того, чтобы "выбранная" вкладка становилась по цвету как бы нажатой, НО при этом визуально остается нажатой и кнопка другой вкладки. которую до этого нажимали мышкой. Хотя я прописывал ей сменить бэкколор на "фоновый" - не срабатывает почему-то... Поэтому убрал из базы эти "пробы", они все равно не дают правильного результата.
Хотелось бы таки окончательно порешать данный вопрос, буду очень признателен).
Вложения
Тип файла: rar Database1.rar (30.3 Кб, 21 просмотров)
0
 Аватар для Kkarn
902 / 292 / 50
Регистрация: 02.12.2014
Сообщений: 1,229
06.02.2018, 10:13  [ТС]
Хотя, наверное, лучше вынести этот вопрос в отдельную тему, поскольку начального вопроса оно вообще не касается...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.02.2018, 10:13
Помогаю со студенческими работами здесь

Отображение формы (заставки) при загрузке приложение, в зависимости от роизводительности ПК
Необходимо отбражать главную форму (форму заставку) во время загрузки приложение в зависимости от производительности ПК! подскажите как...

Проверка полномочий наименования компьютера при открытии формы
Добрый день Подскажите пожалуйста с вопросом. В базе есть таблица t_workzone, где проставлена галочка в логическом поле напротив...

Отображение меню навигации в IE
Здравствуйте. Столкнулся с такой проблемой: делаю резиновое меню навигации с помощью свойств css display: table-row и display: table-cell....

Скрытие вкладок подчиненной формы с условием главной формы
Вопрос вот в чем Уважаемые! Как сделать так, чтобы при выборе на главной форме параметра VZB, на подчиненной форме оставалась лишь...

Отображение / скрытие вкладок в Access97
Скажите пожалуйста, как сделать отображение / скрытие вкладок по событию и чтобы при переходе по записям, отображение либо скрытие вкладок...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru