powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Нужен совет по работе с подчиненными формами.
21 сообщений из 21, страница 1 из 1
Нужен совет по работе с подчиненными формами.
    #39900675
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Встретилась задача: есть АРМ на Access, необходимо добавить в него функционал, который по выбору значения из combobox "создаст" новый интерфейс для ручного ввода значений. Условно говоря, если выбрано первое значение из списка, то в подчиненной форме должно создаваться N'ое количество label и combobox на каждый label с значениями "Плохо/Хорошо", количество и текст label берутся из результатов вопроса; если выбрано второе значение из списка, то необходимо в подчиненной форме создать N/4 label и combobox.
Пол дня сегодня на реализацию потратил, ума не приложу как это сделать.
ЗыСы: с Access и VBA на Вы ;)
ЗыСыЗыСы: Или не подчиненные формы?
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900683
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen, может напишешь что хочешь сделать, а не как - какая задача?
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900712
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen, самое простое это создать 2 формы, которые используются в качестве подчиненных и по выбору в комбобоксе менять источник
(сам таким не пользуюсь так что накидал только эскиз - могут быть вариации)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
' в шапке модуля
Private sfrm1 as form

Private sub combo1_afterupdate ()
Dim sform As subform 
Set sform = me.Controls("sform1") ' это контрол-контейнер подчиненной формы
 With sform
if  me.combo1=1 then
    .BorderStyle = 1 ' это хрень какая-то обычно граница такая и есть- показано просто что менять можно и оформление
    .SourceObject = "subfrm1" ' форма 1
else
    .BorderStyle = 2' тип того
.SourceObject = "subfrm2" ' форма2
end if
    Set sfrm1 = .Form - это форма которая находится в контейнере-источнике
 End With
End sub


может requery надо -надо посмотреть.

можно оформить на одной и по выбору в комбобоксе скрывать/открывать поля и менять caption меток, но кодить намного дольше.
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900718
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург, хочу средствами VBA создать основную и подчиненную ей формы, при этом, по изменению основный формы должен будет изменяться набор и порядок контролов подчиненной.
Пока способов реализации на ум пришло 2:
1) каждый раз при изменении в основной пересоздавать интерфейс в подчиненной;
2) создать несколько заготовок исходя из вариантов выбора пользователя, и в основной форме открывать их как подчиненные.

В первом случае Access ругается на то, что форма при создании в ней элементов должна находится в режиме конструктора, а как, если она уже открыта в основной и с ней велась работа?
Во втором проблема та же но с основной, и не непонятно как программно вставить подчиненную форму (гугл чет молчит).
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900719
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko, проще всего Tab с двумя вкладками. Но тут самый главный вопрос - зачем это городится)
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900721
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen
хочу средствами VBA создать основную и подчиненную ей формы
Так по-нормальному в Access не делают
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900728
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург
mozgen
хочу средствами VBA создать основную и подчиненную ей формы
Так по-нормальному в Access не делают


Почему?
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900734
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen
Почему?
Потому
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900735
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alecko, Спасибо рабочая мысль ;)

Ругается на
Код: vbnet
1.
.SourceObject = "subfrm1" 

- "Введенное значение не подходит для данного свойства"
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900737
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панург
mozgen
Почему?
Потому


Аргументированно, блин))
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900741
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen, я тебя тоже спрашивал и ответа не увидел.
А по поводу создания форм в Access можешь сам посмотреть насколько принято создавать формы - CreateForm . За без малого 20 лет 47 тем.
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900786
Фотография Лапух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen
...Почему?...

Панург
...Потому...

Может всё таки наконец стоит строго спросить с разработчиков - Access, почему это они неудослужились предусмотреть Вашу хотелку?
Кстати, а в какой из программ такое возможно?
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900796
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen,
subfrm1, subfrm2 должны быть созданы
у контрлов могут быть другие имена.
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900821
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alecko,

mozgenРугается на
.SourceObject = "subfrm1"
- "Введенное значение не подходит для данного свойства"

Это был какой-то баг. после перезапуска приложения ошибка пропала.

В общем и целом получилась такое:

Код: 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.
Private sfrm1 As Form

Private Sub cmbControlMode_AfterUpdate()
Dim controlModeIndex As Integer
With cmbControlMode
    Select Case controlModeIndex
       Case 0 '100%
         frmCreateControl_100
       Case 1 '20%
         frmCreateControl_20
       Case 2 'missing
         MsgBox (.Value)
     End Select
End With
End Sub

Sub frmCreateControl_100()
Dim subForm As subForm
Set subForm = Me.Controls("sform1")
With subForm
    .SourceObject = "frmInputControl_100"
    Set sfrm1 = .Form
End With
Me.Refresh
End Sub

