Страница 1 из 1

Access, как изменить размер формы?

Добавлено: 21 май 2005, 22:20
KSA
В форму вписана другая форма, которая, в свою очередь, отображена как таблица. Хочу сделать так, чтобы при изменении размеров внешней формы, за ней следовала и внутренняя. Т.е., наверху внешней различные управляющие кнопки и поля расположить, а чтобы все оставшееся снизу пространство занимала таблица второй формы.

У форм есть свойства Width и Height. Но, когда поставил их в обработчик Resize, то выяснилось, что они содержат постоянные значения первоначального размера формы при загрузке. Пробовал WindowWidth и WnidowHeight. Они действительно отслеживали текущую ширину и высоту, но их нельзя было изменть (записать) для внутренней формы - возникала ошибка попытки записи в свойство только для четния. Хотя в хелпе они описаны как R/W.

Как же поступить?
Может, описать заголовки функций из библиотеки API, и обращаться к ним напрямую? Или есть цивилизованный способ?

Добавлено: 23 июл 2005, 18:10
Naeel Maqsudov
1) Width и WindowWidth используют разные единицы измерения. Пересчитывать не просто - все завязано на разрешающую способность устройства.
У форм есть свойства Width и Height. Но, когда поставил их в обработчик Resize, то выяснилось
2) Форма состоит из окна внутри которого лежат секции (заголовок формы, область данных, примечание формы). У каждой секции есть высота (Me.Section(i).Height), а Me.Width - это не шиина формы, а ширина всех секций (так как все секции имеют одинаковую ширину).

3) Окно формы, и совокупность секций живут каждый своей жизнью. Но окно с помошью полос прокрутки позволяет просматривать всю совокупность секций. Если у секции CanGrow=true, то при увеличении размера контрола (например подчиненной формы) увеличится и размер секции. Как работает CanShrink - не проверял. Есть подозрение, что сама собой секция не уменьшится.

4) Итак, для решения задачи надо
а) пересчитывать пиксели в координаты форм и отчетов Access (скорее всего в VBA есть функция для этого)
b) изменять и размер контрола, и размер секции (по крайней мере при уменьшении размера). Причем надо помнить, что порядок действий важен. Так при уменьшении надо сначала уменьшить контролы, а потом секцию, а не наоборот. Так как иначе секция уменьшится на другую (меньшую) величину. (хотя тут надо проверить CanShrink...)

Если будет время попробую сделать пример, но не обещаю. Попробуйте сами.

Добавлено: 23 июл 2005, 18:13
Naeel Maqsudov
(хотя тут надо проверить CanShrink...)
Не надо.
Используется при переоткрытии и перед печатью (см Хелп).

Добавлено: 23 июл 2005, 18:19
Naeel Maqsudov
(скорее всего в VBA есть функция для этого)
Скорее всего функции нет. Нашел вот что:
In Visual Basic, use a numeric expression to set the value of this property. Values are expressed in twips (Твип. Единица измерения, равная 1/20 пункта или 1/1440 дюйма. В одном сантиметре содержится 567 твипов.).

Добавлено: 23 июл 2005, 18:32
Naeel Maqsudov
Эврика! На самом деле оказывается все измеряется в твипсах.
Был не прав...

Вот код: :)

Код: Выделить всё

Private Sub Form_Resize()
 Me.Form1.Width = Me.WindowWidth - 1800
 Me.Width = Me.Form1.Left + Me.Form1.Width
 Me.Form1.Height = Me.WindowHeight - 1800
 Me.Section(acDetail).Height = Me.Form1.Top + Me.Form1.Height + 80
End Sub