|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Задача: создание системы разграничения доступа к контролам форм на уровне интерфейса (с помощью методов .Enabled, .Locked) на основе таблицы полномочий. Задача усложнена тем, что доступ ко многим контролам так же закрывается/открывается, подчиняясь определенной бизнес-логике приложения (например: в зависимости от значения Поля1 и переменной х мы закрываем или открываем Поле2). Вопрос: можно ли изменить стандартные методы .Enabled и .Locked контролов, добавив свой обработчик? Т.е. сначала должна отработать логика приложения на VBA, а потом, при вызове метода .Enabled - дополнительная проверка/отработка системы разграничения доступа? Позволяет ли Access такие вольности? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:20 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotov, Странный вопрос... сначала проверяй все свои бизнес логики и полномочия, а в конце делай или не делай свои .Enabled и .Locked ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:27 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotovс помощью методов .Enabled, .LockedЭто свойства, а не методы. Посему вопрос - непонятен. Осмыслите его ещё раз (причём в стандартных терминах), после чего переформулируйте так, чтобы было понятно, что же нужно сделать. PS. Событий изменения указанных свойств контрола - не существует. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:30 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotov, К стати Enabled Locked свойства, а ни методы. vmag вам правильно советует. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:31 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
vmagAIzotov, Странный вопрос... сначала проверяй все свои бизнес логики и полномочия, а в конце делай или не делай свои .Enabled и .Locked Приложение (и бизнес логика) существует давно, довольно объемное. Копаться во всем коде и дописывать к каждому .Enabled проверку полномочий совсем не хочется. Хочется написать универсальный обработчик, добавить его в класс и автоматом получить требуемый результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:34 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
ROIAIzotov, К стати Enabled Locked свойства, а ни методы. vmag вам правильно советует. В принципе это не важно. Важно понимать смогу ли я добавить свою логику в класс. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:38 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotovROIAIzotov, К стати Enabled Locked свойства, а ни методы. vmag вам правильно советует. В принципе это не важно. Важно понимать смогу ли я добавить свою логику в класс. В Access нет такого понятия как переопределения методов класса. Ну и классы в нем закрытые так - что увы. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:45 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
ROIAIzotovпропущено... В принципе это не важно. Важно понимать смогу ли я добавить свою логику в класс. В Access нет такого понятия как переопределения методов класса. Ну и классы в нем закрытые так - что увы. Печально. Понял, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 12:48 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotov, А почему не перебрать циклом EACH(на открытии формы или текущей записи)все элементы нужных типов и задать,по условию,нужные свойства(если правильно понял задачу) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 14:44 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
sdkuAIzotov, А почему не перебрать циклом EACH(на открытии формы или текущей записи)все элементы нужных типов и задать,по условию,нужные свойства(если правильно понял задачу) Это при открытии формы - так и делается. Но во время работы, на уже открытой форме, в событии AfterUpdate некоторых контролов происходит анализ данных и последующая реакция в виде .Enabled=true или false для других контролов. Но эта операция менее приоритетна, чем контроль доступа, т.е. каждое обращение к свойству .Enabled должно "накрываться сверху" проверкой доступности этого контрола системой разграничения доступа. Запутанно как-то выглядит объяснение. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 15:01 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotov, в событии Form_Dirty можно попробовать анализировать значение свойств и закрывать отслеживаемые контролы. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 15:16 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotovв событии AfterUpdate некоторых контролов происходит анализ данных и последующая реакция в виде .Enabled=true или false для других контролов. ..а последней строкой кода на обработке AfterUpdate контрола должно быть: Me.ctl.Enabled=true\false для других контролов. Вы же сами отвечаете на свой вопрос ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 15:18 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Вдогонку:единственное что нужно предусмотреть-если контрол скрыт при открытии-игнорировать его отображение при обновлении поля ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 15:24 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
sdkuAIzotovв событии AfterUpdate некоторых контролов происходит анализ данных и последующая реакция в виде .Enabled=true или false для других контролов. ..а последней строкой кода на обработке AfterUpdate контрола должно быть: Me.ctl.Enabled=true\false для других контролов. Вы же сами отвечаете на свой вопрос Этих AfterUpdate у меня - около двух сотен. Естесственно, это решение "в лоб" и оно приходит на ум первым. Но его трудоемкость заставляет поискать другие варианты. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 15:25 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotovЭтих AfterUpdate у меня - около двух сотен. Естесственно, это решение "в лоб" и оно приходит на ум первым. Но его трудоемкость заставляет поискать другие варианты. У вас других вариантов практически нет. К каждому контролу придется приложить руки (увы это Access) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 15:32 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
ROIAIzotovЭтих AfterUpdate у меня - около двух сотен. Естесственно, это решение "в лоб" и оно приходит на ум первым. Но его трудоемкость заставляет поискать другие варианты. У вас других вариантов практически нет. К каждому контролу придется приложить руки (увы это Access) Ну так после Вашего ответа выше я это понял. Наверное сделаю public процедуру-обёртку над .Enabled с доп. анализом полномочий. И может быть получится как-то контекстно заменить (с помощью VBA). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2018, 15:45 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotovЗадача: создание системы разграничения доступа к контролам форм на уровне интерфейса (с помощью методов .Enabled, .Locked) на основе таблицы полномочий. Вам нужно написать и вызывать при открытии формы процедуру, которая на основе имени пользователя и имени формы извлекает из таблицы имена контролов и делает им .Enabled, .Locked. AIzotovдоступ ко многим контролам так же закрывается/открывается, подчиняясь определенной бизнес-логике приложения (например: в зависимости от значения Поля1 и переменной х мы закрываем или открываем Поле2). А это параллельный процесс, который проще всего решается условным форматированием. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 09:54 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Что-то похожее было реализовано в моей программе "Автотранспорт". Запрашивались логин и пароль при входе в программу и в зависимости от назначенной роли пользователя блокировались определённые кнопки управления на формах. Ролей было мало 4 или 5. (администратор, руководитель, пользователь, зритель...) Форм то-же не очень много. Они были универсальными для всех ролей. Органы блокировались только при загрузке формы. Во время работы с формой блокировки не менялись. В другой задаче по документообороту заявок на материалы и оборудование кроме универсальных форм были и специализированные формы под конкретную роль. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 10:39 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
JossЧто-то похожее было реализовано в моей программе "Автотранспорт". Вашу программу с rusimport'a я видел уже очень давно :) Думаю Вы писали ее уже с учетом требований разграничения доступа. У меня ситуация немного другая (описано выше). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 10:55 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Возможно стоит пойти по пути создания ряда маленьких форм или inputbox для ввода соответствующих значений? И вызывать нужные в зависимости от значения ввода предыдущих? А может Вы выложите скриншот Вашей формы и уточните, что Вам надо? И что Вы понимаете под системой разграничения доступа? Доступ в зависимости от роли пользователя или доступ в зависимости от предыдущих действий пользователя? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 11:09 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
JossВозможно стоит пойти по пути создания ряда маленьких форм или inputbox для ввода соответствующих значений? И вызывать нужные в зависимости от значения ввода предыдущих? А может Вы выложите скриншот Вашей формы и уточните, что Вам надо? И что Вы понимаете под системой разграничения доступа? Доступ в зависимости от роли пользователя или доступ в зависимости от предыдущих действий пользователя? Еще раз: приложение работает больше 10 лет, форм - больше 100. Объем кода - за 30 тысяч строк. Перестраивать все это - нет ни желания, ни необходимости. Открытие/закрытие элементов управления на формах в зависимости от определенных условий тоже успешно работает. Задача - добавить этот механизм алгоритмом, который проверял бы полномочия текущего пользователя (роли) для всех (требуемых) контролов текущей формы. Пример: 1. Пользователю№1 разрешены все контролы формы. В зависимости от выбранного значения Combo1, в соответствии с бизнес-логикой приложения, ему становится доступным или Поле1, или Поле2. Это реализовано процедурой в событии AfterUpdate Combo1. 2. Пользователю№2 разрешены только Combo1 и кнопка Exit, т.е. в событии Open формы мы проверяем его полномочия и закрываем Поле1, Поле2, Edit. Он выбирает какое-то значение в Combo1, страбатывает событие AfterUpdate и открывает Поле1 или Поле2. Но такого быть не должно - Пользователю№2 они запрещены в любом случае. Т.е. после процедуры, реализующей открытие/закрытие по бизнес логике должен отработать какой-то механизм, проверяющий полномочия и реагирующий на них. Решается это просто, в лоб - создается public процедура, реализующая такой механизм, и её вызов добавляется в конце каждого AfterUpdate. Трудоемко. Хочется избежать такой рутины. Поэтому и ищу варианты. Про процедуру-обёртку над .Enabled уже написал. В принципе такая корректировка кода в масштабах всего приложения автоматизируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 12:32 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
У меня такое реализовалось в лоб. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 13:01 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotovJossВозможно стоит пойти по пути создания ряда маленьких форм или inputbox для ввода соответствующих значений? И вызывать нужные в зависимости от значения ввода предыдущих? А может Вы выложите скриншот Вашей формы и уточните, что Вам надо? И что Вы понимаете под системой разграничения доступа? Доступ в зависимости от роли пользователя или доступ в зависимости от предыдущих действий пользователя? Еще раз: приложение работает больше 10 лет, форм - больше 100. Объем кода - за 30 тысяч строк. Перестраивать все это - нет ни желания, ни необходимости. Открытие/закрытие элементов управления на формах в зависимости от определенных условий тоже успешно работает. Задача - добавить этот механизм алгоритмом, который проверял бы полномочия текущего пользователя (роли) для всех (требуемых) контролов текущей формы. Пример: 1. Пользователю№1 разрешены все контролы формы. В зависимости от выбранного значения Combo1, в соответствии с бизнес-логикой приложения, ему становится доступным или Поле1, или Поле2. Это реализовано процедурой в событии AfterUpdate Combo1. 2. Пользователю№2 разрешены только Combo1 и кнопка Exit, т.е. в событии Open формы мы проверяем его полномочия и закрываем Поле1, Поле2, Edit. Он выбирает какое-то значение в Combo1, страбатывает событие AfterUpdate и открывает Поле1 или Поле2. Но такого быть не должно - Пользователю№2 они запрещены в любом случае. Т.е. после процедуры, реализующей открытие/закрытие по бизнес логике должен отработать какой-то механизм, проверяющий полномочия и реагирующий на них. Решается это просто, в лоб - создается public процедура, реализующая такой механизм, и её вызов добавляется в конце каждого AfterUpdate. Трудоемко. Хочется избежать такой рутины. Поэтому и ищу варианты. Про процедуру-обёртку над .Enabled уже написал. В принципе такая корректировка кода в масштабах всего приложения автоматизируется. правильно ли я понимаю, что ваш комбобокс = уровень доступа( админ, зверь, менеджер) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 14:37 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Прогер_самоучкаправильно ли я понимаю, что ваш комбобокс = уровень доступа( админ, зверь, менеджер) ? Нет. Это элемент бизнес-логики. Уровень доступа должен быть добавлен (наложен сверху) на основе таблицы полномочий. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 14:51 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotov1. Пользователю№1 разрешены все контролы формы. В зависимости от выбранного значения Combo1, в соответствии с бизнес-логикой приложения, ему становится доступным или Поле1, или Поле2. Это реализовано процедурой в событии AfterUpdate Combo1. Ну хорошо, Combo1 заполнили - Поле1, или Поле2 включилось, затем переходите на новую запись, Combo1 пусто, а Поле1, или Поле2 включено . Вы же про событие Current формы ничего не пишете. Как выкручиваетесь? AIzotov2. Пользователю№2 разрешены только Combo1 и кнопка Exit, т.е. в событии Open формы мы проверяем его полномочия и закрываем Поле1, Поле2, Edit. Он выбирает какое-то значение в Combo1, страбатывает событие AfterUpdate и открывает Поле1 или Поле2. Но такого быть не должно - Пользователю№2 они запрещены в любом случае. Т.е. после процедуры, реализующей открытие/закрытие по бизнес логике должен отработать какой-то механизм, проверяющий полномочия и реагирующий на них. У контролов есть редко используемое строковое св-во "Дополнительные сведения"(Tag). Если на Open формы кроме закрытия доступа к контролам писать что-то в их Tag, то затем на AfterUpdate этот Tag проверять и не пущать. Но я еще раз со своим самоваром - условное форматирование (УФ) позволяет управлять доступом к полю. Например, для Поле1 указать выражение [Combo1] Is Null и действие "Включить" то включение/выключение будет работать исправно, если его Enabled=True. А если Falde, ьо никаких изменений не будет. Что и требуется. Правда УФ можно применять только к полям и полям со списком. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 15:37 |
|
|
start [/forum/topic.php?fid=45&msg=39697242&tid=1611203]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
164ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 285ms |
0 / 0 |