|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#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 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
ROIAIzotovпропущено... В принципе это не важно. Важно понимать смогу ли я добавить свою логику в класс. В Access нет такого понятия как переопределения методов класса. Ну и классы в нем закрытые так - что увы. Я не очень понял, что же хочет сделать автор темы, но в Аксесе можно создавать свои классы и в них делать всё, что хочется. В том числе, перехватывать события контролов Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 16:04 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotov, Перечитал все ваши посты в теме и вспомнилась фраза из анекдота - "Ты не мудри, ты пальцем покажи" Бизнес-логика, Enabled, Locked... И при этом "не хочется копаться во всём коде" Приведите пример (а не абстрактные рассуждения) как вам видится процесс управления доступом к контролам AIzotovПозволяет ли Access такие вольности? Аксес вполне нормальная среда разработки, с весьма развитым языком, так что позволяет он очень много. Главное, понять чего хочешь и нагуглить пример реализации (почти не шутка) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 16:12 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Кривцов Анатолий... затем переходите на новую запись Это не ленточная форма. По поводу свойства Tag можно подумать. Условное форматирование, как мне кажется, недостаточно гибкий вариант. Плюс есть органичения - не для всех контролов работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 18:08 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Аллюр Д.Приведите пример (а не абстрактные рассуждения) как вам видится процесс управления доступом к контролам Пример вроде бы привел. Может он и абстрактный, но достаточно точно описывает работу приложения. Процесс управления простой: есть таблица с перечнем всех ролей и их полномочиями по доступу к контролам. После отработки бизнес-логики, приведенной в предыдущем примере, нужно только проверить, разрешен ли данный конкретный контрол текущей роли (найти запись роль-форма-контрол) и запретить/разрешить его. Ну не знаю как по-другому объяснить. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 18:22 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
>>Ну не знаю как по-другому объяснить. Да все понятно объясняете. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 18:46 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotovАллюр Д.Приведите пример (а не абстрактные рассуждения) как вам видится процесс управления доступом к контролам Пример вроде бы привел. Может он и абстрактный, но достаточно точно описывает работу приложения. Процесс управления простой: есть таблица с перечнем всех ролей и их полномочиями по доступу к контролам. После отработки бизнес-логики, приведенной в предыдущем примере, нужно только проверить, разрешен ли данный конкретный контрол текущей роли (найти запись роль-форма-контрол) и запретить/разрешить его. Ну не знаю как по-другому объяснить. Дык объясните, что конкретно у вас не получается? А так на событие открытие формы вешаете обработчик доступа и делайте с вашими контролами что хотите PS: я не думаю что обрабатывать нужно все ваши 100 форм. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 05:18 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
[quot ROI]AIzotovДык объясните, что конкретно у вас не получается? А так на событие открытие формы вешаете обработчик доступа и делайте с вашими контролами что хотите PS: я не думаю что обрабатывать нужно все ваши 100 форм. На данный момент у меня не получается объяснить задачу, чтобы ВСЕ поняли. Все остальное получается. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 09:13 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Predeclared>>Ну не знаю как по-другому объяснить. Да все понятно объясняете. Тогда вы объясните непонимающим ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 10:23 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
AIzotovROIДык объясните, что конкретно у вас не получается? А так на событие открытие формы вешаете обработчик доступа и делайте с вашими контролами что хотите PS: я не думаю что обрабатывать нужно все ваши 100 форм. На данный момент у меня не получается объяснить задачу, чтобы ВСЕ поняли. Все остальное получается. Если некий контрол уже имеет Enable=False, то повторное Enable=False ему не повредит. Если бизнес-логика запрещает давать этому контролу Enable=True, то надо либо хранить информацию об этом запрете, как уже предлагали в Tag (заполняется, например, в событии Open формы), либо каждый раз запрашивать из таблицы ролей. В некую унифицированную процедуру передавать имя формы и имя контрола и делать выборку по этим условиям, дополним id роли текущего пользователя. Минимизировать усилия по допиливанию форм, скорее всего, сильно не получится. Чуть выше я писал про собственный класс, но ради отслеживания одного события After_Update - овчинка не стоит выделки. Так что я бы просто прошёлся вручную по всем нужным контролам и дописал вызов общей функции ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 10:36 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Аллюр Д.Так что я бы просто прошёлся вручную по всем нужным контролам и дописал вызов общей функции Дык я же это и предлагал http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1301929&msg=21662817 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 10:49 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
Аллюр Д.Predeclared>>Ну не знаю как по-другому объяснить. Да все понятно объясняете. Тогда вы объясните непонимающим Так что тут объяснять? Легкого и/или "красивого" решения этой задачи пока не нарисовывается. Остается только посочувствовать ТС, так он вроде как не за этим сюда пришел. Не? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 13:29 |
|
Перехватить/изменить метод стандартного контрола
|
|||
---|---|---|---|
#18+
так то есть функция поиска в модулях,формах, запросах и пр.(где то на форуме было упоминание) найти те события, да добавить в них Код: vbnet 1.
а там уж дело техники... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 13:49 |
|
|
start [/forum/topic.php?all=1&fid=45&tid=1611203]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
163ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 292ms |
total: | 572ms |
0 / 0 |