Sub frmCreateControl_20()
Dim subForm As subForm
Set subForm = Me.Controls("sform1")
With subForm
    .SourceObject = "frmInputControl_20"
    Set sfrm1 = .Form
End With
End Sub




Формы созданы (frmInputControl_100, frmInputControl_20), формы разные, сам код отрабатывает без ошибок, но в основной форме отображается только "frmInputControl_100", причем без разницы какое значение из cmbControlMode выбирать. В чем может быть загвоздка? Может как-то принудительно обновлять нужно? хотя обновляется вроде..

И, честно говоря, aleckoSet sfrm1 = .Form - это форма которая находится в контейнере-источнике вот это не совсем понял. Можете подробнее разъяснить этот момент?
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900842
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alecko, дико извиняюсь, затупил. Указал переменную, которую использовал ранее, не controlModeIndex а cmbControlMode.ListIndex, конечно.

Спасибо, все работает, все отлично!
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39900854
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen
вот это не совсем понял. Можете подробнее разъяснить этот момент?

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

Код: 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.
Private Sub cmbControlMode_AfterUpdate()
Dim  str$
With cmbControlMode
    Select Case .value
       Case 1 '100%
        str="frmInputControl_100"
       Case 2 '20%
         str="frmInputControl_20"
       Case else 'missing
         MsgBox (.Value)
goto ex1
     End Select
End With
 frmCreateControl_100 str
ex1:
End Sub
Sub frmCreateControl_100(str$)
Dim subForm As subForm
Set subForm = Me.Controls("sform1")
if  not sfrm1 is nothing then set sfrm1 =nothing
With subForm
    .SourceObject = str
    Set sfrm1 = .Form
End With
Me.Refresh
End Sub

...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39901043
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alecko, Понял, спасибо =)
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39901342
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen
..если выбрано первое значение из списка, то в подчиненной форме должно создаваться N'ое количество label и combobox на каждый label с значениями "Плохо/Хорошо"...
А как у Вас организовано хранение данных? Предлагаю 1 таблицу с N полей,которые могут содержать пустые значения.Поля на форме разместить накладывая друг на друга, надписи так же или одну меняя в ней текст в зависимости от выбора в Combo и управляя visible полей,отображая нужные и скрывая не нужные.
данный способ вполне приемлем при небольшом количестве полей-особенно если надо скрыть\отобразить только часть полей(сколько их у Вас?), а остальные присутствуют всегда
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39901377
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39902317
mozgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdku, тут все немного сложней. Вообще, в моем случае access используется не как БД, а как UI. Сама БД крутится на оракле, с которым у аксеса есть ряд связанных таблиц. Не спрашиваете почему это так, пожалуйста. Это решение уже есть, есть давно, и живем мы с тем, с чем имеем =)
В рамках описанной здесь задачи все subForm формируются на основании довольно сложных выборок и имеют разный функционал. Количество элементов управления в которых может варьироваться от 3 до нескольких десятков (предположительно, надеюсь больше не будет). Соответственно и количество и наборы данных во всех лейблах, комбобоксах и пр. могут, и будут отличатся.
В моей реализации это выглядит примерно таким образом: есть пачка заготовленных заранее форм в которых "жестко" прописаны все "стационарные" элементы управления, а в событии Form_Open алгоритм создания "динамических" элементов. Эти формы далее будут использоваться как подчиненные. В основной форме по событию cmb_AfterUpdate происходит изменение источника для элемента subForm на нужную форму, а в месте с тем в нужную форму передаются параметры по которым отработают все запросы этой подформы и сформируется нужный интерфейс. Таким образом метод предложенный alecko мне более чем подошел.
...
Рейтинг: 0 / 0
Нужен совет по работе с подчиненными формами.
    #39902833
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mozgen, теоретически это решение правильное. но практически нереальное, потому что при создании элементов управления на форме аксесс увеличивает счетчик и дойдя до ~ 950 -го номера он на этой форме создавать больше элементы управления не даст (счетчик очевидно уменьшить не удастся). Поэтому динамическое создание элементов управления на форме в Аксесс кроме как в период конструирования - очень плохая идея. Ввиду описанного выше применяются различные решения, отличные от создания элементов управления. Одним из способов является например использование одной формы, которая при этом может принимать неограниченное количество различных статических состояний (инстансов), которые хранятся в таблице (свойства элементов - расположение, формат и пр.).
даже статью написал
Сейчас описанный способ конечно сильно обновился, но принципиально не изменился
Естественно каждый способ имеет как плюсы так и минусы, в описанном случае это избыточное наличие элементов, в большинстве форм и т.п.
есть динамическое управление расположением - отслеживаем offset по горизонтали и вертикали.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Нужен совет по работе с подчиненными формами.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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