С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
4 / 1 / 0
Регистрация: 01.03.2016
Сообщений: 17
1

Изменение расположения подчиненных форм

13.04.2016, 21:29. Показов 1391. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всех приветствую и прошу помощи. Есть форма с полем для поиска и кнопочка "искать". Чуть ниже 8 табличных форм, друг под другом в один столбец. Инфа разная, но некоторые поля совпадают, по ним и ищем, высота каждой табличной формы одинаковая. Поиск организован через запросы, то есть 8 отдельных запросов висит на кнопочке. Всё работает. В vba не силён, первый опыт. Если ничего не находит, меняю SourceObject на формочку с надписью "Нет данных"
Вопрос:
Хочу скрывать подчиненые формы, если в результате запроса они оказываются пустыми. А формы с результатами сдвигать вверх, чтобы не было пустоты. Если бы форм было 2, то можно написать пару If-Else и Move-ом двигать.
А как быть когда их 8? Как определить что, к примеру, 2я, 5я и 6я сейчас пустые и надо сдвинуть 3-8 вверх на одну форму и ещё 7-8 вверх на 2....
Высоту можно вычислить. Скрывать/показывать формы тоже научился, проверять пустой запрос или нет тоже. А вот с решением основной задачи никак... Чтоб написать код, сначала надо прикинуть как это работать будет, а я что-то не представляю. Если сделать это, не перебрав вречную все возможные комбинации невозможно, то оставим эту затею. Формочка с надписью "Нет данных" тоже красиво смотрится.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2016, 21:29
Ответы с готовыми решениями:

Серия подчиненных форм
Доброго времени суток. Суть вопроса - есть автоматически сгенерированная форма (обозначим ее...

Несколько подчиненных форм
Здравствуйте! Я совсем чайник, впервые делаю базу с несколькими подчиненными таблицами (точнее,...

Списки подчиненных форм
Доброго времени суток Нужна помощь по полям со списками в подчиненных формах Основная форма -...

Не работает выбор подчиненных форм
Доброе время суток уважаемое сообщество Не работает выбор подчиненных форм ,поиск ответа на этот...

4
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
13.04.2016, 23:43 2
Лучший ответ Сообщение было отмечено franky_goa как решение

Решение

Если очень хочется можно подвинуть значимые формы, а пустые скрыть.
Предположим, что в "пустой" форме рекордсет EOF и будем проверять на пустоту этим способом. Понадобятся 3 константы: топ самой верхней формы, расстояние между формами и высота надписи формы. Третья константа нужна если надписи к подформам сверху подформ. Также нужны 2 массива: массив имен подформ и массив имен их подписей. Теперь можем написать процедуру скрывающую пустые подформы и сдвигающую непустые
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub MoveSubForm()
    Dim top1, delta, hLbl
    Dim mSubFrm, mLblSub
    Dim i, topCur
    
    top1 = 1200   'топ самой верхней подформы в твипах. 1 см=567 твип
    delta = 500   'расстояние между подформами по высоте (низ верхней-верх нижней)
    hLbl = 320    'высота подписи подформ
    
    n = 0: topCur = top1 - delta
    mSubFrm = Array("ИмяСуб1", "ИмяСуб2", ..., "ИмяСуб8")             'Массив имен подформ
    mLblSub = Array("ИмяПодписи1", "ИмяПодписи2", ..., "ИмяПодписи8") 'Массив имен подписей
    For i = 0 To UBound(mSubFrm)
        If Me(mSubFrm(i)).Form.Recordset.EOF Then           'Проверка на наличие записей в подформе
            Me(mSubFrm(i)).Visible = False                  'Скрываем пустые
        Else
            Me(mSubFrm(i)).Visible = True                   'Двигаем не пустые
            Me(mSubFrm(i)).Top = topCur + delta
            Me(mLblSub(i)).Top = Me(mSubFrm(i)).Top - hLbl  'Двигаем подписи к подформам   
            topCur = Me(mSubFrm(i)).Top + Me(mSubFrm(i)).Height
        End If
    Next
End Sub
Выполнение процедуры надо ставить в код после выполнения запроса.
1
4 / 1 / 0
Регистрация: 01.03.2016
Сообщений: 17
14.04.2016, 10:22  [ТС] 3
Спасибо! Да, подписи есть. Код работает, если результат поиска выводит только одну подформу.
Если более одной, то между подформами образеутся расстояние = delta.
Если непустые подформы идут подряд, то вытелает с ошибкой, что не может разместить элемент в указанном месте, видимо из-за того, что между подформами двойное растояние - нижняя соседняя подформа "наслаивается" на верхнюю

Добавил
Код
...
 If Me(mSubFrm(i)).Form.Recordset.EOF Then           'Проверка на наличие записей в подформе
            Me(mSubFrm(i)).Visible = False                  'Скрываем пустые
            Me(mLblSub(i)).Visible = False 
        Else
            Me(mSubFrm(i)).Visible = True                   'Двигаем не пустые
            Me(mLblSub(i)).Visible = True
...
образуется "лишняя" пустота высотой = delta, высоту подписи не учитывает при этом.

Добавлено через 11 минут
Странно, добился результата уменьшением delta Было delta = 2943, top1 = 878, hLbl = 285.
Поствил delta = 380 и всё отлично!
mobile, благодарю!

Добавлено через 12 минут
Выходит что надо разделить на кол/во подформ. Вряд-ли это совпадение
1
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
14.04.2016, 10:52 4
Замечательно, что Вы сами довели до "ума". Но на всякий случай даю пример с 4-мя подформами. Флажками можно "опустошить"/"наполнить" данными подформы. По кнопке они сдвигаются. Топ самой верхней подформы находится в процедуре загрузки главной формы
Вложения
Тип файла: rar Перемещение пустых подформ.rar (27.7 Кб, 21 просмотров)
1
4 / 1 / 0
Регистрация: 01.03.2016
Сообщений: 17
14.04.2016, 12:09  [ТС] 5
Спасибо за пример! Ну, "до ума" - это громко сказано, возиться с готовым кодом намного проще, чем с нуля писать.

В этой же форме сделал нажатие кнопки "искать" по Enter, когда фокус в поле ввода.
Код
Public Sub fld_srch_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
Me.Кнопка3.SetFocus
SendKeys "{Enter}"
End If
End Sub
Это правильно?
0
14.04.2016, 12:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2016, 12:09
Помогаю со студенческими работами здесь

Динамическое создание подчиненных форм
Доброго времени суток, Посоветуйте хорошую книгу, дабы разобраться с классами в Access. Стоит...

Проверка на заполнение подчинённых форм
Здравствуйте подскажите, пожалуйста, как можно - при записи нового фильма в форме "Просмотр и...

Обновление и связь подчиненных форм
Ребят, нуждаюсь в скорой помощи.. 1) Связь подчиненной формы, со своей подчиненной формой. По ID...

Сумма полей подчиненных форм
В поле выводится надпись "#Имя?". Все названия верно написаны. В чем может быть проблема?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru