powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Делимся нашими наработками?
72 сообщений из 72, показаны все 3 страниц
Делимся нашими наработками?
    #39725071
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
300 лет назад был топик про интерфейс и все такое. Давайте продолжим те традиции? Выкладываем примеры с небольшим сопроводительным описанием, скриншотами и плюсами решения.




1. Минималистичный внешний вид,
2. Разнесены данные и управление фильтрами на разные вкладки
3. В систему фильтров встроен гибкий фильтр по датам(сегодня, вчера, прошлый месяц и так далее), в том числе и указание периода и точной даты
4. Понятная настройка отображение столбцов и их порядок следования
5. Выгрузка отчета в Excel, исходя из настроек фильтров и столбцов
6. Вместо кнопок для новой операции и выгрузки в Excel применены костыли в виде картинки и label`а.


p.s. Это не "рабочий" проект, а сделанный на коленке прототип журнала операций.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725072
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то с картинками не задалось:

https://ibb.co/d4TGF0
https://ibb.co/m26ghf
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725078
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам файл проекта.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725102
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Я конечно извиняюсь заранее, ну наверно звезды так легли, а может пик давления в атмосфере...
хочу ваш душевный порыв оградить от печального опыта:
http://www.sql.ru/forum/1231240/kucha-primerov-zagotovok-dlya-bd-i-prochie-narabotki?hl=
хотя можно было бы и им воспользоваться, тем более рейтинг у той пустоватой ветки несмотря на все не хилый (можно было бы там почистить мусор, оставить один самый яркий пример от Лапуха и пойти дальше)...
Здается мне что без элементов голосования в ветке за каждый пост (нужен/не нужен) и чистки постов по результатам голосования админами из вашей затеи тоже может ничего не получиться, хотя идея сама по себе очень хорошая... без чистки лишнего поиск нужного в топике ничем не будет отличаться от поиска по всему акцессу и тогда теряется весь смысл...
P/S/
Вот честно - абсолютно без всякого намека на какую либо агрессию и исключительно с добрыми намерениями...
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725107
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag, знал же, что было. Хотя была еще более старая ветка. Без намека на намеки на агрессию, спасибо.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725223
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оставим тот топик Лапуху
динамически создаваемые формы - как видно они и похожи и не очень но это одна форма, в одной своей ипостаси она сохраняет в аутлуке расписание.
псевдосводный отчет
псевдосводный отчет2 отчет на основе 7 динамически создаваемых, сложных запросов, 3 основываются на таблицах - остальные на этих запросах - после создания отчета запросы уничтожаются-количество строк может быть больше... много больше.
парсер - парсер экселя (накладные кп, прайсы) - хорош тем что юзер может создать шаблон самостоятельно, есть несколько функций с инструкцией и примерами, которые могут добавляться в настройках. есть также возможность импортировать созданный кем-то другим шаблон (право создания и экспорта шаблона разработчик оставил себе :) )
ссылки повисят какое-то время с годик, мож.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725261
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 alecko
лентяй! :)
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725296
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это я ещё справочники не показал :)
зато кнопки, галочки на нужных местах, размеры полей пр.
Baselock -прога для шифрования, блокирование, пароли... (в обратном направлении тоже)-работает при свернутом окне акса, поэтому менюшка всплывающая очень неплоха (помойму) - ну и динамически изменяемые инстансы(как же без них) 3-й инстанс комментировать не будем :)
analitics -модуль класса, в форме ни строчки кода, соответственно инстансов может быть куча на референсе Microsoft Office XP Web Components файл - OFFOWC.DLL - хорошая библиотека.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725304
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,

Не, пока непонятно кто... Озверин и картинки дал и исходник, а этот только картинки...
Если про исходники забыл - то раззява, а если это замануха типа картинки посмотреть бесплатно, а исходники платно - наверно мля бизнесмен...
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725316
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag, исходников не будет. куцый дизайн достал, решил показать что есть и другой взгляд. повторить такое не так уж сложно. динамически изменяемые формы - да, думаю что стоит рассказать о своем подходе (но это ж надо оформить и код и описание), а вот надо ли оно кому-это вопрос.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725319
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko, как то без "потыкать" - смотрится не очень. Не поклонник я цветных решений(без всякого расизма, само собой).
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725331
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинНе поклонник я цветных решений

Аналогично... обычно все с этого начинают, типа красиво, но однажды мне как-то обычный кассир сказал:
- а вы разработчик ?
- да говорю, я... а что ?
- а вы не могли бы переделать форму продажи?
- а что не так?
- да всё так, только я целый день в неё таращусь, а потом когда спать ложусь у меня эти ядовитые цвета с дырками в них пол ночи мерещатся и спать не дают...

Ну и все... с тех пор совсем другой подход, ничего яркого, ничего контрастного, ничего серо-буро малинового,
глаза не должны напрягаться и кровь из носа не должна идти...
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725332
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko... куцый дизайн достал, решил показать что есть и другой взгляд. ...
Было бы правильно определиться с терминологией.
Что есть в вашем представлении понятие "куцый дизайн"?
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725333
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин...без всякого расизма, само собой).
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725351
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще одно "решение" - справочники, деревья и все-все-все.
В примере никаких "красивостей" с точки зрения ui нет, но есть некоторые находки, которые давно витают в воздухе и которые неоднократно обсуждали господа nord-wolf и Программист-Любитель(он же П-Л) - работа с экземплярами форм.(у них это реализовано - у каждого немного иначе)

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

В примере есть 3 таблицы - иерархические справочники(Список смежности, самый примитивный вариант реализации, не считая глубины элемента), для каждой из таблиц можно открыть, собственно, саму форму с деревом(стандартный контрол винды. В новых 64х битных виндах бывают с ним проблемы и как бороться общего решения я не нашел), и из каждой формы справочника можно открыть форму свойств элемента.

Но форм в проекте всего 2,т.е. каждый раз открывая форму справочника, вы открываете экземпляр одной и тойже формы, но с разным источником данных.

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

Чтобы потыкать: запускаем форму frmMain и тыкаем. Местами есть нерабочий код(перемещение в другую группу, например, сделано, но если там есть дочерние элементы, по-моему -криво, но не суть). Чтобы переместить элемент из одной группы в другую в свойствах элемента нажимаем напротив группы элемента три точки, выбираем в открывшемся дереве(тоже, кстати, экземпляр) нужный элемент и нажимаем энтер.

p.s. Мета информация хранится в двух таблицах: r_forms и r_form_params.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725353
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин, цвета не для красоты (не только в смысле) - обратная сторона расположения кнопок на привычном месте и одинакового стиля- можно спутать что за форма-заголовки форм все равно никто не читает, поэтому формы разделяются по цветам-направлениям.
Также цветовой признак разделяет группы в форме по их действию. все таки разделить 137 элементов на форме чтобы их действие было понятно с 1-го раза непросто-цветовое оформление в том числе решает эту проблему.
И с кассиршей совершенно согласен, в том что тыкать постоянно в поля со списком, печатая в поиске, потом опять переходить с клавы на мышь- в течение нескольких часов ой как не айс-проверено на себе многократно.
Цвета я использую постоянно, в том числе и ядовитые (выбор цвета, его интенсивность имеет под собой обоснование), решение что лучше куча ячеек, надписей или выделение цветом сделано для себя давно и бесповоротно. именно на основе опыта работы как со своей нетленкой, так и со сторонними творениями.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725360
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что то там потеряно не открывает. но скажу сразу что с эвентами все хорошо пока у вас один модуль класса в коллекции - если таких модулей класса несколько, event в модуле вызова не различает с какого именно класса прилетает евент- поэтому для себя сделал вывод что лучше public sub объявлять в родительском модуле класса и засовывая в качестве аргумента признак (типа номера точки) - получаю все что нужно.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725368
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko... если таких модулей класса несколько, event в модуле вызова не различает с какого именно класса прилетает евент- ...
Да ладно...
Достаточно аргументом передать ссылку на Sender-а,
(если я правильно перевел цитату).
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725369
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleckoчто то там потеряно не открывает. но скажу сразу что с эвентами все хорошо пока у вас один модуль класса в коллекции - если таких модулей класса несколько, event в модуле вызова не различает с какого именно класса прилетает евент- поэтому для себя сделал вывод что лучше public sub объявлять в родительском модуле класса и засовывая в качестве аргумента признак (типа номера точки) - получаю все что нужно.

Возможно референсы: http://prntscr.com/lceyq8

С эвентами там все несколько прозрачнее(ссылка на форму, и через нее уже ловля всех эвентов).
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725373
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин... унифицированную форму справочника, без добавления кода, форм и так далее. ...
Засада, как всегда, скрывается в деталях.
Я отказался от полностью унифицированной формы по простой причине:
малейшая потребность в дополнительном контроле, кнопке, например,
выливается в кучу геморроя.
Всю типовую обработку унифицировал, но табачок врозь формочки разные.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725375
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PredeclaredОзверин... унифицированную форму справочника, без добавления кода, форм и так далее. ...
Засада, как всегда, скрывается в деталях.
Я отказался от полностью унифицированной формы по простой причине:
малейшая потребность в дополнительном контроле, кнопке, например,
выливается в кучу геморроя.
Всю типовую обработку унифицировал, но табачок врозь формочки разные.

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

Пример, есть общий для всех справочников класс clsRef и несколько разных форм frmRef1, frmRef2. У них общая логика построения деревьев, общая логика кнопок Добавить элемент или удалить. Весь этот код реализован в класс clsRef. Но вот в frmRef2 попросили добавить поиск по артиклу, кроме имени товара. Добавляем контрол в форму frmRef2 и реализуем весь функционал там.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725377
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared, вот так выглядит код в форме: )

http://prntscr.com/lcf7be

при том, что сама форма довольно богата функционалом http://prntscr.com/lcf7gb
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725380
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я скачивал, смотрел.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725383
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати говоря, кнопки удобней, кмк, унифицировать с MSComctlLib.Toolbar.
Не?
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725385
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PredeclaredКстати говоря, кнопки удобней, кмк, унифицировать с MSComctlLib.Toolbar.
Не?

Может быть, не пробовал ни разу. Делитесь ;)
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725389
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинВозможно референсы: http://prntscr.com/lceyq8
С эвентами там все несколько прозрачнее(ссылка на форму, и через нее уже ловля всех эвентов).
посылает без права переписки
PredeclaredДа ладно...
Достаточно аргументом передать ссылку на Sender-а,
(если я правильно перевел цитату).
Из нескольких одинаковых классов, сидящих в коллекции берется 1-й. А вот с Implement все хорошо.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725392
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko,

Да все там нормально, просто у Озверина или машина или офис 64, открой любой модуль, потом референсы и ищи строки с MISSING, отключи их и подключи тоже самое из system32, ну или найди где это у тебя лежит, странно что про инстансы мы знаем, а MISSING не замечаем...
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725393
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так запросто:
в описании сервисного класса:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
...
        Set tbar = frm.Toolbar1.Object
        With tbar
            .Appearance = ccFlat
            .AllowCustomize = False
            .BorderStyle = ccNone
            .ButtonHeight = 330
            .ButtonWidth = 945
            .Style = tbrFlat
            .TextAlignment = tbrTextAlignRight
            .Wrappable = True
        End With
    End With
...
    AddBtn 1, "Close", "Закрыть", 0, False, 2087
    AddBtn 2, "Save", "Сохранить", 0, True, 1907
    AddBtn 3, "Cancel", "Отмена", 0, True, 2087
...

Public Sub AddBtn(intIndex As Integer, strKey As String, strCaption As String, lngStyle As Long, ActiveEnable As Boolean, Optional FaceID As Long, Optional BeginGroupe As Boolean, Optional Visible As Boolean = True)
    Dim cbb As Office.CommandBarButton
    Dim btn As MSComctlLib.Button
    'попутно строим ситуационно зависимое контекстное меню
    Set cbb = cbar.Controls.Add(1, , , , True)
    With cbb
        .Caption = strCaption
        If FaceID > 0 Then .FaceID = FaceID
        .BeginGroup = BeginGroupe
    End With
    
    Set btn = tbar.Buttons.Add(intIndex, strKey, strCaption, lngStyle)
...
End Sub

Private Sub tbar_ButtonClick(ByVal Button As MSComctlLib.Button)
    ... обрабатываем по Select Case btn.Key
        Case Else
            frm.BtnClick btn -дергаем метод бэк модуля формы, вдруг были добавлены нестандартные кнопки
End Sub


Имеем возможность дернуть метод Public Sub AddBtn из бэк модуля формы для нестандартных хотелок (кнопок),
обрабатываем там-же:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Sub BtnClick(btn As MSComctlLib.Button)
'''Задействовать при добавлении кнопок
''    Select Case btn.Key
''        Case Is = "Service1"
''            MsgBox btn.Key
''        Case Is = "Copy"
''            MsgBox btn.Key
''    End Select
End Sub


если вкратце.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725394
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko... Из нескольких одинаковых классов, сидящих в коллекции берется 1-й...
Похоже нужен пример, иначе будем долго, бессмысленно и беспощадно... :)
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725395
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag..., а MISSING не замечаем...
Миссингов у меня нет, а ашипка есть.
Разбираться лень.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725396
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleckoИз нескольких одинаковых классов, сидящих в коллекции берется 1-й. А вот с Implement все хорошо.

Что-то я не понял.

Вот я получал ссылку на экземлпяр формы, получил с нее ссылку на контрол, подписался на событие OnClick и прописал свою логику. Где тут коллеция , имлемент и все такое?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private WithEvents m_appForm As Form   
Private WithEvents m_btnAddNew As CommandButton 

Set m_btnAddNew = m_appForm.Controls("btnAddNew")
m_btnAddNew.OnClick = "[Event Procedure]"


Private Sub m_btnAddNew_Click()
    m_logger.log "clsRefType.m_btnAddNew_Click"   
End Sub
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725397
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmagalecko,

Да все там нормально, просто у Озверина или машина или офис 64, открой любой модуль, потом референсы и ищи строки с MISSING, отключи их и подключи тоже самое из system32, ну или найди где это у тебя лежит, странно что про инстансы мы знаем, а MISSING не замечаем...

и то, и другое.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725399
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PredeclaredТак запросто:
в описании сервисного класса:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
...
        Set tbar = frm.Toolbar1.Object
        With tbar
            .Appearance = ccFlat
            .AllowCustomize = False
            .BorderStyle = ccNone
            .ButtonHeight = 330
            .ButtonWidth = 945
            .Style = tbrFlat
            .TextAlignment = tbrTextAlignRight
            .Wrappable = True
        End With
    End With
...
    AddBtn 1, "Close", "Закрыть", 0, False, 2087
    AddBtn 2, "Save", "Сохранить", 0, True, 1907
    AddBtn 3, "Cancel", "Отмена", 0, True, 2087
...

Public Sub AddBtn(intIndex As Integer, strKey As String, strCaption As String, lngStyle As Long, ActiveEnable As Boolean, Optional FaceID As Long, Optional BeginGroupe As Boolean, Optional Visible As Boolean = True)
    Dim cbb As Office.CommandBarButton
    Dim btn As MSComctlLib.Button
    'попутно строим ситуационно зависимое контекстное меню
    Set cbb = cbar.Controls.Add(1, , , , True)
    With cbb
        .Caption = strCaption
        If FaceID > 0 Then .FaceID = FaceID
        .BeginGroup = BeginGroupe
    End With
    
    Set btn = tbar.Buttons.Add(intIndex, strKey, strCaption, lngStyle)
...
End Sub

Private Sub tbar_ButtonClick(ByVal Button As MSComctlLib.Button)
    ... обрабатываем по Select Case btn.Key
        Case Else
            frm.BtnClick btn -дергаем метод бэк модуля формы, вдруг были добавлены нестандартные кнопки
End Sub


Имеем возможность дернуть метод Public Sub AddBtn из бэк модуля формы для нестандартных хотелок (кнопок),
обрабатываем там-же:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Sub BtnClick(btn As MSComctlLib.Button)
'''Задействовать при добавлении кнопок
''    Select Case btn.Key
''        Case Is = "Service1"
''            MsgBox btn.Key
''        Case Is = "Copy"
''            MsgBox btn.Key
''    End Select
End Sub


если вкратце.

по моему на события этого тулбара подписаться нельзя. Вообще в аксе подписаться на события активиксов нельзя же?
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725401
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин... по моему на события этого тулбара подписаться нельзя. ...
На его объект можно:
Set tbar = frm.Toolbar1.Object
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725402
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PredeclaredМиссингов у меня нет, а ашипка есть.
Разбираться лень.

а у меня пока миссинги не убрал было то же самое что у alecko, а как с миссингами разобрался, то повылазили ашипки про которые с самого начала предупреждал Озверин...
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725403
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, про декларацию забыл в листинге.
В области Declarations описания класса:
Код: vbnet
1.
Private WithEvents tbar As MSComctlLib.Toolbar
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725411
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Могу показаться циничным и старомодным, но вся эта ботва с полной унификацией форм нужна только для конторы, куда ты собираешься идти наемником, типа показать что ты неймоверно крут... а если работаешь сам, то об этих выкрутасах никто даже знать не будет (о том что они у тебя вообще реализованы), конечному пользователю нужна простая и надежная программа, которая выполняет заявленный функционал - всё... а с точки зрения разработки - выносить в общие модули общие процедуры и часто повторяющийся код - да, но формы предпочитаю делать независимы, меня это сильно раскрепощает в плане творчества, творить и постоянно думать о том, что и где ты при этом уже возможно сломал похоже на садо-мазо... возможно кто-то думает наоборот и он в своем роде тоже наверное прав, это уже как вера не переубедить...
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725452
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmagОзверин,

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


по-моему, рано или поздно к этой унификации и вынос инфомации в мета-информацию - приходят большинство проектов, у которых под 300 совокупных модулей, форм и т.д.
Сами классы вместо модулей - это способ организации кода, т.к. поиск ф-ии по всем модулям - то еще удовольствие. а вот поиск нужной ф-ии по специфичному классу - проще. Пример приведу: рано или поздно большой проект на аксе переживает время разделения кода на части, по сути -подключаемые библиотеки. Ты уже просто так не откроешь каждую, чтобы посмотреть, а какие у тебя там модули, чтобы нужный модуль открыть(нужный по имени) и перебрать там все доступные ф-ии. Тогда как с классами все проще: именуя их в одном стиле ты через отладку всегда можешь перебрать все его публичные методы.
Короче, как по мне, это просто необходимостью становится со временем, а не крутостью.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725472
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартная утилита сборки\выгрузки кода из ms access.
Выбираете путь "куда выгрузить", выбираете программу, из которой следует выгрузить код(в этой программе требуется таблица r_prog_info с единственным полем prog_id = 1(номер схемы, по которой вы потом будете собирать программу). В выпадающем списке автоматически выбрано All, вам остается в списке выбать <Все> и выгрузить код.

Загрузка аналогична.

Прототип на коленке, схема в ini файле, что-то может не работать - как обычно, ибо.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725511
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag, если база не загружается, это значит что выкидывает в окно приложения Акса
где тут референсы?
поискал пример с ивентами... рефакторинг кода вымывает всё неиспользуемое, разбирался с этим в октябре 15-го (по архиву пошарился)-кода рабочего нет - часть закомментирована, часть отсутствует-надо по новой лепить пример, тестить, чесгря ниохота - кто будет делать пусть имеет это ввиду да и все.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725515
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleckovmag, если база не загружается, это значит что выкидывает в окно приложения Акса
где тут референсы?
поискал пример с ивентами... рефакторинг кода вымывает всё неиспользуемое, разбирался с этим в октябре 15-го (по архиву пошарился)-кода рабочего нет - часть закомментирована, часть отсутствует-надо по новой лепить пример, тестить, чесгря ниохота - кто будет делать пусть имеет это ввиду да и все.

если это про мой код - то он рабочий в то мере, в которой описан. Это проблема с контролом деревье в винде, там с ним было много проблем, вплоть до того, что одно из обновлений семерки что то делало так, что контрол как-то блокировался на уровне винды.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725520
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин, до кода дело не доходит. как понимаю новый офис да ещё x64 мой старенький 07 не способен даже просто открыть.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725531
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko, вот исходник.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725595
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин, впечатляет, правда при импорте форм возникли проблемы Forms .
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725601
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko, на коленке же написано ;) Надо отлаживать.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725769
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не хочет поделиться меню билдерами под риббоны эти? А то я под новые эти ваши аксесы вообще ничего толком не делал.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39725799
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин, Игортан здесь расписывал, я использую замену лексем, те. сделал грубо говоря одну ленту, а в ней уже меняю/прячу кнопки, группы-здесь маленький кусочек ленты - лексема выглядит так {7}
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<commands>
       <command idMso="Help" enabled="false"/>
       <command idMso="WindowClose" enabled="false"/>
       <command idMso="WindowRestore" enabled="false"/>
       <command idMso="WindowMinimize" enabled="false"/>
       <command idMso="ApplicationOptionsDialog" enabled="false"/>
       <command idMso="FileExit" enabled="false"/>

 </commands>
 <ribbon startFromScratch="true">
  <tabs>
   <tab id="tabMain" label="Work"> 
    <group id="grpProjects" label="Работа с данными">
     <button id="cmdRaspr" label="Распределение" enabled="{7}" onAction="BUTTON_Ribbon" size="large" 
     imageMso="ShapesMoreShapes" supertip="Нужно распределить поставку?"/>
  
  <splitButton id="ManlWork" size="large" >
 <button id="buttonwork" imageMso="SharingOpenWssDiscussionList" label="Работа с базой" onAction="BUTTON_Ribbon" />
      <menu id="mnuManlWork" imageMso="SharingOpenWssDiscussionList" itemSize="large" >
       <button id="cmdHandMade"  label="Новая поставка" imageMso="SharingOpenWssDiscussionList" onAction="BUTTON_Ribbon"/>
      </menu>
     </splitButton>
 <splitButton id="SkladWork" size="large" enabled="{4}" >
 <button id="buttonSklad" imageMso="ViewsLayoutView" label="Склад" onAction="BUTTON_Ribbon" />
      <menu id="mnuSkladWork" imageMso="SharingOpenWssDiscussionList" itemSize="large" >
       <button id="SkladExpress"  label="Открыть склад" imageMso="BlogHomePage" onAction="BUTTON_Ribbon"/>

      </menu>
     </splitButton>
      </group>    
                                                                                                                                                            
   </tab>
  </tabs>
 <qat>
    <sharedControls>
        <control idMso="Undo" visible="true" insertBeforeMso="Redo" keytip="1" screentip="Отменить ввод"/> 
        <control idMso="Redo" visible="true" insertAfterMso="Undo" keytip="2" screentip="Вернуть"/> 
        <button idMso="FilePrintPreview" visible="true" insertAfterMso="Redo" keytip="3" screentip="Просмотр перед печатью"/> 
        <button idMso="PrintDialogAccess" visible="true" insertAfterMso="FilePrintPreview" keytip="4" screentip="Печать"/> 
        <button idMso="ExportExcel" visible="true" insertAfterMso="PrintDialogAccess" keytip="5" screentip="Экспорт в Excel"/> 
        <button idMso="FileSave" visible="true" insertAfterMso="ExportExcel" keytip="6" screentip="Сохранить в файл"/> 
        <button idMso="FileSendasAttachments" visible="true" insertAfterMso="FileSave" keytip="7" screentip="Электронная почта"/> 
    </sharedControls>
</qat>
 </ribbon>
</customUI>


код замены лексем в ленте,здесь же и код который вставляет измененный текст вместо текста ленты указанной по умолчанию
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Private Sub GotvRibbon()
' подготавливаем нашу ленту в конфигурации соответствующей зашедшему в программу, но элементы не прячем - просто делаем недоступными
Const IDZagotovka& = 5 ' на 5-строке наша заготовочка
Dim i%, RolsMass$(), Crayi%, rstRols As Recordset, str1$, str2$
RolsMass = Split(FromSprav(883), Gl0balDelimiter)
Crayi = UBound(RolsMass) + 1
Erase RolsMass
Set rstRols = CurrentDb.OpenRecordset("UsysRibbons", dbOpenTable)
rstRols.MoveFirst
Do Until rstRols.EOF
If rstRols.Fields("ID") = IDZagotovka Then Exit Do
rstRols.MoveNext
Loop

str1 = rstRols.Fields("RibbonXml").GetChunk(0, 32768)
For i = 1 To Crayi
str2 = Razrols(i)
str2 = LCase(str2)
   str1 = Replace(str1, "{" & i & "}", str2)
Next i
' если наш юзер не админ, спрячем все настройки
str2 = Upravladmins
str2 = LCase(str2)
str1 = Replace(str1, "{11}", str2)
' ----------------------------------------------------------------
' вставляем текст измененной ленты в ленту определенную по умолчанию
rstRols.MoveFirst
rstRols.Edit
    rstRols.Fields("RibbonXml") = ""
    rstRols.Fields("RibbonXml").AppendChunk str1
rstRols.Update
'Debug.Print str1
rstRols.Close
Set rstRols = Nothing
End Sub


минус такой конструкции - нужно перезагрузить Акс если другой пользователь, зато если пользователь работал в прошлый раз то код и не выполняется - лента уже для него сформирована.
p.s. в коде ссылки на другие процедуры - убирать не стал-получаем условия true/false и вставляем вместо лексем.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726081
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинНикто не хочет поделиться меню билдерами под риббоны эти?
Я вот этим пользуюсь: IDBE Ribbon Creator . Бесплатная версия позволяет создавать небольшие меню, их можно объединять уже руками. Я даже купил, доволен.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726164
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,

Я свой слепил, правда он на "полуавтоматическом" режиме, потому, если нужно, скину сюда. хотя бы для примера.

aleckoИгортан здесь расписывал,
Если вдруг про меня.
У меня действительно одна лента и я при старте бд что надо скрываю, что надо показываю.
Видимость и доступ настраивается по типам пользователей.
перезагрузка не нужна. Регулируется только видимость контролов.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726167
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИгортанMrShin,

Я свой слепил, правда он на "полуавтоматическом" режиме, потому, если нужно, скину сюда. хотя бы для примера.

aleckoИгортан здесь расписывал,
Если вдруг про меня.
У меня действительно одна лента и я при старте бд что надо скрываю, что надо показываю.
Видимость и доступ настраивается по типам пользователей.
перезагрузка не нужна. Регулируется только видимость контролов.

надо, конечно.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726168
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан, да и мне можно не только сохранить в таблице а сразу и применить. руки как -то не доходят-но помню была тема давно.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726218
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин

Сюда просто положить, много кусков архива будет.

alecko отправил на маил, у вас маил закрыт.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726282
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно выложить на файлообменник. Все, кому надо - заберут.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726295
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossМожно выложить на файлообменник. Все, кому надо - заберут.

я как-то предлагал сделать гитхаб наш ;) Через билдер можно туда исходники выгружать ...
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726342
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан, спасибо, получил.
WOW.
Конструктор шикарный, много нового узнал-Вы разобрались в этом на порядок глубже.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726344
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko, могли бы вы на какой-нить дропбокс выложить или на гуглдрайв и расшарить?
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726353
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так же хотелось бы посмотреть.

Дополнительно
Ribbon XML Editor - бесплатный.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726363
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossТак же хотелось бы посмотреть.

Дополнительно
Ribbon XML Editor - бесплатный.

До кучи, из этой же темы: https://www.ribboncreator2016.de/en/
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726400
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинJossТак же хотелось бы посмотреть.

Дополнительно
Ribbon XML Editor - бесплатный.

До кучи, из этой же темы: https://www.ribboncreator2016.de/en/ На предыдущей странице MrShin про него и писал
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726402
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Да там ничего такого особенного нет.
От внешних картинок отказался, есть возможность собрать ленту из минимально необходимых компонентов.
Нету настройки меню по кнопке меню(2007) или вкладки (2010 и выше)

логин – a (латинская)
Пароль – 111

Большой вес. Резал, резал...
оставил только конструктор и настройку
потом посмотрите – лента сохраняется в USys_Ribbons_Ready
настройки надписи, видимости и доступности в таблице Usys_Ribbon_TypeUser

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

расшарил папку.
https://yadi.sk/d/xasiU_z0e8Dhsw
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726407
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,

До кучи, реально используемый модуль для ленты

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
Option Compare Database
Option Explicit

Public myrib As IRibbonUI

'---------------------------------------------------------------------------------------
' Procedure : CreateRibbon
' Purpose   : присваивание ленты  USysRibbonsReady
'---------------------------------------------------------------------------------------
'
Function CreateRibbon()
Dim MyRecRibbons As DAO.Recordset

   On Error GoTo CreateRibbon_Error

Set MyRecRibbons = CurrentDb.OpenRecordset("SELECT * FROM USysRibbons WHERE Namber_Version>=" & Application_Version & "")

If Not MyRecRibbons.EOF Then
    MyRecRibbons.Edit
    If Developer = True Then
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=  >", "<ribbon startFromScratch=""false"" >")
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=""true"" >", "<ribbon startFromScratch=""false"" >")
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=""true"">", "<ribbon startFromScratch=""false"" >")
    Else
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=  >", "<ribbon startFromScratch=""true"" >")
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=""false"" >", "<ribbon startFromScratch=""true"" >")
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=""false"">", "<ribbon startFromScratch=""true"" >")
    End If
    MyRecRibbons.Update
    Application.LoadCustomUI MyRecRibbons!RibbonName, MyRecRibbons!RibbonBody
Else
    If Application_Version = 12 Then
        Application.LoadCustomUI "MyRibbon", "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui"" onLoad=""MyRibbonLoad""> <ribbon startFromScratch=""false""> </ribbon> </customUI>"
    ElseIf Application_Version >= 14 Then
        Application.LoadCustomUI "MyRibbon", "<customUI xmlns=""http://schemas.microsoft.com/office/2009/07/customui"" onLoad=""MyRibbonLoad""> <ribbon startFromScratch=""false""> </ribbon> </customUI>"
    Else
        GoTo CreateRibbon_Error
    End If
'    '    открытие ленты
'    DoCmd.ShowToolbar "Ribbon", acToolbarYes
End If
'    Debug.Print MyRecRibbons!RibbonBody
MyRecRibbons.Close
Set MyRecRibbons = Nothing

   On Error GoTo 0
   Exit Function

CreateRibbon_Error:
    MsgBox "Ошибка создания ленты программы! Проверьте правильный адрес файла данных.", , "Критическая ошибка(" & Err.Number & ")!"
    Call Outputs
End Function

Public Function MyRibbonLoad(ByRef tRibbonUI As IRibbonUI)
'MsgBox "инициирована"
    Set myrib = tRibbonUI
End Function

Public Function GroupMainOnActionCallBack()
'    открытие ленты
    DoCmd.ShowToolbar "Ribbon", acToolbarYes
    myrib.Invalidate
End Function

'---------------------------------------------------------------------------------------
' Procedure : Application_Version
' Purpose   : определяем текущую версию Access
'---------------------------------------------------------------------------------------
'
Public Function Application_Version() As Long
    On Error Resume Next
    Application_Version = CLng(Nz(Left([Application].[Version], 2), 14))
End Function

'---------------------------------------------------------------------------------------
' Procedure : getVisible
' Author    : IHAR
' Purpose   : ОТРАБОТКА ВИДИМОСТИ КОНТРОЛОВ ДЛЯ КОНКРЕТНОГО ТИПА ЮЗЕРА
'---------------------------------------------------------------------------------------
'
Public Function getVisible(Control As IRibbonControl, ByRef blVisibleVal)

   On Error Resume Next
   'On Error GoTo getVisible_Error

blVisibleVal = CBool(Nz(DLookup("Temp_Visible", "UsysSettingUserRibbon", "Id=""" & Control.Id & """"), 0))

   On Error GoTo 0
   Exit Function

getVisible_Error:
blVisibleVal = False
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure getVisible of Module Usys_Main_Function_Rib"
End Function

'---------------------------------------------------------------------------------------
' Procedure : AccessButtons
' Author    : Igor
' Purpose   : общая функция для изменения видимости кнопок в зависиимости от ситуации
'---------------------------------------------------------------------------------------
'
Public Sub getVisibleControls(lngTypeWork As Long, Optional strContr As String = "Tb36")
'lngTypeWork -тип работы:0=дефолтное, 1=закрываем, 2=открываем
'strContr - поиск контрола по id. Для старта форм - id приходит из ленты в параметрах функции
Dim er As Long ', n As String
Dim strMy As DAO.Recordset

   On Error Resume Next 'On Error GoTo AccessButtons_Error

er = 1
Set strMy = CurrentDb.OpenRecordset("SELECT * FROM UsysSettingUserRibbon WHERE ((Id)=""" & strContr & """)")
If Not strMy.EOF Then
er = 2
    strMy.Edit
    If lngTypeWork = 0 Then
        strMy!Temp_Visible = strMy!Temp_VisibleDef
    ElseIf lngTypeWork > 0 Then
        strMy!Temp_Visible = lngTypeWork - 1
    End If
    strMy.Update
'    n = strMy!id
End If

strMy.Close
If Not strMy Is Nothing Then Set strMy = Nothing

er = 3
myrib.InvalidateControl strContr

   On Error GoTo 0
   Exit Sub

AccessButtons_Error:
    If Not strMy Is Nothing Then Set strMy = Nothing
    If er = 1 Then
        MsgBox "Ошибка установки параметров доступа к функциям", , "Внимание!"
    ElseIf er = 2 Then
        MsgBox "Ошибка задания параметров доступа к функциям", , "Внимание!"
    ElseIf er = 3 Then
        MsgBox "ошибка обновления параметров доступа к функциям", , "Внимание!"
    Else
       MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AccessButtons of Form_OrdersLink"
    End If

End Sub

'---------------------------------------------------------------------------------------
' Procedure : getEnabled
' Author    : IHAR
' Purpose   : ОТРАБОТКА ДОСТУПНОСТИ КОНТРОЛОВ ДЛЯ КОНКРЕТНОГО ТИПА ЮЗЕРА
'---------------------------------------------------------------------------------------
'
Public Function getEnabled(Control As IRibbonControl, ByRef blVisibleVal)

   On Error Resume Next 'GoTo GetEnabledControls_Error

blVisibleVal = CBool(Nz(DLookup("Temp_Enabled", "UsysSettingUserRibbon", "Id=""" & Control.Id & """"), 0))

   On Error GoTo 0
   Exit Function

GetEnabledControls_Error:
blVisibleVal = False
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetEnabledControls of Module Usys_Main_Function_Rib"
End Function

'---------------------------------------------------------------------------------------
' Procedure : AccessButtons
' Author    : Igor
' Purpose   : общая функция для изменения видимости кнопок в зависиимости от ситуации
'---------------------------------------------------------------------------------------
'
Public Sub getEnabledControls(lngTypeWork As Long, Optional strContr As String = "Tb36")
'lngTypeWork -тип работы:0=дефолтное, 1=закрываем, 2=открываем
'strContr - поиск контрола по id. Для старта форм - id приходит из ленты в параметрах функции
Dim er As Long ', n As String
Dim strMy As DAO.Recordset

   On Error Resume Next '
   On Error GoTo AccessButtons_Error

er = 1
Set strMy = CurrentDb.OpenRecordset("SELECT * FROM UsysSettingUserRibbon WHERE ((Id)=""" & strContr & """)")
If Not strMy.EOF Then
er = 2
    strMy.Edit
    If lngTypeWork = 0 Then
        strMy!Temp_Enabled = strMy!Temp_EnabledDef
    ElseIf lngTypeWork > 0 Then
        strMy!Temp_Enabled = lngTypeWork - 1
    End If
    strMy.Update
'    n = strMy!id
End If

strMy.Close
If Not strMy Is Nothing Then Set strMy = Nothing

er = 3
myrib.InvalidateControl strContr

   On Error GoTo 0
   Exit Sub

AccessButtons_Error:
    If Not strMy Is Nothing Then Set strMy = Nothing
    If er = 1 Then
        MsgBox "Ошибка установки параметров доступа к функциям", , "Внимание!"
    ElseIf er = 2 Then
        MsgBox "Ошибка задания параметров доступа к функциям", , "Внимание!"
    ElseIf er = 3 Then
        MsgBox "ошибка обновления параметров доступа к функциям", , "Внимание!"
    Else
       MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AccessButtons of Form_OrdersLink"
    End If

End Sub
''''---------------------------------------------------------------------------------------
'''' Procedure : getSupertip
'''' Author    : IHAR
'''' Purpose   : выпадающая подсказка при наведении(comment)
''''---------------------------------------------------------------------------------------
''''
'''Function getSupertip(Control As IRibbonControl, ByRef Supertip)
'''Dim Id_Controls As Long
'''Dim MyRec As DAO.Recordset
'''
'''   On Error GoTo GetSupertip_Error
'''
''''Id_Controls = right(Control.id, Len(Control.id) - 2)
''''
''''Set MyRec = CurrentDb.OpenRecordset("SELECT DISTINCT Property_Value FROM Usys_Ribbon_Controls INNER JOIN (Usys_Ribbon_Control_Propertys INNER JOIN Usys_Ribbon_Control_Type_Propertys ON Usys_Ribbon_Control_Propertys.Id_Property = Usys_Ribbon_Control_Type_Propertys.Property_Type) ON Usys_Ribbon_Controls.Id_Control = Usys_Ribbon_Control_Type_Propertys.Control " & _
''''    "WHERE (((Control)=" & Id_Controls & ") AND ((Type_Control)=[Temp_Type]) AND ((Name_Property)=""getSupertip""))")
''''If Not MyRec.EOF Then
''''    Supertip = MyRec!Property_Value
''''Else
'''    Supertip = ""
''''End If
''''
''''Set MyRec = Nothing
'''
'''   On Error GoTo 0
'''   Exit Function
'''
'''GetSupertip_Error:
'''If Not MyRec Is Nothing Then Set MyRec = Nothing
'''    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetSupertip of Module Usys_Main_Function_Rib"
'''End Function
'''
''''---------------------------------------------------------------------------------------
'''' Procedure : getScreentip
'''' Author    : IHAR
'''' Purpose   : название выпадающей подсказки при наведении(comment)
''''---------------------------------------------------------------------------------------
''''
'''Function getScreentip(Control As IRibbonControl, ByRef Supertip)
'''Dim Id_Controls As Long
'''Dim MyRec As DAO.Recordset
'''
'''   On Error GoTo GetScreentip_Error
'''
''''Id_Controls = right(Control.id, Len(Control.id) - 2)
''''
''''Set MyRec = CurrentDb.OpenRecordset("SELECT DISTINCT Property_Value FROM Usys_Ribbon_Controls INNER JOIN (Usys_Ribbon_Control_Propertys INNER JOIN Usys_Ribbon_Control_Type_Propertys ON Usys_Ribbon_Control_Propertys.Id_Property = Usys_Ribbon_Control_Type_Propertys.Property_Type) ON Usys_Ribbon_Controls.Id_Control = Usys_Ribbon_Control_Type_Propertys.Control " & _
''''    "WHERE (((Control)=" & Id_Controls & ") AND ((Type_Control)=[Temp_Type]) AND ((Name_Property)=""getScreentip""))")
''''If Not MyRec.EOF Then
''''    Supertip = MyRec!Property_Value
''''Else
'''    Supertip = ""
''''End If
''''
''''Set MyRec = Nothing
'''
'''   On Error GoTo 0
'''   Exit Function
'''
'''GetScreentip_Error:
'''If Not MyRec Is Nothing Then Set MyRec = Nothing
'''    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetScreentip of Module Usys_Main_Function_Rib"
'''End Function

'---------------------------------------------------------------------------------------
' Procedure : getLabel
' Author    : IHAR
' Purpose   : УСТАНОВКА НАЗВАНИЙ(ПОДПИСЕЙ) КОНТРОЛОВ
'---------------------------------------------------------------------------------------
'
Public Sub getLabel(Control As IRibbonControl, ByRef label)

   On Error Resume Next 'GoTo GetNameInset_Error

label = Nz(DLookup("NameControl", "UsysSettingUserRibbon", "Id=""" & Control.Id & """"), "NOTHING")
'Debug.Print Control.id, label

   On Error GoTo 0
   Exit Sub

GetNameInset_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetNameInset of Module Usys_Main_Function_Rib"
End Sub

'---------------------------------------------------------------------------------------
' Procedure : NameButtons
' Author    : Igor
' Purpose   : общая функция для изменения названий контролов ленты для опред. ситуаций
'---------------------------------------------------------------------------------------
'
Public Sub NameButtons(strName As String, strButt As String)
Dim er As Long

   On Error Resume Next 'GoTo AccessButtons_Error

er = 2
'формирование временных данных для контекстной вкладки
CurrentProject.Connection.Execute ("UPDATE UsysSettingUserRibbon SET NameControl = """ & strName & """ WHERE (((Id) =""" & strButt & """))")

er = 3
myrib.InvalidateControl strButt

   On Error GoTo 0
   Exit Sub

AccessButtons_Error:

    If er = 1 Then
        MsgBox "Ошибка установки параметров доступа к функциям", , "Внимание!"
    ElseIf er = 2 Then
        MsgBox "Ошибка задания параметров доступа к функциям", , "Внимание!"
    ElseIf er = 3 Then
        MsgBox "ошибка обновления параметров доступа к функциям", , "Внимание!"
    Else
       MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AccessButtons of Form_OrdersLink"
    End If

End Sub




и модуль для вызова функций. Сюда направляются все вызовы. С ленты, кнопок, контекстного меню.
Для универсальности.
Из развивающегося проекта

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
Option Compare Database
Option Explicit

Public MyCountFrm As Long
Private NameActFrm As String
Private MyActiveReport As Report
Private MyActiveForm As Form

Public Function Calc()
Dim WshShell As Object
Dim stAppName As String

   On Error GoTo Calc_Error

stAppName = "%WINDIR%\System32\"

' Создаем ссылку на объект WscriptShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run stAppName & "calc.exe", 1, False

   On Error GoTo 0
   Exit Function

Calc_Error:
'    If LogError(Err.Number, Err.Description, Erl, "Calc", "Load", "") = True Then
'        Call ErrorLogFunct
'    Else
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Calc of Load", , "Error!"
'    End If

End Function

'---------------------------------------------------------------------------------------
' Procedure : OpenMyForm
' Author    : IHAR
' Purpose   : открытие формы
'---------------------------------------------------------------------------------------
Public Function OpenMyForm(NameForm As String, Optional MyContr As String = "") As Boolean

   On Error GoTo OpenMyForm_Error

    If IsFormLoaded(NameForm) = False Then
        DoCmd.OpenForm NameForm, acNormal, , , acFormEdit, acWindowNormal, MyContr
    Else
        DoCmd.Echo False
        DoCmd.Close acForm, NameForm, acSaveNo
        DoCmd.OpenForm NameForm, acNormal, , , acFormEdit, acWindowNormal, MyContr
        DoCmd.Echo True
    End If

   On Error GoTo 0
   Exit Function

OpenMyForm_Error:
DoCmd.Echo True
    If Err.Number <> 0 And Err.Number <> 2501 Then
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure OpenMyForm of Usys_Main_Function_Rib", , "Error!"
    End If
End Function

'---------------------------------------------------------------------------------------
' Procedure : AboutF
' Author    : IHAR
' Purpose   : Выход из приложения
'---------------------------------------------------------------------------------------
Public Function OutputDB()

   On Error Resume Next
DoCmd.Close acForm, "Password_entry"

End Function

'---------------------------------------------------------------------------------------
' Procedure : CloseActiveForm
' Author    : IHAR
' Purpose   : закрытие активной формы
'---------------------------------------------------------------------------------------
Public Function CloseActiveForm()
Dim i As Long
Dim MyHwnd As Long

   On Error GoTo CloseActiveForm_Error

MyHwnd = 0
NameActFrm = MyScreenActFrm(1, , MyHwnd)

If Right(NameActFrm, 3) = "All" Then
    Forms(NameActFrm).MyCloseActiveForm
Else
    Do While i < Forms.Count ' проверка всех форм и их id
        If Forms.Item(i).Name = NameActFrm Then
            If Forms.Item(i).Hwnd = MyHwnd Then
                Call Forms.Item(i).MyCloseActiveForm
                Exit Function
            End If
        End If
    i = i + 1
    Loop
End If

   On Error GoTo 0
   Exit Function

CloseActiveForm_Error:
    If Err.Number = 0 And Err.Number = 2501 Then
    Else
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure CloseActiveForm of Usys_Main_Function_Rib", , "Error!"
    End If

End Function

'---------------------------------------------------------------------------------------
' Procedure : ApplyFilter
' Author    : IHAR
' Purpose   : применить фильтр для вызывающей формы
'---------------------------------------------------------------------------------------
Public Function ApplyFilter() As Boolean

   On Error GoTo ApplyFilter_Error

NameActFrm = MyScreenActFrm(1)
Set MyActiveForm = Forms(NameActFrm)
'
With MyActiveForm.Form
    If .Dirty = True Then .Dirty = False
    
    If NameActFrm <> "SettingAll" Then
        With !sub_form.Form.MyClsSub
            .setFilterOn = True
            .myWhere (1)
        End With
    Else
        .Form.ApplyFilter
    End If
End With

If Not MyActiveForm Is Nothing Then Set MyActiveForm = Nothing

   On Error GoTo 0
   Exit Function

ApplyFilter_Error:
If Not MyActiveForm Is Nothing Then Set MyActiveForm = Nothing
    MsgBox "ПРИМЕНИТЬ ФИЛЬТР " & NameActFrm
End Function

'---------------------------------------------------------------------------------------
' Procedure : ShowAll
' Author    : IHAR
' Purpose   : снять фильтр с вызывающей формы
'---------------------------------------------------------------------------------------
Public Function ShowAll() As Boolean

   On Error GoTo ShowAll_Error

NameActFrm = MyScreenActFrm(1)
Set MyActiveForm = Forms(NameActFrm)
'
With MyActiveForm.Form
    If .Dirty = True Then .Dirty = False
    
    If NameActFrm <> "SettingAll" Then
        !sub_form.Form.MyClsSub.setFilterOn = False
        !sub_form.Form.MyClsSub.myWhere (0)
    Else
        .Form.ShowAll
    End If
End With

If Not MyActiveForm Is Nothing Then Set MyActiveForm = Nothing

   On Error GoTo 0
   Exit Function

ShowAll_Error:
If Not MyActiveForm Is Nothing Then Set MyActiveForm = Nothing
    MsgBox "ПОКАЗАТЬ ВСЕ " & NameActFrm
End Function

'---------------------------------------------------------------------------------------
' Procedure : RequeryTab
' Author    : IHAR
' Purpose   : обновление таблички вызывающей формы
'---------------------------------------------------------------------------------------
Public Function RequeryTab() As Boolean

   On Error GoTo RequeryTab_Error

NameActFrm = MyScreenActFrm(1)

If Right(NameActFrm, 3) = "All" Then
    If NameActFrm <> "SettingAll" Then
        Forms(NameActFrm).sub_form.Form.MyClsSub.CmdRecLine
    Else
        Call Forms(NameActFrm).CmdRecLine
    End If
End If
'    Forms(NameActFrm)(NameActFrm & "_sub").Form.MyClsSub.CmdRecLine

   On Error GoTo 0
   Exit Function

RequeryTab_Error:
  If Err.Number <> 0 And Err.Number <> 2501 Then
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure RequeryTab of Main_Function_Rib", , "Error!"
  End If

End Function

'---------------------------------------------------------------------------------------
' Procedure : AddLine
' Author    : IHAR
' Purpose   : добавить данные для вызывающей таблицы Control As IRibbonControl
'---------------------------------------------------------------------------------------
Public Function AddLine() As Boolean

   On Error GoTo AddLine_Error

NameActFrm = MyScreenActFrm(1)

If Right(NameActFrm, 3) <> "All" Then
    MsgBox "Open: " & NameActFrm
Else
    If NameActFrm <> "SettingAll" Then
        Forms(NameActFrm).sub_form.Form.MyClsSub.CmdAddLine
    Else
        Call Forms(NameActFrm).CmdAddLine
    End If
End If

   On Error GoTo 0
   Exit Function

AddLine_Error:
  If Err.Number <> 0 And Err.Number <> 2501 Then
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AddLine of Main_Function_Rib", , "Error!"
  End If

End Function

'---------------------------------------------------------------------------------------
' Procedure : EditLine
' Author    : IHAR
' Purpose   : изменить данные из вызывающей формы
'---------------------------------------------------------------------------------------
Public Function EditLine() As Boolean

   On Error GoTo EditLine_Error

NameActFrm = MyScreenActFrm(1)

If Right(NameActFrm, 3) = "All" Then
    If NameActFrm <> "SettingAll" Then
        Forms(NameActFrm).sub_form.Form.MyClsSub.CmdEditLine
    Else
        Call Forms(NameActFrm).CmdEditLine
    End If
End If

   On Error GoTo 0
   Exit Function

EditLine_Error:
  If Err.Number <> 0 And Err.Number <> 2501 Then
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure EditLine of Main_Function_Rib", , "Error!"
  End If
End Function

'---------------------------------------------------------------------------------------
' Procedure : DelLine
' Author    : IHAR
' Purpose   : удалить строку из вызывающей формы
'---------------------------------------------------------------------------------------
Public Function DelLine() As Boolean

   On Error GoTo DelLine_Error

NameActFrm = MyScreenActFrm(1)

If Right(NameActFrm, 3) = "All" Then
    If NameActFrm <> "SettingAll" Then
        Forms(NameActFrm).sub_form.Form.MyClsSub.CmdDelLine
    Else
        Call Forms(NameActFrm).CmdDelLine
    End If
End If

   On Error GoTo 0
   Exit Function

DelLine_Error:
  If Err.Number <> 0 And Err.Number <> 2501 Then
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure DelLine of Main_Function_Rib", , "Error!"
  End If
End Function

Public Function SendData() As Boolean
     Forms!MainAll!sub_form.Form.MyClsSub.SendMail
End Function

Public Function MainReport() As Boolean
    MsgBox "ВыводОтчетаОсновного"
'     call OpenMyForm(NameForm As String)
End Function

Public Function MainReportEx() As Boolean
    MsgBox "ЭкспортОтчетаОсновного"
'     call OpenMyForm(NameForm As String, Optional MyContr As String = "")
End Function

Public Function WorkerReport() As Boolean
'    MsgBox "ВыводОтчетаПоРаботникам"
     Call OpenMyForm("ReportSearch", "ReporWorker")
End Function

Public Function WorkerReportEx() As Boolean
'    MsgBox "ЭкспортОтчетаПоРаботникам"
     Call OpenMyForm("ReportSearchExp", "ReporWorker")
End Function

Public Function CustomerReport() As Boolean
    MsgBox "ВыводОтчетаПоКлиентам"
'     call OpenMyForm(NameForm As String, Optional MyContr As String = "")
End Function

Public Function CustomerReportEx() As Boolean
    MsgBox "ЭкспортОтчетаПоКлиентам"
'     call OpenMyForm(NameForm As String, Optional MyContr As String = "")
End Function


'''''---------------------------------------------------------------------------------------
''''' Procedure : ToPDF
''''' Author    : IHAR
''''' Purpose   : КОНВЕРТАЦИЯ В ПДФ
'''''---------------------------------------------------------------------------------------
''''Public Function ToPDF() As Boolean
''''Dim i As Long, intResult As Integer
''''Dim MyHwnd As Long, MyLngEr As Long
''''Dim MyFile As String, strPathPDF As String
''''
''''   On Error GoTo ToPDF_Error
''''
''''MyHwnd = 0
''''NameActFrm = MyScreenActFrm(1, , MyHwnd)
'''''Stop
''''Do While i < Reports.Count ' проверка всех форм и их id
''''    If Reports.Item(i).Name = NameActFrm Then
''''        If Reports.Item(i).Hwnd = MyHwnd Then
''''            NameActFrm = NameActFrm & "Print"
''''            'проверка наличия строки имени
''''            If NameActFrm = "" Then MyLngEr = "a"
''''
''''            '----Если есть документ с таким же названием и местом расположения, выдается сообщение о замене
''''NewStart:
''''            MyFile = Replace(strDB_MyPatch & "\Cases\", "\\", "\") & Reports.Item(i)!IdCase & "_ARB"
''''            ' искать файлы с таким именем и расширением не dotx
''''            strPathPDF = MyFile & "\AR1.pdf"
''''
''''            If Dir(strPathPDF) <> "" Then
''''                Select Case MsgBox("A document with this name already exists.  Do you want to replace it?", vbYesNo Or vbQuestion Or vbDefaultButton2, "Document Already Exists!")
''''                    Case vbYes
''''                        If FileUnlocked(strPathPDF) = True Then
''''                            Kill strPathPDF
''''                            GoTo NewStart
''''                        Else
''''                            MsgBox "Please close previously created PDF file, which you are attempting to re-create.", vbCritical, "Attention!"
''''                            GoTo CloseFunct
''''                        End If
''''                    Case vbNo 'открыть файл ...
''''                        intResult = ShellExecute(Application.hWndAccessApp, "open", strPathPDF, 0, 0, SW_SHOWNORMAL)
''''                        If intResult = 31 Then MsgBox "Unregistered file type", vbExclamation
''''                        GoTo CloseFunct
''''                End Select
''''            End If
''''
''''            ' работаем с копией отчета
''''            DoCmd.OpenReport NameActFrm, acViewPreview, , , acHidden, "SELECT * FROM ExportsTemp WHERE IdWin=" & Reports.Item(i)!IdWin
''''            'в пдф
''''            If SaveCreatePath(MyFile) = True Then
''''                Call CopyTemplateFiles(MyFile)
''''                If Len(strPathPDF) > 0 Then DoCmd.OutputTo acOutputReport, NameActFrm, acFormatPDF, strPathPDF, True
''''            End If
''''            'затем закрываем
''''            DoCmd.Close acReport, NameActFrm, acSaveNo
''''            Exit Function
''''        End If
''''    End If
''''i = i + 1
''''Loop
''''CloseFunct:
''''
''''   On Error GoTo 0
''''   Exit Function
''''
''''ToPDF_Error:
''''    If Err.Number = 0 And Err.Number = 2501 Then
''''    ElseIf LogError(Err.Number, Err.Description, Erl, "ToPDF", "Usys_Main_Function_Rib", "") = True Then
'''''        DoCmd.OpenForm "ErrorLog", acNormal, , , acFormReadOnly, acDialog
''''        Call ErrorLogFunct
''''    Else
''''        'MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure ToPDF of Usys_Main_Function_Rib", , "Error!"
''''    End If
''''
''''End Function


...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726417
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossДополнительно
Ribbon XML Editor - бесплатный.
В нем, кстати, и проверяю структуру после создания
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726434
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726438
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИгортанИгортан,

До кучи, реально используемый модуль для ленты

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
Option Compare Database
Option Explicit

Public myrib As IRibbonUI

'---------------------------------------------------------------------------------------
' Procedure : CreateRibbon
' Purpose   : присваивание ленты  USysRibbonsReady
'---------------------------------------------------------------------------------------
'
Function CreateRibbon()
Dim MyRecRibbons As DAO.Recordset

   On Error GoTo CreateRibbon_Error

Set MyRecRibbons = CurrentDb.OpenRecordset("SELECT * FROM USysRibbons WHERE Namber_Version>=" & Application_Version & "")

If Not MyRecRibbons.EOF Then
    MyRecRibbons.Edit
    If Developer = True Then
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=  >", "<ribbon startFromScratch=""false"" >")
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=""true"" >", "<ribbon startFromScratch=""false"" >")
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=""true"">", "<ribbon startFromScratch=""false"" >")
    Else
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=  >", "<ribbon startFromScratch=""true"" >")
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=""false"" >", "<ribbon startFromScratch=""true"" >")
        MyRecRibbons!RibbonBody = Replace(MyRecRibbons!RibbonBody, "<ribbon startFromScratch=""false"">", "<ribbon startFromScratch=""true"" >")
    End If
    MyRecRibbons.Update
    Application.LoadCustomUI MyRecRibbons!RibbonName, MyRecRibbons!RibbonBody
Else
    If Application_Version = 12 Then
        Application.LoadCustomUI "MyRibbon", "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui"" onLoad=""MyRibbonLoad""> <ribbon startFromScratch=""false""> </ribbon> </customUI>"
    ElseIf Application_Version >= 14 Then
        Application.LoadCustomUI "MyRibbon", "<customUI xmlns=""http://schemas.microsoft.com/office/2009/07/customui"" onLoad=""MyRibbonLoad""> <ribbon startFromScratch=""false""> </ribbon> </customUI>"
    Else
        GoTo CreateRibbon_Error
    End If
'    '    открытие ленты
'    DoCmd.ShowToolbar "Ribbon", acToolbarYes
End If
'    Debug.Print MyRecRibbons!RibbonBody
MyRecRibbons.Close
Set MyRecRibbons = Nothing

   On Error GoTo 0
   Exit Function

CreateRibbon_Error:
    MsgBox "Ошибка создания ленты программы! Проверьте правильный адрес файла данных.", , "Критическая ошибка(" & Err.Number & ")!"
    Call Outputs
End Function

Public Function MyRibbonLoad(ByRef tRibbonUI As IRibbonUI)
'MsgBox "инициирована"
    Set myrib = tRibbonUI
End Function

Public Function GroupMainOnActionCallBack()
'    открытие ленты
    DoCmd.ShowToolbar "Ribbon", acToolbarYes
    myrib.Invalidate
End Function

'---------------------------------------------------------------------------------------
' Procedure : Application_Version
' Purpose   : определяем текущую версию Access
'---------------------------------------------------------------------------------------
'
Public Function Application_Version() As Long
    On Error Resume Next
    Application_Version = CLng(Nz(Left([Application].[Version], 2), 14))
End Function

'---------------------------------------------------------------------------------------
' Procedure : getVisible
' Author    : IHAR
' Purpose   : ОТРАБОТКА ВИДИМОСТИ КОНТРОЛОВ ДЛЯ КОНКРЕТНОГО ТИПА ЮЗЕРА
'---------------------------------------------------------------------------------------
'
Public Function getVisible(Control As IRibbonControl, ByRef blVisibleVal)

   On Error Resume Next
   'On Error GoTo getVisible_Error

blVisibleVal = CBool(Nz(DLookup("Temp_Visible", "UsysSettingUserRibbon", "Id=""" & Control.Id & """"), 0))

   On Error GoTo 0
   Exit Function

getVisible_Error:
blVisibleVal = False
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure getVisible of Module Usys_Main_Function_Rib"
End Function

'---------------------------------------------------------------------------------------
' Procedure : AccessButtons
' Author    : Igor
' Purpose   : общая функция для изменения видимости кнопок в зависиимости от ситуации
'---------------------------------------------------------------------------------------
'
Public Sub getVisibleControls(lngTypeWork As Long, Optional strContr As String = "Tb36")
'lngTypeWork -тип работы:0=дефолтное, 1=закрываем, 2=открываем
'strContr - поиск контрола по id. Для старта форм - id приходит из ленты в параметрах функции
Dim er As Long ', n As String
Dim strMy As DAO.Recordset

   On Error Resume Next 'On Error GoTo AccessButtons_Error

er = 1
Set strMy = CurrentDb.OpenRecordset("SELECT * FROM UsysSettingUserRibbon WHERE ((Id)=""" & strContr & """)")
If Not strMy.EOF Then
er = 2
    strMy.Edit
    If lngTypeWork = 0 Then
        strMy!Temp_Visible = strMy!Temp_VisibleDef
    ElseIf lngTypeWork > 0 Then
        strMy!Temp_Visible = lngTypeWork - 1
    End If
    strMy.Update
'    n = strMy!id
End If

strMy.Close
If Not strMy Is Nothing Then Set strMy = Nothing

er = 3
myrib.InvalidateControl strContr

   On Error GoTo 0
   Exit Sub

AccessButtons_Error:
    If Not strMy Is Nothing Then Set strMy = Nothing
    If er = 1 Then
        MsgBox "Ошибка установки параметров доступа к функциям", , "Внимание!"
    ElseIf er = 2 Then
        MsgBox "Ошибка задания параметров доступа к функциям", , "Внимание!"
    ElseIf er = 3 Then
        MsgBox "ошибка обновления параметров доступа к функциям", , "Внимание!"
    Else
       MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AccessButtons of Form_OrdersLink"
    End If

End Sub

'---------------------------------------------------------------------------------------
' Procedure : getEnabled
' Author    : IHAR
' Purpose   : ОТРАБОТКА ДОСТУПНОСТИ КОНТРОЛОВ ДЛЯ КОНКРЕТНОГО ТИПА ЮЗЕРА
'---------------------------------------------------------------------------------------
'
Public Function getEnabled(Control As IRibbonControl, ByRef blVisibleVal)

   On Error Resume Next 'GoTo GetEnabledControls_Error

blVisibleVal = CBool(Nz(DLookup("Temp_Enabled", "UsysSettingUserRibbon", "Id=""" & Control.Id & """"), 0))

   On Error GoTo 0
   Exit Function

GetEnabledControls_Error:
blVisibleVal = False
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetEnabledControls of Module Usys_Main_Function_Rib"
End Function

'---------------------------------------------------------------------------------------
' Procedure : AccessButtons
' Author    : Igor
' Purpose   : общая функция для изменения видимости кнопок в зависиимости от ситуации
'---------------------------------------------------------------------------------------
'
Public Sub getEnabledControls(lngTypeWork As Long, Optional strContr As String = "Tb36")
'lngTypeWork -тип работы:0=дефолтное, 1=закрываем, 2=открываем
'strContr - поиск контрола по id. Для старта форм - id приходит из ленты в параметрах функции
Dim er As Long ', n As String
Dim strMy As DAO.Recordset

   On Error Resume Next '
   On Error GoTo AccessButtons_Error

er = 1
Set strMy = CurrentDb.OpenRecordset("SELECT * FROM UsysSettingUserRibbon WHERE ((Id)=""" & strContr & """)")
If Not strMy.EOF Then
er = 2
    strMy.Edit
    If lngTypeWork = 0 Then
        strMy!Temp_Enabled = strMy!Temp_EnabledDef
    ElseIf lngTypeWork > 0 Then
        strMy!Temp_Enabled = lngTypeWork - 1
    End If
    strMy.Update
'    n = strMy!id
End If

strMy.Close
If Not strMy Is Nothing Then Set strMy = Nothing

er = 3
myrib.InvalidateControl strContr

   On Error GoTo 0
   Exit Sub

AccessButtons_Error:
    If Not strMy Is Nothing Then Set strMy = Nothing
    If er = 1 Then
        MsgBox "Ошибка установки параметров доступа к функциям", , "Внимание!"
    ElseIf er = 2 Then
        MsgBox "Ошибка задания параметров доступа к функциям", , "Внимание!"
    ElseIf er = 3 Then
        MsgBox "ошибка обновления параметров доступа к функциям", , "Внимание!"
    Else
       MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AccessButtons of Form_OrdersLink"
    End If

End Sub
''''---------------------------------------------------------------------------------------
'''' Procedure : getSupertip
'''' Author    : IHAR
'''' Purpose   : выпадающая подсказка при наведении(comment)
''''---------------------------------------------------------------------------------------
''''
'''Function getSupertip(Control As IRibbonControl, ByRef Supertip)
'''Dim Id_Controls As Long
'''Dim MyRec As DAO.Recordset
'''
'''   On Error GoTo GetSupertip_Error
'''
''''Id_Controls = right(Control.id, Len(Control.id) - 2)
''''
''''Set MyRec = CurrentDb.OpenRecordset("SELECT DISTINCT Property_Value FROM Usys_Ribbon_Controls INNER JOIN (Usys_Ribbon_Control_Propertys INNER JOIN Usys_Ribbon_Control_Type_Propertys ON Usys_Ribbon_Control_Propertys.Id_Property = Usys_Ribbon_Control_Type_Propertys.Property_Type) ON Usys_Ribbon_Controls.Id_Control = Usys_Ribbon_Control_Type_Propertys.Control " & _
''''    "WHERE (((Control)=" & Id_Controls & ") AND ((Type_Control)=[Temp_Type]) AND ((Name_Property)=""getSupertip""))")
''''If Not MyRec.EOF Then
''''    Supertip = MyRec!Property_Value
''''Else
'''    Supertip = ""
''''End If
''''
''''Set MyRec = Nothing
'''
'''   On Error GoTo 0
'''   Exit Function
'''
'''GetSupertip_Error:
'''If Not MyRec Is Nothing Then Set MyRec = Nothing
'''    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetSupertip of Module Usys_Main_Function_Rib"
'''End Function
'''
''''---------------------------------------------------------------------------------------
'''' Procedure : getScreentip
'''' Author    : IHAR
'''' Purpose   : название выпадающей подсказки при наведении(comment)
''''---------------------------------------------------------------------------------------
''''
'''Function getScreentip(Control As IRibbonControl, ByRef Supertip)
'''Dim Id_Controls As Long
'''Dim MyRec As DAO.Recordset
'''
'''   On Error GoTo GetScreentip_Error
'''
''''Id_Controls = right(Control.id, Len(Control.id) - 2)
''''
''''Set MyRec = CurrentDb.OpenRecordset("SELECT DISTINCT Property_Value FROM Usys_Ribbon_Controls INNER JOIN (Usys_Ribbon_Control_Propertys INNER JOIN Usys_Ribbon_Control_Type_Propertys ON Usys_Ribbon_Control_Propertys.Id_Property = Usys_Ribbon_Control_Type_Propertys.Property_Type) ON Usys_Ribbon_Controls.Id_Control = Usys_Ribbon_Control_Type_Propertys.Control " & _
''''    "WHERE (((Control)=" & Id_Controls & ") AND ((Type_Control)=[Temp_Type]) AND ((Name_Property)=""getScreentip""))")
''''If Not MyRec.EOF Then
''''    Supertip = MyRec!Property_Value
''''Else
'''    Supertip = ""
''''End If
''''
''''Set MyRec = Nothing
'''
'''   On Error GoTo 0
'''   Exit Function
'''
'''GetScreentip_Error:
'''If Not MyRec Is Nothing Then Set MyRec = Nothing
'''    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetScreentip of Module Usys_Main_Function_Rib"
'''End Function

'---------------------------------------------------------------------------------------
' Procedure : getLabel
' Author    : IHAR
' Purpose   : УСТАНОВКА НАЗВАНИЙ(ПОДПИСЕЙ) КОНТРОЛОВ
'---------------------------------------------------------------------------------------
'
Public Sub getLabel(Control As IRibbonControl, ByRef label)

   On Error Resume Next 'GoTo GetNameInset_Error

label = Nz(DLookup("NameControl", "UsysSettingUserRibbon", "Id=""" & Control.Id & """"), "NOTHING")
'Debug.Print Control.id, label

   On Error GoTo 0
   Exit Sub

GetNameInset_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetNameInset of Module Usys_Main_Function_Rib"
End Sub

'---------------------------------------------------------------------------------------
' Procedure : NameButtons
' Author    : Igor
' Purpose   : общая функция для изменения названий контролов ленты для опред. ситуаций
'---------------------------------------------------------------------------------------
'
Public Sub NameButtons(strName As String, strButt As String)
Dim er As Long

   On Error Resume Next 'GoTo AccessButtons_Error

er = 2
'формирование временных данных для контекстной вкладки
CurrentProject.Connection.Execute ("UPDATE UsysSettingUserRibbon SET NameControl = """ & strName & """ WHERE (((Id) =""" & strButt & """))")

er = 3
myrib.InvalidateControl strButt

   On Error GoTo 0
   Exit Sub

AccessButtons_Error:

    If er = 1 Then
        MsgBox "Ошибка установки параметров доступа к функциям", , "Внимание!"
    ElseIf er = 2 Then
        MsgBox "Ошибка задания параметров доступа к функциям", , "Внимание!"
    ElseIf er = 3 Then
        MsgBox "ошибка обновления параметров доступа к функциям", , "Внимание!"
    Else
       MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AccessButtons of Form_OrdersLink"
    End If

End Sub




и модуль для вызова функций. Сюда направляются все вызовы. С ленты, кнопок, контекстного меню.
Для универсальности.
Из развивающегося проекта

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
Option Compare Database
Option Explicit

Public MyCountFrm As Long
Private NameActFrm As String
Private MyActiveReport As Report
Private MyActiveForm As Form

Public Function Calc()
Dim WshShell As Object
Dim stAppName As String

   On Error GoTo Calc_Error

stAppName = "%WINDIR%\System32\"

' Создаем ссылку на объект WscriptShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run stAppName & "calc.exe", 1, False

   On Error GoTo 0
   Exit Function

Calc_Error:
'    If LogError(Err.Number, Err.Description, Erl, "Calc", "Load", "") = True Then
'        Call ErrorLogFunct
'    Else
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Calc of Load", , "Error!"
'    End If

End Function

'---------------------------------------------------------------------------------------
' Procedure : OpenMyForm
' Author    : IHAR
' Purpose   : открытие формы
'---------------------------------------------------------------------------------------
Public Function OpenMyForm(NameForm As String, Optional MyContr As String = "") As Boolean

   On Error GoTo OpenMyForm_Error

    If IsFormLoaded(NameForm) = False Then
        DoCmd.OpenForm NameForm, acNormal, , , acFormEdit, acWindowNormal, MyContr
    Else
        DoCmd.Echo False
        DoCmd.Close acForm, NameForm, acSaveNo
        DoCmd.OpenForm NameForm, acNormal, , , acFormEdit, acWindowNormal, MyContr
        DoCmd.Echo True
    End If

   On Error GoTo 0
   Exit Function

OpenMyForm_Error:
DoCmd.Echo True
    If Err.Number <> 0 And Err.Number <> 2501 Then
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure OpenMyForm of Usys_Main_Function_Rib", , "Error!"
    End If
End Function

'---------------------------------------------------------------------------------------
' Procedure : AboutF
' Author    : IHAR
' Purpose   : Выход из приложения
'---------------------------------------------------------------------------------------
Public Function OutputDB()

   On Error Resume Next
DoCmd.Close acForm, "Password_entry"

End Function

'---------------------------------------------------------------------------------------
' Procedure : CloseActiveForm
' Author    : IHAR
' Purpose   : закрытие активной формы
'---------------------------------------------------------------------------------------
Public Function CloseActiveForm()
Dim i As Long
Dim MyHwnd As Long

   On Error GoTo CloseActiveForm_Error

MyHwnd = 0
NameActFrm = MyScreenActFrm(1, , MyHwnd)

If Right(NameActFrm, 3) = "All" Then
    Forms(NameActFrm).MyCloseActiveForm
Else
    Do While i < Forms.Count ' проверка всех форм и их id
        If Forms.Item(i).Name = NameActFrm Then
            If Forms.Item(i).Hwnd = MyHwnd Then
                Call Forms.Item(i).MyCloseActiveForm
                Exit Function
            End If
        End If
    i = i + 1
    Loop
End If

   On Error GoTo 0
   Exit Function

CloseActiveForm_Error:
    If Err.Number = 0 And Err.Number = 2501 Then
    Else
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure CloseActiveForm of Usys_Main_Function_Rib", , "Error!"
    End If

End Function

'---------------------------------------------------------------------------------------
' Procedure : ApplyFilter
' Author    : IHAR
' Purpose   : применить фильтр для вызывающей формы
'---------------------------------------------------------------------------------------
Public Function ApplyFilter() As Boolean

   On Error GoTo ApplyFilter_Error

NameActFrm = MyScreenActFrm(1)
Set MyActiveForm = Forms(NameActFrm)
'
With MyActiveForm.Form
    If .Dirty = True Then .Dirty = False
    
    If NameActFrm <> "SettingAll" Then
        With !sub_form.Form.MyClsSub
            .setFilterOn = True
            .myWhere (1)
        End With
    Else
        .Form.ApplyFilter
    End If
End With

If Not MyActiveForm Is Nothing Then Set MyActiveForm = Nothing

   On Error GoTo 0
   Exit Function

ApplyFilter_Error:
If Not MyActiveForm Is Nothing Then Set MyActiveForm = Nothing
    MsgBox "ПРИМЕНИТЬ ФИЛЬТР " & NameActFrm
End Function

'---------------------------------------------------------------------------------------
' Procedure : ShowAll
' Author    : IHAR
' Purpose   : снять фильтр с вызывающей формы
'---------------------------------------------------------------------------------------
Public Function ShowAll() As Boolean

   On Error GoTo ShowAll_Error

NameActFrm = MyScreenActFrm(1)
Set MyActiveForm = Forms(NameActFrm)
'
With MyActiveForm.Form
    If .Dirty = True Then .Dirty = False
    
    If NameActFrm <> "SettingAll" Then
        !sub_form.Form.MyClsSub.setFilterOn = False
        !sub_form.Form.MyClsSub.myWhere (0)
    Else
        .Form.ShowAll
    End If
End With

If Not MyActiveForm Is Nothing Then Set MyActiveForm = Nothing

   On Error GoTo 0
   Exit Function

ShowAll_Error:
If Not MyActiveForm Is Nothing Then Set MyActiveForm = Nothing
    MsgBox "ПОКАЗАТЬ ВСЕ " & NameActFrm
End Function

'---------------------------------------------------------------------------------------
' Procedure : RequeryTab
' Author    : IHAR
' Purpose   : обновление таблички вызывающей формы
'---------------------------------------------------------------------------------------
Public Function RequeryTab() As Boolean

   On Error GoTo RequeryTab_Error

NameActFrm = MyScreenActFrm(1)

If Right(NameActFrm, 3) = "All" Then
    If NameActFrm <> "SettingAll" Then
        Forms(NameActFrm).sub_form.Form.MyClsSub.CmdRecLine
    Else
        Call Forms(NameActFrm).CmdRecLine
    End If
End If
'    Forms(NameActFrm)(NameActFrm & "_sub").Form.MyClsSub.CmdRecLine

   On Error GoTo 0
   Exit Function

RequeryTab_Error:
  If Err.Number <> 0 And Err.Number <> 2501 Then
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure RequeryTab of Main_Function_Rib", , "Error!"
  End If

End Function

'---------------------------------------------------------------------------------------
' Procedure : AddLine
' Author    : IHAR
' Purpose   : добавить данные для вызывающей таблицы Control As IRibbonControl
'---------------------------------------------------------------------------------------
Public Function AddLine() As Boolean

   On Error GoTo AddLine_Error

NameActFrm = MyScreenActFrm(1)

If Right(NameActFrm, 3) <> "All" Then
    MsgBox "Open: " & NameActFrm
Else
    If NameActFrm <> "SettingAll" Then
        Forms(NameActFrm).sub_form.Form.MyClsSub.CmdAddLine
    Else
        Call Forms(NameActFrm).CmdAddLine
    End If
End If

   On Error GoTo 0
   Exit Function

AddLine_Error:
  If Err.Number <> 0 And Err.Number <> 2501 Then
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure AddLine of Main_Function_Rib", , "Error!"
  End If

End Function

'---------------------------------------------------------------------------------------
' Procedure : EditLine
' Author    : IHAR
' Purpose   : изменить данные из вызывающей формы
'---------------------------------------------------------------------------------------
Public Function EditLine() As Boolean

   On Error GoTo EditLine_Error

NameActFrm = MyScreenActFrm(1)

If Right(NameActFrm, 3) = "All" Then
    If NameActFrm <> "SettingAll" Then
        Forms(NameActFrm).sub_form.Form.MyClsSub.CmdEditLine
    Else
        Call Forms(NameActFrm).CmdEditLine
    End If
End If

   On Error GoTo 0
   Exit Function

EditLine_Error:
  If Err.Number <> 0 And Err.Number <> 2501 Then
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure EditLine of Main_Function_Rib", , "Error!"
  End If
End Function

'---------------------------------------------------------------------------------------
' Procedure : DelLine
' Author    : IHAR
' Purpose   : удалить строку из вызывающей формы
'---------------------------------------------------------------------------------------
Public Function DelLine() As Boolean

   On Error GoTo DelLine_Error

NameActFrm = MyScreenActFrm(1)

If Right(NameActFrm, 3) = "All" Then
    If NameActFrm <> "SettingAll" Then
        Forms(NameActFrm).sub_form.Form.MyClsSub.CmdDelLine
    Else
        Call Forms(NameActFrm).CmdDelLine
    End If
End If

   On Error GoTo 0
   Exit Function

DelLine_Error:
  If Err.Number <> 0 And Err.Number <> 2501 Then
    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure DelLine of Main_Function_Rib", , "Error!"
  End If
End Function

Public Function SendData() As Boolean
     Forms!MainAll!sub_form.Form.MyClsSub.SendMail
End Function

Public Function MainReport() As Boolean
    MsgBox "ВыводОтчетаОсновного"
'     call OpenMyForm(NameForm As String)
End Function

Public Function MainReportEx() As Boolean
    MsgBox "ЭкспортОтчетаОсновного"
'     call OpenMyForm(NameForm As String, Optional MyContr As String = "")
End Function

Public Function WorkerReport() As Boolean
'    MsgBox "ВыводОтчетаПоРаботникам"
     Call OpenMyForm("ReportSearch", "ReporWorker")
End Function

Public Function WorkerReportEx() As Boolean
'    MsgBox "ЭкспортОтчетаПоРаботникам"
     Call OpenMyForm("ReportSearchExp", "ReporWorker")
End Function

Public Function CustomerReport() As Boolean
    MsgBox "ВыводОтчетаПоКлиентам"
'     call OpenMyForm(NameForm As String, Optional MyContr As String = "")
End Function

Public Function CustomerReportEx() As Boolean
    MsgBox "ЭкспортОтчетаПоКлиентам"
'     call OpenMyForm(NameForm As String, Optional MyContr As String = "")
End Function


'''''---------------------------------------------------------------------------------------
''''' Procedure : ToPDF
''''' Author    : IHAR
''''' Purpose   : КОНВЕРТАЦИЯ В ПДФ
'''''---------------------------------------------------------------------------------------
''''Public Function ToPDF() As Boolean
''''Dim i As Long, intResult As Integer
''''Dim MyHwnd As Long, MyLngEr As Long
''''Dim MyFile As String, strPathPDF As String
''''
''''   On Error GoTo ToPDF_Error
''''
''''MyHwnd = 0
''''NameActFrm = MyScreenActFrm(1, , MyHwnd)
'''''Stop
''''Do While i < Reports.Count ' проверка всех форм и их id
''''    If Reports.Item(i).Name = NameActFrm Then
''''        If Reports.Item(i).Hwnd = MyHwnd Then
''''            NameActFrm = NameActFrm & "Print"
''''            'проверка наличия строки имени
''''            If NameActFrm = "" Then MyLngEr = "a"
''''
''''            '----Если есть документ с таким же названием и местом расположения, выдается сообщение о замене
''''NewStart:
''''            MyFile = Replace(strDB_MyPatch & "\Cases\", "\\", "\") & Reports.Item(i)!IdCase & "_ARB"
''''            ' искать файлы с таким именем и расширением не dotx
''''            strPathPDF = MyFile & "\AR1.pdf"
''''
''''            If Dir(strPathPDF) <> "" Then
''''                Select Case MsgBox("A document with this name already exists.  Do you want to replace it?", vbYesNo Or vbQuestion Or vbDefaultButton2, "Document Already Exists!")
''''                    Case vbYes
''''                        If FileUnlocked(strPathPDF) = True Then
''''                            Kill strPathPDF
''''                            GoTo NewStart
''''                        Else
''''                            MsgBox "Please close previously created PDF file, which you are attempting to re-create.", vbCritical, "Attention!"
''''                            GoTo CloseFunct
''''                        End If
''''                    Case vbNo 'открыть файл ...
''''                        intResult = ShellExecute(Application.hWndAccessApp, "open", strPathPDF, 0, 0, SW_SHOWNORMAL)
''''                        If intResult = 31 Then MsgBox "Unregistered file type", vbExclamation
''''                        GoTo CloseFunct
''''                End Select
''''            End If
''''
''''            ' работаем с копией отчета
''''            DoCmd.OpenReport NameActFrm, acViewPreview, , , acHidden, "SELECT * FROM ExportsTemp WHERE IdWin=" & Reports.Item(i)!IdWin
''''            'в пдф
''''            If SaveCreatePath(MyFile) = True Then
''''                Call CopyTemplateFiles(MyFile)
''''                If Len(strPathPDF) > 0 Then DoCmd.OutputTo acOutputReport, NameActFrm, acFormatPDF, strPathPDF, True
''''            End If
''''            'затем закрываем
''''            DoCmd.Close acReport, NameActFrm, acSaveNo
''''            Exit Function
''''        End If
''''    End If
''''i = i + 1
''''Loop
''''CloseFunct:
''''
''''   On Error GoTo 0
''''   Exit Function
''''
''''ToPDF_Error:
''''    If Err.Number = 0 And Err.Number = 2501 Then
''''    ElseIf LogError(Err.Number, Err.Description, Erl, "ToPDF", "Usys_Main_Function_Rib", "") = True Then
'''''        DoCmd.OpenForm "ErrorLog", acNormal, , , acFormReadOnly, acDialog
''''        Call ErrorLogFunct
''''    Else
''''        'MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure ToPDF of Usys_Main_Function_Rib", , "Error!"
''''    End If
''''
''''End Function




круто, спасибо.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726467
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss Ribbon XML Editor - бесплатный.
там есть только одна маленькая проблема, не помню точно, но у себя вроде это решил ибо не попадаю на нее.
Нет проверки на взаимоисключающие команды.
Типа getLabel и Label.

При нахождении их обоих для одного контрола не бьет ошибку.

А так, хорошая вещь. Видно все нутро, но для конструирования, нужны знания.
Если нужно, скину ссыль на книгу по риббон 2007, правда eng.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726534
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут если у кого пример с деревьями не открывался только из-за контрола дерева, у меня заработало на работе так:


У кого не работает пример с деревом:

1. Копируем библиотеку отсюда: https://drive.google.com/file/d/1Qhe20fXbjKW6G-A5rMnnDq8y0a5ODq6c/view?usp=sharing
2. Копируем себе куда-нибудь в папку(лучше, наверное, не заменять существующую библиотеку)
3. Регистрируем ее regsvr32.exe путь_к_файлу (лучше под админом, конечно)
4. Заходим в проект, старую либо отвязыем(Microsoft Common Control)
5. Новую привязываем
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726542
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,

Господа, перестарался резать...
новый ссыль на полную версию, раз пошла такая пьянка
https://yadi.sk/d/RyQbKKjF2D7wwQ
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39726794
Фотография Лапух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko...оставим тот топик Лапуху...
Меня, - Спящего будить?
Вы точно этого возжаждали, яко бы бессмертные и бесстрашные типа бОГИ?
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39727970
nikolay_magagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Завершающей ситуацией любой программы для пользователя является отчет. Отчет пользователя включает в себя обычно очень много итоговой информации по определенному шаблону. Иногда возникает необходимость увидеть часть информации. Для этой цели создается новый отчет или создается дерево для перехода на формы с данной информацией с применением дополнительных фильтров.
Я попытался совместить все это в отчетах.
1) Дерево – осуществляются переходы по отчетам в сторону более подробной информации. Например отчет отражает данные по отделам организации. Переход в следующий отчет отражает выбранный отдел с ФИО сотрудников.
2) Фильтры – при переходе автоматически задается основной фильтр.
3) Визуализация – все видно крупно на весь экран и не надо всматриваться в мелкий список дерева. Отражается лишь та информация с которой работаешь.
4) Неперегруженость информации в формах – в форме отражается информация только по таблице. Например из отчета по отделам организации выходишь на форму по созданию новой записи отдела. Из формы по сотрудникам на новую запись по сотрудникам и по желанию на изменение записи по выбранному отделу.
Единственно очень сложно понять наиболее лучший вид перехода.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39728550
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikolay_magagin, так а сама попытка где?
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39730802
nikolay_magagin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Грубо , примерно так.
...
Рейтинг: 0 / 0
Делимся нашими наработками?
    #39739372
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko динамически изменяемые формы - да, думаю что стоит рассказать о своем подходе (но это ж надо оформить и код и описание), а вот надо ли оно кому-это вопрос.
запилил! , ну кому надо те наверное и так в курсе, однако галочку что выполнил поставить нужно...
...
Рейтинг: 0 / 0
72 сообщений из 72, показаны все 3 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Делимся нашими наработками?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]