|
43 Кб. |
|
| День добрый. Помогите пожалуйста с функцией(я начинающий и пока сам код пишу очень плохо) Суть такова см.рис на форме у меня кнопки, в кнопке в событии на вход я обращаюсь к публичной функции ObjName, в параметр я пишу название этой самой кнопки,..теперь вопрос: как в функции
Option Compare Database
Public Function ObjName(NameControl As String)
S = 'и тут код для получения названия
End Function
| получить название этой кнопки в переменную(в моем случае "Кнопка2") | |
|
| |
|
|
|
| Вопрос не совсем понятен.
Если вы передаете название кнопки, то оно и есть значение переменной NameControl...
Вообще посмотрите screen.activecontrol | |
|
| |
|
|
|
| да, возможно плохо описал задачу, да и всех тонкостей VBA я еще не знаю(плохо еще что нельзя на словах объяснить. так понятнее было бы сразу). Смотрите повесил я эту функцию на "кнопку2"
Public Function ObjName(Кнопка2 As String)
| т.е и писать нужно таким образом?
мне просто нужно потом сделать тоже самое с "Кнопкой3" и т.д
т.е уже будет
Public Function ObjName(Кнопка3 As String)
| это же куча функции для каждой кнопки, а меня интересует возможно ли обращаться к одной функции но изменяться будет только название кнопок или это каким другим способом организовать можно.. | |
|
| |
|
|
|
| так попробуйте.
Public Function objName()
debug.print screen.activecontrol.Name
end function
|
| |
|
| |
|
48 Кб. |
|
| Спасибо за подсказку...возможно если я вам полностью опишу все задачу то вам будет понятнее что за функцию я пытаюсь сделать( и так как у вас опыта в VBA больше чем у меня возможно вы подскажете какие нибудь альтернативы и лучшие варианты). В общем задача у меня стоит сделать права доступа по пользователям, сейчас вроде как финишняя премая (и время поджимает и начальник не добро смотрит на меня), для чего мне нужна эта функция, см.рис - запрос1 сделан на основе таблицы в которой занесенны: Формы, объекты которые на ней находятся и имена этих объектов,.. Закуп, иниц, вед - это роли пользователей, у пользователя своя роль и соответственно при ней какие то объекты доступны какие то нет.(Р-редактирование, Ч-чтение,НД-недоступно,НВ-невидимо) Столбец Право - это ранг опции, чтобы они могли перекрывать друг друга. т.е Р всегда будет главнее Ч,НД,НВ... Ч будет главнее НД,НВ и т.д....
Для чего мне нужна переменная с именем объекта, чтобы сделать фильтрацию, т.е в Условие отбора я ставлю эту переменную Obj
Public Function ObjName()
Obj = Screen.ActiveControl.Name
End Function
| может в условие отбора нужно поставить ObjName (здесь я прошу поправить меня, если я ошибаюсь и в условие отбора как то иначе нужно помещать эту переменную)
Далее после того как произойдет фильт в запросе останется одна строка, в моем случае Кнопка2, дальше запросом из столбца Право берем значение которое там находится помещаем это в переменную Prav
Ну а дальше функция продолжает свою работу
If Prav = Нд Then
Ме.кнопка2.Enabled = false
Else
If Prav = ч Then
ну и т.д
И в итоге объект будет либо доступен толь для чтения , редактирования или вообще будет скрыт.
Еще большой вопрос для меня в какое событие это все должно выполнятся, т.е при запуске формы пользователь уже должен видеть что закрыто от него, а что доступно. | |
|
| |
|
|
|
| вникать нет сил...
Public Function ObjName() as string
ObjName = Screen.ActiveControl.Name
End Function
|
запрос в этом случае будет выглядеть так
select ..... from .... where [НазваниеОбъекта] = ObjName
|
хотя все не так...
зачем вешать это на событие каждого элемента котоый хотите прятать/дизеблить?
Нужно одну функцию на загрузку формы которая (функция) проставить нужные права для всех контролов.
пока все.... ухел | |
|
| |
|
|
|
| Общая идея наверное должна быть такой.
Если таблицы определяющие: Роли, пользователей, соответствие пользователей Ролям, и доступность контролов разным Ролям (именно ролям, а не пользователям, так проще управлять)
При загрузке формы, делаются доступными контролы доступные Роли текущего пользователя.
реализации могут быть разные. Правильнее всего, наверное, вынести этот функционал в отдельный класс. Но я так понимаю это ПОКА не Ваш случай (со всем уважением).
Тогда функция.
Если не нужно управлять доступностью на уровне записей, а только для формы целиком, то "Вешается" на событие загрузка формы.
В функцию в качестве параметра передается объект Form, текущей формы (ME).
В функции делается запрос к таблице определяющей доступность контролов. С условиями:
- текущая роль пользователя (должна браться из сеанса,пользователь, же авторизуется?)
- название открывающейся формы, его можно получить из переданного объекта
Результат запроса в рекордсет (Recordset)
После этого перебирая записи рекордсета устанавливаете свойства контролов, обратиться к контролам можно через переданных объект формы
frmCurrent.Controls("ИмяКонтрола).НужноеСвойство = ......
Ну вот как-то так | |
|
| |
|
|
|
| маленькое предложение
форму авторизации юзера не закрывать, а скрывать (т.е. вместо команды закрытия формы сделать так forms!"Авторизация".Visible=false)
в этом случае возможно считывание данных с формы (без использования публичных переменных, которые при возникновении ошибки слетают) | |
|
| |